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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: PluginArgSet.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:53:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: PluginArgSet.cpp,v 1000.2 2004/06/01 20:53:35 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:  Mike DiCuccio, Denis Vakatov, Anatoliy Kuznetsov
  35.  *
  36.  * File Description:
  37.  *    CPluginArgSet -- defines an interface for collections of plugin arguments
  38.  *
  39.  * Remark:
  40.  *   This code was originally generated by application DATATOOL
  41.  *   using specifications from the data definition file
  42.  *   'plugin.asn'.
  43.  */
  44. // standard includes
  45. #include <ncbi_pch.hpp>
  46. #include <gui/core/plugin_exception.hpp>
  47. // generated includes
  48. #include <gui/plugin/PluginArgSet.hpp>
  49. #include <gui/plugin/PluginArg.hpp>
  50. #include <gui/plugin/PluginValueConstraint.hpp>
  51. // generated classes
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_objects_SCOPE // namespace ncbi::objects::
  54. // destructor
  55. CPluginArgSet::~CPluginArgSet(void)
  56. {
  57. }
  58. //
  59. // indexing operator for accessing arguments based on names
  60. //
  61. const CPluginArg& CPluginArgSet::operator[] (const string& name) const
  62. {
  63.     ITERATE (Tdata, iter, Get()) {
  64.         if ( (*iter)->GetName() == name) {
  65.             return (**iter);
  66.         }
  67.     }
  68.     // not found - we throw
  69.     NCBI_THROW(CPluginException, eInvalidArg,
  70.                "No argument named '" + name + "'");
  71. }
  72. CPluginArg& CPluginArgSet::operator[] (const string& name)
  73. {
  74.     NON_CONST_ITERATE (Tdata, iter, Set()) {
  75.         if ( (*iter)->GetName() == name) {
  76.             return (**iter);
  77.         }
  78.     }
  79.     // not found - we throw
  80.     NCBI_THROW(CPluginException, eInvalidArg,
  81.                "No argument named '" + name + "'");
  82. }
  83. // HasArgument() can be used to tell whether this set of arguments contains an
  84. // argument named 'name'
  85. bool CPluginArgSet::HasArgument(const string& name) const
  86. {
  87.     ITERATE (Tdata, iter, Get()) {
  88.         if ( (*iter)->GetName() == name) {
  89.             return true;
  90.         }
  91.     }
  92.     return false;
  93. }
  94. // add a named argument.  This argument is required, and has no default
  95. // value.  Attempts to access the value without setting the value will
  96. // result in an exception being thrown.
  97. CPluginArg&
  98. CPluginArgSet::AddArgument(const string& name, const string& desc,
  99.                            CPluginArg::EType type,
  100.                            CPluginArg::TData::E_Choice single_or_array)
  101. {
  102.     if (HasArgument(name)) {
  103.         NCBI_THROW(CPluginException, eInvalidArg,
  104.                    string("Argument `") + name + string("' already exists"));
  105.     }
  106.     CRef<CPluginArg> arg(new CPluginArg());
  107.     switch (type) {
  108.     case CPluginArg::eBoolean:
  109.         arg->SetBoolean();
  110.         break;
  111.     case CPluginArg::eInteger:
  112.         arg->SetInteger();
  113.         break;
  114.     case CPluginArg::eDouble:
  115.         arg->SetDouble();
  116.         break;
  117.     case CPluginArg::eString:
  118.         arg->SetString();
  119.         break;
  120.     case CPluginArg::eFile:
  121.         arg->SetFile();
  122.         break;
  123.     case CPluginArg::eDocument:
  124.         arg->SetDocument();
  125.         break;
  126.     case CPluginArg::eObject:
  127.         arg->SetObject();
  128.         break;
  129.     default:
  130.     case CPluginArg::eNotSet:
  131.         NCBI_THROW(CPluginException, eInvalidArg,
  132.                    "Invalid argument type in AddArgument()");
  133.     }
  134.     if (single_or_array == CPluginArg::TData::e_Array) {
  135.         arg->SetList();
  136.     }
  137.     arg->SetName(name);
  138.     arg->SetDesc(desc);
  139.     Set().push_back(arg);
  140.     return *arg;
  141. }
  142. // add a named argument.  This argument is required, and has no default
  143. // value.  Attempts to access the value without setting the value will
  144. // result in an exception being thrown.
  145. CPluginArg&
  146. CPluginArgSet::AddArgument(const string& name, const string& desc,
  147.                            const CTypeInfo* type,
  148.                            CPluginArg::TData::E_Choice single_or_array)
  149. {
  150.     if (HasArgument(name)) {
  151.         NCBI_THROW(CPluginException, eInvalidArg,
  152.                    string("Argument `") + name + string("' already exists"));
  153.     }
  154.     CRef<CPluginArg> arg(new CPluginArg());
  155.     arg->SetObject(type);
  156.     arg->SetName(name);
  157.     arg->SetDesc(desc);
  158.     if (single_or_array == CPluginArg::TData::e_Array) {
  159.         arg->SetList();
  160.     }
  161.     Set().push_back(arg);
  162.     return *arg;
  163. }
  164. // Add a default argument to the set of arguments.  This function creates a
  165. // named argument with a default value of type string.
  166. CPluginArg&
  167. CPluginArgSet::AddDefaultArgument(const string& name, const string& desc,
  168.                                   CPluginArg::EType type,
  169.                                   const string& val)
  170. {
  171.     if (HasArgument(name)) {
  172.         NCBI_THROW(CPluginException, eInvalidArg,
  173.                    string("Argument `") + name + string("' already exists"));
  174.     }
  175.     CRef<CPluginArg> arg(new CPluginArg());
  176.     arg->SetName(name);
  177.     arg->SetDesc(desc);
  178.     arg->SetDefault(true);
  179.     switch (type) {
  180.     case CPluginArg::eInteger:
  181.         arg->SetInteger(NStr::StringToInt(val));
  182.         break;
  183.     case CPluginArg::eBoolean:
  184.         arg->SetBoolean(NStr::StringToBool(val));
  185.         break;
  186.     case CPluginArg::eDouble:
  187.         arg->SetDouble(NStr::StringToDouble(val));
  188.         break;
  189.     case CPluginArg::eString:
  190.         arg->SetString(val);
  191.         break;
  192.     case CPluginArg::eFile:
  193.         arg->SetFile(val);
  194.         break;
  195.     default:
  196.         NCBI_THROW(CPluginException, eInvalidArg,
  197.                    "Attempt to create non-String argument type with "
  198.                    "string default value");
  199.     }
  200.     Set().push_back(arg);
  201.     return *arg;
  202. }
  203. CPluginArg&
  204. CPluginArgSet::AddFlag(const string& name, const string& desc)
  205. {
  206.     return AddArgument(name, desc, CPluginArg::eBoolean);
  207. }
  208. CPluginArg&
  209. CPluginArgSet::AddDefaultFlag(const string& name, const string& desc,
  210.                               bool val)
  211. {
  212.     return AddDefaultArgument(name, desc, CPluginArg::eBoolean,
  213.                               NStr::BoolToString(val));
  214. }
  215. // add an optional argument to the set of arguments.  This supports an
  216. // optional default value argument.  For non-built-in types, the default
  217. // value is ignored.
  218. CPluginArg&
  219. CPluginArgSet::AddOptionalArgument(const string& name, const string& desc,
  220.                                    CPluginArg::EType type,
  221.                                    CPluginArg::TData::E_Choice s_or_a)
  222. {
  223.     if (HasArgument(name)) {
  224.         NCBI_THROW(CPluginException, eInvalidArg,
  225.                    string("Argument `") + name + string("' already exists"));
  226.     }
  227.     CRef<CPluginArg> arg(new CPluginArg());
  228.     switch (type) {
  229.     case CPluginArg::eBoolean:
  230.         arg->SetBoolean();
  231.         break;
  232.     case CPluginArg::eInteger:
  233.         arg->SetInteger();
  234.         break;
  235.     case CPluginArg::eDouble:
  236.         arg->SetDouble();
  237.         break;
  238.     case CPluginArg::eString:
  239.         arg->SetString();
  240.         break;
  241.     case CPluginArg::eFile:
  242.         arg->SetFile();
  243.         break;
  244.     case CPluginArg::eDocument:
  245.         arg->SetDocument();
  246.         break;
  247.     case CPluginArg::eObject:
  248.         arg->SetObject();
  249.         break;
  250.     default:
  251.     case CPluginArg::eNotSet:
  252.         NCBI_THROW(CPluginException, eInvalidArg,
  253.                    "Invalid argument type in AddArgument()");
  254.     }
  255.     arg->SetName(name);
  256.     arg->SetDesc(desc);
  257.     arg->SetOptional(true);
  258.     if (s_or_a == CPluginArg::TData::e_Array) {
  259.         arg->SetList();
  260.     }
  261.     Set().push_back(arg);
  262.     return *arg;
  263. }
  264. CPluginArg&
  265. CPluginArgSet::AddOptionalArgument(const string& name, const string& desc,
  266.                                    const CTypeInfo* info,
  267.                                    CPluginArg::TData::E_Choice s_or_a)
  268. {
  269.     if (HasArgument(name)) {
  270.         NCBI_THROW(CPluginException, eInvalidArg,
  271.                    string("Argument `") + name + string("' already exists"));
  272.     }
  273.     CRef<CPluginArg> arg(new CPluginArg());
  274.     arg->SetName(name);
  275.     arg->SetDesc(desc);
  276.     arg->SetOptional(true);
  277.     arg->SetObject(info);
  278.     if (s_or_a == CPluginArg::TData::e_Array) {
  279.         arg->SetList();
  280.     }
  281.     Set().push_back(arg);
  282.     return *arg;
  283. }
  284. //
  285. // SetConstraint() resets the constraints for a given named argument and adds a
  286. // new argument constraint
  287. //
  288. void CPluginArgSet::SetConstraint(const string& name,
  289.                                   CPluginValueConstraint& constraint)
  290. {
  291.     CPluginArg& arg = (*this)[name];
  292.     arg.SetConstraint().clear();
  293.     arg.SetConstraint().push_back( CRef<CPluginValueConstraint>(&constraint) );
  294. }
  295. //
  296. // AddConstraint() adds a constraint to a named argument
  297. //
  298. void CPluginArgSet::AddConstraint(const string& name,
  299.                                   CPluginValueConstraint& constraint)
  300. {
  301.     CPluginArg& arg = (*this)[name];
  302.     arg.SetConstraint().push_back( CRef<CPluginValueConstraint>(&constraint) );
  303. }
  304. END_objects_SCOPE // namespace ncbi::objects::
  305. END_NCBI_SCOPE
  306. /*
  307.  * ===========================================================================
  308.  *
  309.  * $Log: PluginArgSet.cpp,v $
  310.  * Revision 1000.2  2004/06/01 20:53:35  gouriano
  311.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21
  312.  *
  313.  * Revision 1.21  2004/05/21 22:27:45  gorelenk
  314.  * Added PCH ncbi_pch.hpp
  315.  *
  316.  * Revision 1.20  2004/01/21 14:13:16  dicuccio
  317.  * Added AddFlag() and AddDefaultFlag() - front-ends to AddArgument() and
  318.  * AddDefaultArgument()
  319.  *
  320.  * Revision 1.19  2003/12/16 20:39:47  jcherry
  321.  * Added support for plugin arguments of type file
  322.  *
  323.  * Revision 1.18  2003/10/07 13:36:45  dicuccio
  324.  * Renamed PluginURL* to PluginValue*.  Moved validation code into CPluginUtils
  325.  *
  326.  * Revision 1.17  2003/07/23 19:14:08  dicuccio
  327.  * Moved logic for validating plugin arguments into CPluginUtils.
  328.  *
  329.  * Revision 1.16  2003/07/22 15:30:47  dicuccio
  330.  * Dropped support for CSeqVector as a named type.  Changed to take advantage of
  331.  * new Convert() API
  332.  *
  333.  * Revision 1.15  2003/06/20 14:48:16  dicuccio
  334.  * Revised handling of default arguments - all built-in argument types are now
  335.  * supported
  336.  *
  337.  * Revision 1.14  2003/06/02 16:06:20  dicuccio
  338.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  339.  *     - src/objects/asn2asn --> arc/app/asn2asn
  340.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  341.  *     - src/objects/objmgr --> src/objmgr
  342.  *     - src/objects/util --> src/objmgr/util
  343.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  344.  *     - src/objects/flat --> src/objtools/flat
  345.  *     - src/objects/validator --> src/objtools/validator
  346.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  347.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  348.  * replaces the three libmmdb? libs.
  349.  *
  350.  * Revision 1.13  2003/05/19 13:37:46  dicuccio
  351.  * Moved gui/core/plugin/ --> gui/plugin/
  352.  *
  353.  * Revision 1.12  2003/05/09 16:46:31  dicuccio
  354.  * Added HasArgument() to check for argument existence.  Made sure that all
  355.  * AddArgument() functions will not add two arguments of the same name
  356.  *
  357.  * Revision 1.11  2003/04/30 16:27:15  dicuccio
  358.  * Fixed thinko - forgot to actually set the object type when presented with an
  359.  * object...
  360.  *
  361.  * Revision 1.10  2003/04/30 13:57:06  dicuccio
  362.  * Added interface for specifying multiple constraints for a given argument
  363.  *
  364.  * Revision 1.9  2003/04/29 14:47:34  dicuccio
  365.  * Added validation hook.  Changed management of constraints to match new spec
  366.  *
  367.  * Revision 1.8  2003/04/25 14:14:58  dicuccio
  368.  * Changed optional argument API - allow data model objects as optional
  369.  * arguments using new plugin API; remove old "optional-and-default" notions
  370.  *
  371.  * Revision 1.7  2003/04/24 16:33:03  dicuccio
  372.  * Simplified object type specification.  Added parallel AddArgument() to
  373.  * indicate argument type from CSerialObject
  374.  *
  375.  * Revision 1.6  2003/03/20 19:58:04  dicuccio
  376.  * Added non-const op[] for indexing
  377.  *
  378.  * Revision 1.5  2003/03/10 23:01:18  kuznets
  379.  * iterate -> ITERATE
  380.  *
  381.  * Revision 1.4  2003/03/03 14:50:56  dicuccio
  382.  * Added plugin argument constraints - lower bound, upper bound, range, and
  383.  * member-of-set
  384.  *
  385.  * Revision 1.3  2003/02/26 20:54:12  dicuccio
  386.  * Wrapped insertion of options (multimap) to get around compilation issues in
  387.  * Solaris
  388.  *
  389.  * Revision 1.2  2003/02/26 14:27:28  dicuccio
  390.  * Removed unnecessary _TRACE() statements
  391.  *
  392.  * Revision 1.1  2003/02/24 13:03:17  dicuccio
  393.  * Renamed classes in plugin spec:
  394.  *     CArgSeg --> CPluginArgSet
  395.  *     CArgument --> CPluginArg
  396.  *     CPluginArgs --> CPluginCommand
  397.  *     CPluginCommands --> CPluginCommandSet
  398.  *
  399.  * Revision 1.2  2003/02/21 17:16:53  dicuccio
  400.  * Fixed compilation errors related to changes in plugin architecture
  401.  *
  402.  * Revision 1.1  2003/02/20 19:49:57  dicuccio
  403.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  404.  * over to use new plugin architecture.
  405. *
  406. *
  407. * ===========================================================================
  408. */
  409. /* Original file checksum: lines: 64, chars: 1873, CRC32: 1571727e */