KeyValue.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: KeyValue.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:46:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: KeyValue.hpp,v 1000.2 2004/06/01 19:46:10 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Robert G. Smith
  35.  *
  36.  * File Description:
  37.  *   CKeyValue represents a key/value pair, where the key is a string
  38.  *   and the value can be a string or a recursive list of key/value pairs.
  39.  *   Values can be retrieved and stored with compound keys (e.g. "view.grapic.color.gene")
  40.  *   to get at deeper levels.
  41.  *
  42.  * Remark:
  43.  *   This code was originally generated by application DATATOOL
  44.  *   using specifications from the data definition file
  45.  *   'plugin.asn'.
  46.  */
  47. #ifndef GUI_PLUGIN_KEYVALUE_HPP
  48. #define GUI_PLUGIN_KEYVALUE_HPP
  49. // generated includes
  50. #include <gui/gui.hpp>
  51. #include <gui/config/KeyValue_.hpp>
  52. #include <algorithm>
  53. // generated classes
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_objects_SCOPE // namespace ncbi::objects::
  56. class NCBI_GUICONFIG_EXPORT CKeyValue : public CKeyValue_Base
  57. {
  58.     typedef CKeyValue_Base Tparent;
  59. public:
  60.     // constructor
  61.     CKeyValue(void);
  62.     explicit CKeyValue(const string& key);
  63.     CKeyValue(const string& key, const string& value);
  64.     
  65.     // destructor
  66.     ~CKeyValue(void);
  67.     // comparator.
  68.     bool KeyMatches(const string& label) const;
  69.     // Merge an other key value object into this one.
  70.     // the other one's values take precedence.
  71.     CKeyValue&  Merge(const CKeyValue& other);
  72.     
  73.     /*
  74.         Find particular values by key.
  75.         An exception is throw if key not found or
  76.          if a string is required and the value at that point 
  77.          is a list of key-value pairs.
  78.         No copying of data is done.
  79.         All of these assume that this val contains keyvals, not str,
  80.          and throw if that is not true.
  81.     */
  82.     
  83.     // Search one level.
  84.     const CKeyValue&    GetKeyvalueByKey1(const string & key) const;
  85.     // search multiple levels with keys like: "label1.label2.label3"
  86.     const CKeyValue&    GetKeyvalueByKey(const string& key, const string& delim = "|") const;
  87.     const string&       GetStringByKey(const string& key, const string& delim = "|") const;
  88.     
  89.     // implementation: Search a list of key/value pairs for a key.
  90.     // return an iterator.
  91.     static TVal::TKeyvals::const_iterator
  92.         s_FindKeyvalueByKey(const string& key, const TVal::TKeyvals& keyvals);
  93.     static TVal::TKeyvals::iterator
  94.         s_FindKeyvalueByKey(const string& key, TVal::TKeyvals& keyvals);
  95.     
  96.     /// Return a list of all the keys in this KeyValue.
  97.     /// use delim to separate parts of a hierachical key 
  98.     /// and append the keys to key_prefix & delim.
  99.     typedef list< string >    TKeyList;
  100.     void    GetAllKeys(TKeyList& key_list, const string& key_prefix, const string& delim ) const;
  101.     
  102.     // Set methods
  103.     
  104.     // implementation: Search a list for a key, add the key if not found.
  105.     // Return the found/added key-value.
  106.     // prevents duplicate keys in lists
  107.     static CKeyValue& s_AddKey(const string & key,
  108.                                TVal::TKeyvals& keyvals);
  109.     
  110.     // search and add multiple levels with keys like: "k1.k2.k3"
  111.     CKeyValue& AddKey(const string& key, const string& delim = "|");
  112.     CKeyValue& AddKeyString(const string& key, const string& value, const string& delim = "|");
  113.     
  114.     // delete the keyval within this CKeyValue that has a particular key.
  115.     // return true if key exists, false otherwise.
  116.     bool    DelKeyval(const string& key, const string& delim = "|");
  117.     
  118. private:
  119.     // Prohibit copy constructor and assignment operator
  120.     CKeyValue(const CKeyValue& value);
  121.     CKeyValue& operator=(const CKeyValue& value);
  122. };
  123. //
  124. // simple functor to check if a key-value pair matches a given key
  125. struct SKeyMatches
  126. {
  127.     SKeyMatches(const string& key) : m_Key(key) {}
  128.     
  129.     bool operator() (const CRef<CKeyValue>& kv) const
  130.     {
  131.         return kv->KeyMatches(m_Key);
  132.     }
  133. private:
  134.     const string& m_Key;
  135. };
  136. /////////////////// CKeyValue inline methods
  137. // constructor
  138. inline
  139. CKeyValue::CKeyValue(void)
  140. {
  141. }
  142. inline
  143. bool CKeyValue::KeyMatches(const string& label) const
  144. {
  145.     if (CanGetKey()) {
  146.         return (GetKey() == label);
  147.     }
  148.     return false;
  149. }
  150. // accessor methods.
  151. inline
  152. CKeyValue::TVal::TKeyvals::const_iterator
  153.  CKeyValue::s_FindKeyvalueByKey(const string& key,
  154.                                 const CKeyValue::TVal::TKeyvals& keyvals)
  155. {
  156.     _ASSERT (!key.empty());
  157.     return find_if(keyvals.begin(), keyvals.end(),SKeyMatches(key));
  158. }
  159. inline
  160. CKeyValue::TVal::TKeyvals::iterator
  161.  CKeyValue::s_FindKeyvalueByKey(const string & key, CKeyValue::TVal::TKeyvals& keyvals)
  162. {
  163.     _ASSERT (!key.empty());
  164.     return find_if(keyvals.begin(), keyvals.end(),SKeyMatches(key));
  165. }
  166. inline
  167. const string& CKeyValue::GetStringByKey(const string & key, const string& delim) const
  168. {
  169.     return GetKeyvalueByKey(key, delim).GetVal().GetStr();
  170. }
  171. // mutator (Set) methods
  172. inline    
  173. CKeyValue& CKeyValue::AddKeyString(const string& key, const string& val, const string& delim)
  174. {
  175.     CKeyValue& kv = AddKey(key, delim);
  176.     kv.SetVal().SetStr(val);
  177.     return kv;
  178. }
  179. /////////////////// end of CKeyValue inline methods
  180. END_objects_SCOPE // namespace ncbi::objects::
  181. END_NCBI_SCOPE
  182. /*
  183. * ===========================================================================
  184. *
  185. * $Log: KeyValue.hpp,v $
  186. * Revision 1000.2  2004/06/01 19:46:10  gouriano
  187. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  188. *
  189. * Revision 1.5  2004/05/03 12:39:54  dicuccio
  190. * Added #include for gui/gui.hpp
  191. *
  192. * Revision 1.4  2004/04/20 14:06:19  rsmith
  193. * add GetAllKeys method.
  194. *
  195. * Revision 1.3  2003/11/21 12:48:32  rsmith
  196. * Add ability to delete entries by key.
  197. *
  198. * Revision 1.2  2003/10/10 19:35:31  dicuccio
  199. * Added export specifiers
  200. *
  201. * Revision 1.1  2003/10/10 17:41:23  rsmith
  202. * moved from gui/plugin to gui/config
  203. *
  204. * Revision 1.7  2003/08/19 18:09:04  rsmith
  205. * add delim argument to AddKey and AddKeyString.
  206. *
  207. * Revision 1.6  2003/08/13 20:37:06  rsmith
  208. * get rid of include of find_if.hpp
  209. *
  210. * Revision 1.5  2003/08/13 20:18:10  rsmith
  211. * Get rid of FindIf, go back to find_if with suitable functor.
  212. *
  213. * Revision 1.4  2003/08/06 13:10:06  dicuccio
  214. * Replaced std::find_if() with FindIf() - work-around for MSVC's broken STL
  215. * implementation (no const_mem_fun1_t<>)
  216. *
  217. * Revision 1.3  2003/08/06 12:24:49  ucko
  218. * +<algorithm> for find_if
  219. *
  220. * Revision 1.2  2003/08/05 19:01:34  rsmith
  221. * change members used in mem_fun to satisfy certain compilers.
  222. *
  223. * Revision 1.1  2003/08/05 17:37:38  rsmith
  224. * Classes to allow saving of plugins configuration values as ASN.1.
  225. *
  226. *
  227. * ===========================================================================
  228. */
  229. #endif // GUI_PLUGIN_KEYVALUE_HPP
  230. /* Original file checksum: lines: 93, chars: 2362, CRC32: 223d218c */