pluginconfigvalues.cpp
来自「ncbi源码」· C++ 代码 · 共 310 行
CPP
310 行
/* * =========================================================================== * PRODUCTION $Log: PluginConfigValues.cpp,v $ * PRODUCTION Revision 1000.2 2004/06/01 20:43:00 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * PRODUCTION * =========================================================================== *//* $Id: PluginConfigValues.cpp,v 1000.2 2004/06/01 20:43:00 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Robert G. Smith * * File Description: * CPluginConfigValues represents one named set of key/value pairs * used to configure a plugin. It is identified by its 'item' and 'style' strings. * It is intended that 'item' would refer to the type of the data and 'style' * to particular saved data values. i.e. all those CPluginConfigValues that have * the same 'item' would have the same 'key's and structure in their 'keyvals'. * * The values and in the key/value pairs can be strings or recursive lists of * key/value pairs. Values at nested levels can be accessed and modified by * using compound keys (e.g. "algo.blast.database"). * * Remark: * This code was originally generated by application DATATOOL * using specifications from the data definition file * 'plugin.asn'. */// standard includes// generated includes#include <ncbi_pch.hpp>#include <gui/config/PluginConfigValues.hpp>#include <gui/config/KeyValue.hpp>#include <gui/config/PluginConfigID.hpp>// generated classesBEGIN_NCBI_SCOPEBEGIN_objects_SCOPE // namespace ncbi::objects:://// simple functor to check if a type matches a given value//struct SConfigIdTypeMatches{ SConfigIdTypeMatches(const string& val) : m_Key(val) {} bool operator() (const CRef<CPluginConfigID>& cid) const { return cid->TypeMatches(m_Key); }private: const string& m_Key;};// destructorCPluginConfigValues::~CPluginConfigValues(void){}// merge the other_pcv with this one, over writing values in this one// when the key is the same.CPluginConfigValues& CPluginConfigValues::Merge(const CPluginConfigValues& other_pcv){ // we do not over write the key fields, the type and style. // usually this will be called with the PCVs with the same key fields. if (this == &other_pcv) return *this; /* // TODO? merge refer-to based on a paramter. // make optional refer-to-style the same as in our argument. if (other_pcv.CanGetRefer_to_style()) { SetRefer_to_style(other_pcv.GetRefer_to_style()); } else if (! other_pcv.IsSetRefer_to_style()) { ResetRefer_to_style(); }*/ if (other_pcv.CanGetByKey()) { const TData::TKeyvals& other_data = other_pcv.GetData().GetKeyvals(); ITERATE(TData::TKeyvals, other_kv_it, other_data) { const CKeyValue& other_kv = **other_kv_it; if (other_kv.CanGetKey()) { CKeyValue& my_kv = AddKey(other_kv.GetKey()); my_kv.Merge(other_kv); } } } else if (other_pcv.CanGetByType()) { const TData::TInclude& other_data = other_pcv.GetData().GetInclude(); ITERATE(TData::TInclude, other_id_it, other_data) { AddPCId(**other_id_it); } } return *this;} // Given a key of type: "label.label2.label3"// search our nested hierarchy of key-value pairs and return the pair that corresponds.const CKeyValue& CPluginConfigValues::GetKeyvalueByKey(const string & key, const string& delim) const{ // Split the key into the part before the first delimiter and the part after. string key1, key2; NStr::SplitInTwo(key, delim, key1, key2); _ASSERT( ! key1.empty()); // no empty key parts. // using the first part of the key, find the key/value pair that corresponds. const CKeyValue::C_Val::TKeyvals& keyvals = GetData().GetKeyvals(); CKeyValue::C_Val::TKeyvals::const_iterator kv_it = CKeyValue::s_FindKeyvalueByKey(key1, keyvals); if (kv_it == keyvals.end()) ThrowUnassigned(1); const CKeyValue& keyvalue = **kv_it; // more key? Tell the key/value to look deeper within. if ( ! key2.empty()) { return keyvalue.GetKeyvalueByKey(key2, delim); } return keyvalue;}const CPluginConfigID& CPluginConfigValues::GetPCIdByType(const string& type) const{ // _ASSERT(CanGetByType()); const TData::TInclude& pcIds = GetData().GetInclude(); TData::TInclude::const_iterator pcId_it = find_if(pcIds.begin(), pcIds.end(), SConfigIdTypeMatches(type)); if (pcId_it == pcIds.end()) { ThrowUnassigned(1); } return **pcId_it; }/// Return a list of all the keys or types in this PCC./// use delim to separate parts of a hierachical key void CPluginConfigValues::GetAllKeys(CKeyValue::TKeyList& key_list, const string& delim ) const{ if (CanGetData()) { if (GetData().IsKeyvals()) { ITERATE(TData::TKeyvals, kv_it, GetData().GetKeyvals()) { (*kv_it)->GetAllKeys(key_list, kEmptyStr, delim); } } else if (GetData().IsInclude()) { ITERATE(TData::TInclude, incl_it, GetData().GetInclude()) { const CPluginConfigID &pcid = **incl_it; if (pcid.CanGetType()) { key_list.push_back(pcid.GetType()); } } } }}CKeyValue& CPluginConfigValues::AddKey(const string& key, const string& delim){ // Split the key into the part before the first delimiter and the part after. string key1, key2; NStr::SplitInTwo(key, delim, key1, key2); _ASSERT( ! key1.empty()); // no empty key parts. // add the first key to my list of key-values. CKeyValue& keyvalue = CKeyValue::s_AddKey(key1, SetData().SetKeyvals()); if ( ! key2.empty()) { // add the rest of the key to the key-value just added (or found). return keyvalue.AddKey(key2); } return keyvalue;}CPluginConfigID& CPluginConfigValues::AddPCId(const string& type, const string& style){ TData::TInclude& pcIds = SetData().SetInclude(); TData::TInclude::iterator pcId_it = find_if(pcIds.begin(), pcIds.end(), SConfigIdTypeMatches(type)); if (pcId_it == pcIds.end()) { CRef<CPluginConfigID> pcId_new(new CPluginConfigID(type, style)); pcIds.push_back(pcId_new); return *pcId_new; } (*pcId_it)->SetStyle(style); return **pcId_it;}// delete key value pairs.bool CPluginConfigValues::DelKeyval(const string & key, const string& delim){ if ( ! SetData().IsKeyvals()) { // recursion following include's requires PluginConfigCache. return false; } // Split the key into the part before the first delimiter and the part after. string key1, key2; NStr::SplitInTwo(key, delim, key1, key2); _ASSERT( ! key1.empty()); // no empty key parts. // using the first part of the key, find the key/value pair that corresponds. TData::TKeyvals& keyvals = SetData().SetKeyvals(); TData::TKeyvals::iterator kv_it = CKeyValue::s_FindKeyvalueByKey(key1, keyvals); if (kv_it == keyvals.end()) { return false; } // found what we were looking for. Delete it. if ( key2.empty()) { keyvals.erase(kv_it); return true; } // Tell the KeyValue to delete the rest of the key. if ((*kv_it)->DelKeyval(key2, delim)) { // found and deleted. Now, is *kv_it itself empty? if ((*kv_it)->GetVal().GetKeyvals().empty()) { keyvals.erase(kv_it); } return true; } return false;}END_objects_SCOPE // namespace ncbi::objects::END_NCBI_SCOPE/** ===========================================================================** $Log: PluginConfigValues.cpp,v $* Revision 1000.2 2004/06/01 20:43:00 gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4** Revision 1.4 2004/05/21 22:27:39 gorelenk* Added PCH ncbi_pch.hpp** Revision 1.3 2004/04/20 14:06:39 rsmith* add GetAllKeys method.** Revision 1.2 2003/11/21 12:49:12 rsmith* Add ability to delete values by key.** Revision 1.1 2003/10/10 17:43:04 rsmith* moved from gui/plugin to gui/config** Revision 1.7 2003/08/19 18:36:08 rsmith* use SplitInTwo instead of duplicating code.** Revision 1.6 2003/08/19 18:12:05 rsmith* can always add anything. CanAddKeys() and CanAddPCId() only advisory.** Revision 1.5 2003/08/13 20:36:47 rsmith* get rid of include of find_if.hpp** Revision 1.4 2003/08/13 20:24:20 rsmith* Merge method and get rid of FindIf** Revision 1.3 2003/08/06 13:10:31 dicuccio* Replaced std::find_if() with FindIf() - work-around for MSVC's broken STL* implementation (no const_mem_fun1_t<>)** Revision 1.2 2003/08/05 19:01:36 rsmith* change members used in mem_fun to satisfy certain compilers.** Revision 1.1 2003/08/05 17:35:59 rsmith* Classes to allow saving of plugin's configuration values as ASN.1.*** ===========================================================================*//* Original file checksum: lines: 64, chars: 1904, CRC32: 7925bcd */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?