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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbiargs_p.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:08:48  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbiargs_p.hpp,v 1000.0 2003/10/29 15:08:48 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.  * Authors:  Denis Vakatov
  35.  *
  36.  * File Description:
  37.  *   PRIVATE header -- for inclusion by "ncbiargs.cpp" only!
  38.  *   Command-line arguments' processing:
  39.  *      descriptions  -- CArgDescriptions,  CArgDesc
  40.  *      constraints   -- CArgAllow;  CArgAllow_{Strings,Integers,Doubles}
  41.  *      parsed values -- CArgs,             CArgValue
  42.  *      exceptions    -- CArgException, ARG_THROW()
  43.  *
  44.  */
  45. #if !defined(NCBIARGS__CPP)
  46. #  error "PRIVATE header -- for inclusion by ncbiargs.cpp only!"
  47. #endif
  48. /////////////////////////////////////////////////////////////////////////////
  49. /////////////////////////////////////////////////////////////////////////////
  50. //  CArg_***::   classes representing various types of argument value
  51. //
  52. //    CArg_NoValue     : CArgValue
  53. //    CArg_String      : CArgValue
  54. //
  55. //    CArg_Alnum       : CArg_String
  56. //    CArg_Integer     : CArg_String
  57. //    CArg_Double      : CArg_String
  58. //    CArg_Boolean     : CArg_String
  59. //    CArg_InputFile   : CArg_String
  60. //    CArg_OutputFile  : CArg_String
  61. //    
  62. class CArg_NoValue : public CArgValue
  63. {
  64. public:
  65.     CArg_NoValue(const string& name);
  66.     virtual bool HasValue(void) const;
  67.     virtual const string&  AsString (void) const;
  68.     virtual int            AsInteger(void) const;
  69.     virtual double         AsDouble (void) const;
  70.     virtual bool           AsBoolean(void) const;
  71.     virtual CNcbiIstream&  AsInputFile (void) const;
  72.     virtual CNcbiOstream&  AsOutputFile(void) const;
  73.     virtual void           CloseFile   (void) const;
  74. };
  75. class CArg_String : public CArgValue
  76. {
  77. public:
  78.     CArg_String(const string& name, const string& value);
  79.     virtual bool HasValue(void) const;
  80.     virtual const string&  AsString (void) const;
  81.     virtual int            AsInteger(void) const;
  82.     virtual double         AsDouble (void) const;
  83.     virtual bool           AsBoolean(void) const;
  84.     virtual CNcbiIstream&  AsInputFile (void) const;
  85.     virtual CNcbiOstream&  AsOutputFile(void) const;
  86.     virtual void           CloseFile   (void) const;
  87. private:
  88.     // Value of the argument as passed to the constructor ("value")
  89.     string m_String;
  90. };
  91. class CArg_Integer : public CArg_String
  92. {
  93. public:
  94.     CArg_Integer(const string& name, const string& value);
  95.     virtual int AsInteger(void) const;
  96. private:
  97.     int m_Integer;
  98. };
  99. class CArg_Double : public CArg_String
  100. {
  101. public:
  102.     CArg_Double(const string& name, const string& value);
  103.     virtual double AsDouble(void) const;
  104. private:
  105.     double m_Double;
  106. };
  107. class CArg_Boolean : public CArg_String
  108. {
  109. public:
  110.     CArg_Boolean(const string& name, bool value);
  111.     CArg_Boolean(const string& name, const string& value);
  112.     virtual bool AsBoolean(void) const;
  113. private:
  114.     bool m_Boolean;
  115. };
  116. class CArg_InputFile : public CArg_String
  117. {
  118. public:
  119.     CArg_InputFile(const string& name, const string& value,
  120.                    IOS_BASE::openmode  openmode,
  121.                    bool                delay_open);
  122.     virtual ~CArg_InputFile(void);
  123.     virtual CNcbiIstream& AsInputFile(void) const;
  124.     virtual void CloseFile(void) const;
  125. private:
  126.     void x_Open(void) const;
  127.     mutable IOS_BASE::openmode m_OpenMode;
  128.     mutable CNcbiIstream*      m_InputFile;
  129.     mutable bool               m_DeleteFlag;
  130. };
  131. class CArg_OutputFile : public CArg_String
  132. {
  133. public:
  134.     CArg_OutputFile(const string& name, const string& value,
  135.                     IOS_BASE::openmode openmode,
  136.                     bool               delay_open);
  137.     virtual ~CArg_OutputFile(void);
  138.     virtual CNcbiOstream& AsOutputFile(void) const;
  139.     virtual void CloseFile(void) const;
  140. private:
  141.     void x_Open(void) const;
  142.     mutable IOS_BASE::openmode m_OpenMode;
  143.     mutable CNcbiOstream*      m_OutputFile;
  144.     mutable bool               m_DeleteFlag;
  145. };
  146. /////////////////////////////////////////////////////////////////////////////
  147. /////////////////////////////////////////////////////////////////////////////
  148. //  CArgDesc***::   abstract base classes for argument descriptions
  149. //
  150. //    CArgDesc
  151. //
  152. //    CArgDescMandatory  : CArgDesc
  153. //    CArgDescOptional   : virtual CArgDescMandatory
  154. //    CArgDescDefault    : virtual CArgDescOptional
  155. //
  156. //    CArgDescSynopsis
  157. //
  158. class CArgDescMandatory : public CArgDesc
  159. {
  160. public:
  161.     CArgDescMandatory(const string& name, const string& comment,
  162.                       CArgDescriptions::EType  type,
  163.                       CArgDescriptions::TFlags flags);
  164.     virtual ~CArgDescMandatory(void);
  165.     CArgDescriptions::EType  GetType (void) const { return m_Type; }
  166.     CArgDescriptions::TFlags GetFlags(void) const { return m_Flags; }
  167.     virtual string GetUsageSynopsis(bool name_only = false) const = 0;
  168.     virtual string GetUsageCommentAttr(void) const;
  169.     virtual CArgValue* ProcessArgument(const string& value) const;
  170.     virtual CArgValue* ProcessDefault(void) const;
  171.     virtual void SetConstraint(CArgAllow* constraint);
  172.     virtual const CArgAllow* GetConstraint(void) const;
  173. private:
  174.     CArgDescriptions::EType  m_Type;
  175.     CArgDescriptions::TFlags m_Flags;
  176.     CConstRef<CArgAllow>     m_Constraint;
  177. };
  178. class CArgDescOptional : virtual public CArgDescMandatory
  179. {
  180. public:
  181.     CArgDescOptional(const string& name, const string& comment,
  182.                      CArgDescriptions::EType  type,
  183.                      CArgDescriptions::TFlags flags);
  184.     virtual ~CArgDescOptional(void);
  185.     virtual CArgValue* ProcessDefault(void) const;
  186. };
  187. class CArgDescDefault : virtual public CArgDescOptional
  188. {
  189. public:
  190.     CArgDescDefault(const string& name, const string& comment,
  191.                     CArgDescriptions::EType  type,
  192.                     CArgDescriptions::TFlags flags,
  193.                     const string&            default_value);
  194.     virtual ~CArgDescDefault(void);
  195.     const string& GetDefaultValue(void) const { return m_DefaultValue; }
  196.     virtual CArgValue* ProcessDefault(void) const;
  197.     virtual void       VerifyDefault (void) const;
  198. private:
  199.     string m_DefaultValue;
  200. };
  201. class CArgDescSynopsis
  202. {
  203. public:
  204.     CArgDescSynopsis(const string& synopsis);
  205.     const string& GetSynopsis(void) const { return m_Synopsis; }
  206. private:
  207.     string m_Synopsis;
  208. };
  209. /////////////////////////////////////////////////////////////////////////////
  210. /////////////////////////////////////////////////////////////////////////////
  211. //  CArgDesc_***::   classes for argument descriptions
  212. //
  213. //    CArgDesc_Flag    : CArgDesc
  214. //
  215. //    CArgDesc_Pos     : virtual CArgDescMandatory
  216. //    CArgDesc_PosOpt  : virtual CArgDescOptional, CArgDesc_Pos
  217. //    CArgDesc_PosDef  :         CArgDescDefault,  CArgDesc_PosOpt
  218. //
  219. //    CArgDescSynopsis
  220. //
  221. //    CArgDesc_Key     : CArgDesc_Pos,    CArgDescSynopsis
  222. //    CArgDesc_KeyOpt  : CArgDesc_PosOpt, CArgDescSynopsis
  223. //    CArgDesc_KeyDef  : CArgDesc_PosDef, CArgDescSynopsis
  224. //
  225. class CArgDesc_Flag : public CArgDesc
  226. {
  227. public:
  228.     CArgDesc_Flag(const string& name, const string& comment,
  229.                   bool set_value = true);
  230.     virtual ~CArgDesc_Flag(void);
  231.     virtual string GetUsageSynopsis(bool name_only = false) const;
  232.     virtual string GetUsageCommentAttr(void) const;
  233.     virtual CArgValue* ProcessArgument(const string& value) const;
  234.     virtual CArgValue* ProcessDefault(void) const;
  235. private:
  236.     bool m_SetValue;  // value to set if the arg is provided  
  237. };
  238. class CArgDesc_Pos : virtual public CArgDescMandatory
  239. {
  240. public:
  241.     CArgDesc_Pos(const string&            name,
  242.                  const string&            comment,
  243.                  CArgDescriptions::EType  type,
  244.                  CArgDescriptions::TFlags flags);
  245.     virtual ~CArgDesc_Pos(void);
  246.     virtual string GetUsageSynopsis(bool name_only = false) const;
  247. };
  248. class CArgDesc_PosOpt : virtual public CArgDescOptional,
  249.                         public CArgDesc_Pos
  250. {
  251. public:
  252.     CArgDesc_PosOpt(const string&            name,
  253.                     const string&            comment,
  254.                     CArgDescriptions::EType  type,
  255.                     CArgDescriptions::TFlags flags);
  256.     virtual ~CArgDesc_PosOpt(void);
  257. };
  258. class CArgDesc_PosDef : public CArgDescDefault,
  259.                         public CArgDesc_PosOpt
  260. {
  261. public:
  262.     CArgDesc_PosDef(const string&            name,
  263.                     const string&            comment,
  264.                     CArgDescriptions::EType  type,
  265.                     CArgDescriptions::TFlags flags,
  266.                     const string&            default_value);
  267.     virtual ~CArgDesc_PosDef(void);
  268. };
  269. class CArgDesc_Key : public CArgDesc_Pos, public CArgDescSynopsis
  270. {
  271. public:
  272.     CArgDesc_Key(const string&            name,
  273.                  const string&            comment,
  274.                  CArgDescriptions::EType  type,
  275.                  CArgDescriptions::TFlags flags,
  276.                  const string&            synopsis);
  277.     virtual ~CArgDesc_Key(void);
  278.     virtual string GetUsageSynopsis(bool name_only = false) const;
  279. };
  280. class CArgDesc_KeyOpt : public CArgDesc_PosOpt, public CArgDescSynopsis
  281. {
  282. public:
  283.     CArgDesc_KeyOpt(const string&            name,
  284.                     const string&            comment,
  285.                     CArgDescriptions::EType  type,
  286.                     CArgDescriptions::TFlags flags,
  287.                     const string&            synopsis);
  288.     virtual ~CArgDesc_KeyOpt(void);
  289.     virtual string GetUsageSynopsis(bool name_only = false) const;
  290. };
  291. class CArgDesc_KeyDef : public CArgDesc_PosDef, public CArgDescSynopsis
  292. {
  293. public:
  294.     CArgDesc_KeyDef(const string&            name,
  295.                     const string&            comment,
  296.                     CArgDescriptions::EType  type,
  297.                     CArgDescriptions::TFlags flags,
  298.                     const string&            synopsis,
  299.                     const string&            default_value);
  300.     virtual ~CArgDesc_KeyDef(void);
  301.     virtual string GetUsageSynopsis(bool name_only = false) const;
  302. };
  303. /*
  304.  * ===========================================================================
  305.  * $Log: ncbiargs_p.hpp,v $
  306.  * Revision 1000.0  2003/10/29 15:08:48  gouriano
  307.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5
  308.  *
  309.  * Revision 1.5  2002/12/18 22:54:48  dicuccio
  310.  * Shuffled some headers to avoid a potentially serious compiler warning
  311.  * (deletion of incomplete type in Windows).
  312.  *
  313.  * Revision 1.4  2002/07/11 14:18:26  gouriano
  314.  * exceptions replaced by CNcbiException-type ones
  315.  *
  316.  * Revision 1.3  2002/04/11 21:08:01  ivanov
  317.  * CVS log moved to end of the file
  318.  *
  319.  * Revision 1.2  2001/01/22 23:07:15  vakatov
  320.  * CArgValue::AsInteger() to return "int" (rather than "long")
  321.  *
  322.  * Revision 1.1  2000/12/24 00:05:46  vakatov
  323.  * Initial revision
  324.  *
  325.  * ===========================================================================
  326.  */