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