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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: metareg.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/02/12 21:44:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___METAREG__HPP
  10. #define CORELIB___METAREG__HPP
  11. /*  $Id: metareg.hpp,v 1000.1 2004/02/12 21:44:03 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Aaron Ucko
  37.  *
  38.  */
  39. /// @file metareg.hpp
  40. /// CMetaRegistry: Singleton class for loading CRegistry data from
  41. /// files; keeps track of what it loaded from where, for potential
  42. /// reuse.
  43. #include <corelib/ncbimtx.hpp>
  44. #include <corelib/ncbireg.hpp>
  45. BEGIN_NCBI_SCOPE
  46. class NCBI_XNCBI_EXPORT CMetaRegistry
  47. {
  48. public:
  49.     /// Relevant types
  50.     /// General flags
  51.     enum EFlags {
  52.         fPrivate = 0x1, ///< Do not cache, or support automatic saving.
  53.         fDontOwn = 0x2  ///< Do not attempt to delete on destruction.
  54.     };
  55.     typedef int TFlags; ///< Binary OR of "EFlags"
  56.     /// How to treat filenames
  57.     enum ENameStyle {
  58.         eName_AsIs,   ///< Take the specified filename as is
  59.         eName_Ini,    ///< Add .ini, dropping existing extensions as needed
  60.         eName_DotRc,  ///< Transform into .*rc
  61.         /// C Toolkit style; mostly useful with name = "ncbi"
  62. #ifdef NCBI_OS_MSWIN
  63.         eName_RcOrIni = eName_Ini
  64. #else
  65.         eName_RcOrIni = eName_DotRc
  66. #endif
  67.     };
  68.     typedef CNcbiRegistry::TFlags TRegFlags;
  69.     /// m_ActualName is always an absolute path (or empty)
  70.     struct SEntry {
  71.         string         actual_name;
  72.         TFlags         flags;
  73.         TRegFlags      reg_flags;
  74.         CNcbiRegistry* registry;
  75.     };
  76.     static CMetaRegistry& Instance(void);
  77.     /// Load the configuration file "name".
  78.     ///
  79.     /// @param name
  80.     ///   The name of the configuration file to look for.  If it does
  81.     ///   not contain a path, Load() searches in the default path list.
  82.     /// @param style
  83.     ///   How, if at all, to modify "name".
  84.     /// @param flags
  85.     ///   Any relevant options from EFlags above.
  86.     /// @param reg
  87.     ///   Existing registry object to reuse, if non-NULL.  (If it wasn't
  88.     //    empty, automatically causes fPrivate to be set in flags.)
  89.     /// @return
  90.     ///   On success, .actual_name will contain the absolute path to
  91.     ///   the file ultimately loaded, and .registry will point to a
  92.     ///   CNcbiRegistry object containing its contents (owned by this
  93.     ///   class unless fPrivate or fDontOwn was given).
  94.     ///   On failure, .actual_name will be empty and .registry will be
  95.     ///   NULL.
  96.     static SEntry Load(const string&  name,
  97.                        ENameStyle     style     = eName_AsIs,
  98.                        TFlags         flags     = 0,
  99.                        TRegFlags      reg_flags = 0,
  100.                        CNcbiRegistry* reg       = 0);
  101.     /// Accessors for the search path for unqualified names.
  102.     /// By default, the path list contains the following dirs in this order:
  103.     ///    - The current working directory.
  104.     ///    - The directory, if any, given by the environment variable "NCBI".
  105.     ///    - The user's home directory.
  106.     ///    - The directory containing the application, if known
  107.     ///      (requires use of CNcbiApplication)
  108.     typedef vector<string> TSearchPath;
  109.     static const TSearchPath& GetSearchPath(void);
  110.     static       TSearchPath& SetSearchPath(void);
  111.     /// Clears path and substitutes the default search path
  112.     static void GetDefaultSearchPath(TSearchPath& path);
  113. private:
  114.     /// Private functions, mostly non-static implementations of the
  115.     /// public interface.
  116.     CMetaRegistry();
  117.     ~CMetaRegistry();
  118.     /// name0 and style0 are the originally requested name and style
  119.     SEntry x_Load(const string& name,  ENameStyle style,
  120.                   TFlags flags, TRegFlags reg_flags, CNcbiRegistry* reg,
  121.                   const string& name0, ENameStyle style0);
  122.     const TSearchPath& x_GetSearchPath(void) const { return m_SearchPath; }
  123.     TSearchPath&       x_SetSearchPath(void)
  124.         { CMutexGuard GUARD(sm_Mutex); m_Index.clear(); return m_SearchPath; }
  125.     /// Members
  126.     static auto_ptr<CMetaRegistry> sm_Instance;
  127.     DECLARE_CLASS_STATIC_MUTEX(sm_Mutex);
  128.     struct SKey {
  129.         string     requested_name;
  130.         ENameStyle style;
  131.         TFlags     flags;
  132.         TRegFlags  reg_flags;
  133.         SKey(string n, ENameStyle s, TFlags f, TRegFlags rf)
  134.             : requested_name(n), style(s), flags(f), reg_flags(rf) { }
  135.         bool operator <(const SKey& k) const;
  136.     };
  137.     typedef map<SKey, unsigned int> TIndex;
  138.     vector<SEntry> m_Contents;
  139.     TSearchPath    m_SearchPath;
  140.     TIndex         m_Index;
  141.     friend class auto_ptr<CMetaRegistry>;
  142. };
  143. /////////////////////////////////////////////////////////////////////////////
  144. //  IMPLEMENTATION of INLINE functions
  145. /////////////////////////////////////////////////////////////////////////////
  146. inline
  147. CMetaRegistry::SEntry CMetaRegistry::Load(const string& name,
  148.                                           CMetaRegistry::ENameStyle style,
  149.                                           CMetaRegistry::TFlags flags,
  150.                                           CNcbiRegistry::TFlags reg_flags,
  151.                                           CNcbiRegistry* reg)
  152. {
  153.     return Instance().x_Load(name, style, flags, reg_flags, reg, name, style);
  154. }
  155. inline
  156. const CMetaRegistry::TSearchPath& CMetaRegistry::GetSearchPath(void)
  157. {
  158.     return Instance().x_GetSearchPath();
  159. }
  160. inline
  161. CMetaRegistry::TSearchPath& CMetaRegistry::SetSearchPath(void)
  162. {
  163.     return Instance().x_SetSearchPath();
  164. }
  165. inline
  166. CMetaRegistry::CMetaRegistry()
  167. {
  168.     GetDefaultSearchPath(x_SetSearchPath());
  169. }
  170. inline
  171. CMetaRegistry& CMetaRegistry::Instance(void)
  172. {
  173.     if ( !sm_Instance.get() ) {
  174.         CMutexGuard GUARD(sm_Mutex);
  175.         if ( !sm_Instance.get() ) { // check again with the lock to avoid races
  176.             sm_Instance.reset(new CMetaRegistry);
  177.         }
  178.     }
  179.     return *sm_Instance;
  180. }
  181. END_NCBI_SCOPE
  182. /*
  183. * ===========================================================================
  184. *
  185. * $Log: metareg.hpp,v $
  186. * Revision 1000.1  2004/02/12 21:44:03  gouriano
  187. * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.8
  188. *
  189. * Revision 1.8  2003/12/08 18:40:13  ucko
  190. * Use DECLARE_CLASS_STATIC_MUTEX to avoid possible premature locking.
  191. *
  192. * Revision 1.7  2003/09/30 21:05:56  ucko
  193. * Refactored cache to allow flushing of path searches when the search
  194. * path changes.
  195. *
  196. * Revision 1.6  2003/08/18 19:48:28  ucko
  197. * Remove stray comma at end of enum list in EFlags.
  198. *
  199. * Revision 1.5  2003/08/15 03:44:57  ucko
  200. * Add export specifier.
  201. *
  202. * Revision 1.4  2003/08/14 17:37:26  ucko
  203. * +eName_RcOrIni (for .ncbirc / ncbi.ini)
  204. *
  205. * Revision 1.3  2003/08/12 19:01:55  vakatov
  206. * Minor, formal code style amendments
  207. *
  208. * Revision 1.2  2003/08/06 20:25:55  ucko
  209. * Allow Load to take an existing registry to reuse.
  210. *
  211. * Revision 1.1  2003/08/05 19:57:46  ucko
  212. * CMetaRegistry: Singleton class for loading CRegistry data from files;
  213. * keeps track of what it loaded from where, for potential reuse.
  214. *
  215. *
  216. * ===========================================================================
  217. */
  218. #endif  /* CORELIB___METAREG__HPP */