📄 user_object.cpp
字号:
field->SetData().SetObjects() = objects; SetData().push_back(field); return *this;}CUser_object& CUser_object::AddField(const string& label, const list< CRef<CUser_field> >& objects){ CRef<CUser_field> field(new CUser_field()); field->SetLabel().SetStr(label); field->SetNum(objects.size()); field->SetData().SetFields() = objects; SetData().push_back(field); return *this;}// static consts here allow us to use reference countingstatic const string s_ncbi("NCBI");static const string s_expres("experimental_results");static const string s_exp("experiment");static const string s_sage("SAGE");static const string s_tag("tag");static const string s_count("count");// accessors: classify a given user objectCUser_object::ECategory CUser_object::GetCategory(void) const{ if (!IsSetClass() || GetClass() != s_ncbi) { // we fail to recognize non-NCBI classes of user-objects return eCategory_Unknown; } // // experimental results // if (GetType().IsStr() && NStr::CompareNocase(GetType().GetStr(), s_expres) == 0 && GetData().size() == 1) { ITERATE (CUser_object::TData, iter, GetData()) { const CUser_field& field = **iter; const CUser_field::TData& data = field.GetData(); if (data.Which() != CUser_field::TData::e_Object || !field.IsSetLabel() || !field.GetLabel().IsStr() || NStr::CompareNocase(field.GetLabel().GetStr(), s_exp) != 0) { // poorly formed experiment spec return eCategory_Unknown; } } return eCategory_Experiment; } // // unrecognized - catch-all // return eCategory_Unknown;}// sub-category accessors:CUser_object::EExperiment CUser_object::GetExperimentType(void) const{ // check to see if we have an experiment if ( GetCategory() != eCategory_Experiment) { return eExperiment_Unknown; } // we do - so we have one nested user object that contains the // specification of the experimental data const CUser_field& field = *GetData().front(); const CUser_object& obj = field.GetData().GetObject(); if (obj.GetType().IsStr() && NStr::CompareNocase(obj.GetType().GetStr(), s_sage) == 0) { return eExperiment_Sage; } // // catch-all // return eExperiment_Unknown;}// sub-category accessors:const CUser_object& CUser_object::GetExperiment(void) const{ switch (GetExperimentType()) { case eExperiment_Sage: // we have one nested user object that contains the // specification of the experimental data return GetData().front()->GetData().GetObject(); break; case eExperiment_Unknown: default: return *this; }}//// format the type specification fo a given user object//static string s_GetUserObjectType(const CUser_object& obj){ switch (obj.GetCategory()) { case CUser_object::eCategory_Experiment: switch (obj.GetExperimentType()) { case CUser_object::eExperiment_Sage: return "SAGE"; case CUser_object::eExperiment_Unknown: default: return "Experiment"; } break; case CUser_object::eCategory_Unknown: default: break; } return "User";}static string s_GetUserObjectContent(const CUser_object& obj){ switch (obj.GetCategory()) { case CUser_object::eCategory_Experiment: switch (obj.GetExperimentType()) { case CUser_object::eExperiment_Sage: {{ string label; const CUser_object& nested_obj = obj.GetData().front()->GetData().GetObject(); // grab the tag and count fields const CUser_field* tag = NULL; const CUser_field* count = NULL; ITERATE (CUser_object::TData, iter, nested_obj.GetData()) { const CUser_field& field = **iter; if (!field.GetLabel().IsStr()) { continue; } const string& label = field.GetLabel().GetStr(); if (NStr::CompareNocase(label, s_tag) == 0) { tag = &field; } else if (NStr::CompareNocase(label, s_count) == 0) { count = &field; } } if (tag && tag->GetData().IsStr()) { if ( !label.empty() ) { label += " "; } label += s_tag + "=" + tag->GetData().GetStr(); } if (count && count->GetData().IsInt()) { if ( !label.empty() ) { label += " "; } label += s_count + "=" + NStr::IntToString(count->GetData().GetInt()); } return label; }} case CUser_object::eExperiment_Unknown: default: return "[experiment]"; break; } break; case CUser_object::eCategory_Unknown: default: return "[User]"; break; }}//// append a formatted string to a label describing this object//void CUser_object::GetLabel(string* label, ELabelContent mode) const{ // Check the label is not null if (!label) { return; } switch (mode) { case eType: *label += s_GetUserObjectType(*this); break; case eContent: *label += s_GetUserObjectContent(*this); break; case eBoth: *label += s_GetUserObjectType(*this) + ": " + s_GetUserObjectContent(*this); break; }}CUser_object& CUser_object::SetCategory(ECategory category){ Reset(); SetClass(s_ncbi); switch (category) { case eCategory_Experiment: SetType().SetStr(s_expres); {{ CRef<CUser_object> subobj(new CUser_object()); AddField(s_exp, *subobj); SetClass(s_ncbi); return *subobj; }} break; case eCategory_Unknown: default: break; } return *this;}CUser_object& CUser_object::SetExperiment(EExperiment category){ Reset(); SetClass(s_ncbi); switch (category) { case eExperiment_Sage: SetType().SetStr(s_sage); break; case eExperiment_Unknown: default: break; } return *this;}END_objects_SCOPE // namespace ncbi::objects::END_NCBI_SCOPE/** ===========================================================================** $Log: User_object.cpp,v $* Revision 1000.4 2004/06/01 19:32:32 gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.7** Revision 6.7 2004/05/19 17:21:39 gorelenk* Added include of PCH - ncbi_pch.hpp** Revision 6.6 2004/01/20 20:38:09 vasilche* Added required includes.** Revision 6.5 2003/11/21 14:45:01 grichenk* Replaced runtime_error with CException** Revision 6.4 2003/11/14 16:12:45 shomrat* fixed GetLabel so it will append to string and not replace it** Revision 6.3 2003/09/29 15:57:15 dicuccio* Fleshed out CUser_object API. Added function to retrieve fields based on* delimited keys. Added functions to format a CUser_object as a known category* (the only supported category is experiment)** Revision 6.2 2003/06/19 01:05:51 dicuccio* Added interfaces for adding key/value items to a user object as a nested* CUser_field object** Revision 6.1 2002/10/03 17:02:45 clausen* Added GetLabel()*** ===========================================================================*//* Original file checksum: lines: 64, chars: 1893, CRC32: f7a70d1d */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -