load过程


  
  
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;
			}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值