base.h Source File

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files
- Examples

- File List
- File Members

base.h
Go to the documentation of this file.

    00001 /**********************************************************************
    00002 base.h - Base class for OpenBabel objects
    00003
    00004 Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc.
    00005 Some portions Copyright (C) 2001-2006 by Geoffrey R. Hutchison
    00006
    00007 This file is part of the Open Babel project.
    00008 For more information, see <http://openbabel.org/>
    00009
    00010 This program is free software; you can redistribute it and/or modify
    00011 it under the terms of the GNU General Public License as published by
    00012 the Free Software Foundation version 2 of the License.
    00013
    00014 This program is distributed in the hope that it will be useful,
    00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
    00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00017 GNU General Public License for more details.
    00018 ***********************************************************************/
    00019
    00020 #ifndef OB_BASE_H
    00021 #define OB_BASE_H
    00022
    00023 #include <openbabel/babelconfig.h>
    00024
    00025 #include <vector>
    00026 #include <map>
    00027 #include <string>
    00028 #include <iostream>
    00029 #include <openbabel/tokenst.h>
    00030
    00031 #ifdef UNUSED
    00032 #elif (__GNUC__ == 4)
    00033 # define UNUSED(x) UNUSED_ ## x __attribute__((unused))
    00034 #elif defined(__LCLINT__)
    00035 # define UNUSED(x) /*@unused@*/ x
    00036 #else
    00037 # define UNUSED(x) x
    00038 #endif
    00039
    00040 namespace OpenBabel
    00041 {
    00042
    00043   //Forward declaration of the base class for OBMol OBReaction, OBAtom, etc.
    00044   //Declaration later in this file.
    00045 class OBBase;
    00046 class OBConversion; //used only as pointer
    00047
    00049   OBAPI std::string OBReleaseVersion();
    00050
    00062   namespace OBGenericDataType
    00063   {
    00064     enum
    00065     {
    00067       UndefinedData =      0,
    00068
    00070       PairData      =      1,
    00071
    00073       EnergyData    =      2,
    00074
    00076       CommentData   =      3,
    00077
    00079       ConformerData =      4,
    00080
    00082       ExternalBondData =   5,
    00083
    00085       RotamerList =        6,
    00086
    00088       VirtualBondData =    7,
    00089
    00091       RingData =           8,
    00092
    00094       TorsionData =        9,
    00095
    00097       AngleData =         10,
    00098
    00100       SerialNums =        11,
    00101
    00103       UnitCell =          12,
    00104
    00106       SpinData =          13,
    00107
    00109       ChargeData =        14,
    00110
    00112       SymmetryData =      15,
    00113
    00115       ChiralData =        16,
    00116
    00118       OccupationData =    17,
    00119
    00121       DensityData =       18,
    00122
    00124       ElectronicData =    19,
    00125
    00127       VibrationData =     20,
    00128
    00130       RotationData =      21,
    00131
    00133       NuclearData =       22,
    00134
    00136       SetData =           23,
    00137
    00139       GridData =          24,
    00140
    00142       VectorData =        25,
    00143
    00145       MatrixData =        26,
    00146
    00148       StereoData =        27,
    00149
    00151       DOSData =           28,
    00152
    00154       ElectronicTransitionData = 29,
    00155
    00156       // space for up to 2^14 more entries...
    00157
    00159       CustomData0 = 16384,
    00160       CustomData1 = 16385,
    00161       CustomData2 = 16386,
    00162       CustomData3 = 16387,
    00163       CustomData4 = 16388,
    00164       CustomData5 = 16389,
    00165       CustomData6 = 16390,
    00166       CustomData7 = 16391,
    00167       CustomData8 = 16392,
    00168       CustomData9 = 16393,
    00169       CustomData10 = 16394,
    00170       CustomData11 = 16395,
    00171       CustomData12 = 16396,
    00172       CustomData13 = 16397,
    00173       CustomData14 = 16398,
    00174       CustomData15 = 16399
    00175     };
    00176   } // end namespace
    00177   enum DataOrigin {
    00178     any,
    00179     fileformatInput,
    00180     userInput,
    00181     perceived,
    00182     external,
    00183     local
    00184   };
    00185
    00187   // Class introduction in generic.cpp
    00188   // This base class declaration  has no dependence on mol.h
    00189   class OBAPI OBGenericData
    00190   {
    00191   protected:
    00192     std::string  _attr;
    00193     unsigned int _type;
    00194     DataOrigin   _source;
    00195   public:
    00196     OBGenericData(const std::string attr = "undefined",
    00197                   const unsigned int type =  OBGenericDataType::UndefinedData,
    00198                   const DataOrigin source = any);
    00199     //Use default copy constructor and assignment operators
    00200     //OBGenericData(const OBGenericData&);
    00201
    00202     /* Virtual constructors added. see
    00203        http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.5
    00204        to allow copying given only a base class OBGenericData pointer.
    00205        It may be necessary to cast the return pointer to the derived class
    00206        type, since we are doing without Covariant Return Types
    00207        http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8
    00208
    00209        A derived class may return NULL if copying is inappropriate */
    00210     virtual OBGenericData* Clone(OBBase* /*parent*/) const
    00211     { return NULL; }
    00212     virtual ~OBGenericData()    {}
    00213     //Use default copy constructor and assignment operators
    00214     //OBGenericData& operator=(const OBGenericData &src);
    00215
    00217     void                      SetAttribute(const std::string &v)
    00218     {        _attr = v;        }
    00220     void SetOrigin(const DataOrigin s) { _source = s; }
    00222     virtual const std::string &GetAttribute()  const
    00223     {        return(_attr);    }
    00225     unsigned int                GetDataType()    const
    00226     {        return(_type);    }
    00229     virtual const std::string &GetValue()  const
    00230     {                   return _attr; }
    00231     virtual DataOrigin GetOrigin() const
    00232     {     return _source; }
    00233   };
    00234
    00236   typedef std::vector<OBGenericData*>::iterator OBDataIterator;
    00237
    00239   // introduction in base.cpp
    00240   class OBAPI OBBase
    00241     {
    00242     public:
    00243       virtual ~OBBase()
    00244         {
    00245           if (!_vdata.empty())
    00246             {
    00247               std::vector<OBGenericData*>::iterator m;
    00248               for (m = _vdata.begin();m != _vdata.end();m++)
    00249                 delete *m;
    00250               _vdata.clear();
    00251             }
    00252         }
    00253
    00255       virtual bool Clear();
    00256
    00262       virtual OBBase* DoTransformations(const std::map<std::string,std::string>* /*pOptions*/,
    00263                                         OBConversion* /*pConv*/)
    00264         {
    00265           return this;
    00266         }
    00267
    00269       static const char* ClassDescription()
    00270         {
    00271           return "";
    00272         }
    00273
    00275       template< class T >
    00276       T* CastAndClear(bool clear=true)
    00277         {
    00278           T* pOb = dynamic_cast<T*>(this);
    00279           if(pOb && clear)// Clear only if this is of target class
    00280             Clear();
    00281           return pOb;
    00282         }
    00283
    00286       //Currently no title data member in base class.
    00287       virtual const char  *GetTitle(bool UNUSED(replaceNewlines) = true) const { return "";}
    00288       virtual void  SetTitle(const char *) {}
    00289
    00291
    00292
    00293       bool                              HasData(const std::string &);
    00295       bool                              HasData(const char *);
    00297       bool                              HasData(const unsigned int type);
    00299       void                              DeleteData(unsigned int type);
    00301       void                              DeleteData(OBGenericData*);
    00303       void                              DeleteData(std::vector<OBGenericData*>&);
    00305       bool                              DeleteData(const std::string& s);
    00307       void                              SetData(OBGenericData *d)
    00308         {
    00309           if(d) _vdata.push_back(d);
    00310         }
    00313       void                              CloneData(OBGenericData *d);
    00315       size_t                      DataSize() const
    00316         { return(_vdata.size()); }
    00319       OBGenericData                    *GetData(const unsigned int type);
    00321       OBGenericData                    *GetData(const std::string&);
    00323       OBGenericData                    *GetData(const char *);
    00327       std::vector<OBGenericData*>       GetAllData(const unsigned int type);
    00329       std::vector<OBGenericData*>      &GetData() { return(_vdata); }
    00331       std::vector<OBGenericData*>      GetData(DataOrigin source);
    00333       OBDataIterator  BeginData()
    00334         { return(_vdata.begin());        }
    00336       OBDataIterator  EndData()
    00337         { return(_vdata.end());          }
    00339     protected:
    00340       std::vector<OBGenericData*> _vdata;
    00341
    00342     };
    00343
    00344 } //namespace OpenBabel
    00345
    00346 #endif // OB_BASE_H
    00347

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines