load过程

来源:互联网 发布:买淘宝账号 编辑:程序博客网 时间:2024/04/29 06:34
template<typename T> const T&  load_blob_obj_(const blob_info& binfo) const {    XR_PRE_CONDITION(binfo.flag == T::flag);//异常安全
    if(!binfo.cache){//cache是智能指针     auto& seek = m_data_file.get<io::random>();//打开文件     seek.seek(binfo.offset);//     auto source = io::exchange::as_source(m_data_file.get<io::reader>());//反序列化??返回类型没搞明白     unique_ptr<T> b(new T);     load(source, *b, m_xr);     binfo.cache = std::move(b);//b原来是一个智能指针,将其转换为一个右值,同时删除指针    }    return *static_cast<T*>(binfo.cache.get());//获得智能指针保存的地址指针   }
 
//返回的是哈希:掩码(version_type),对应文件内容(blob_info)   const blob_info_map::value_type* try_load_blob_(const version_type& ver) const {    //m_blob_infos是blob_info_map类型,这个类型继承自std::unordered_map<version_type, blob_info, hash_version_type>    //m_blob_infos是LocalRepositoryImp的成员,包含的是掩码和对应文件内容信息    auto pos = m_blob_infos.find(ver);    if (pos == m_blob_infos.end()) return nullptr;    //根据flag信息判断是哪一种数据类型    switch(pos->second.flag){     case bt_tree:      load_blob_obj_<tree_blob>(pos->second);      break;     case bt_submission:      {       auto& subm = load_blob_obj_<Submission>(pos->second);       const_cast<Submission&>(subm).version = ver;      }      break;     case bt_metadata:      load_metadata_(ver);      break;     case bt_file:      // do nothing      break;     default:      XR_THROW(bad_repository_exception)("bad blob info flag");    };
Submission* try_load_submission_(const version_type& ver) const {auto binfo = try_load_blob_(ver);if (binfo && binfo->second.flag == bt_submission)return static_cast<Submission*>(binfo->second.cache.get());return nullptr;}