00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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) x
00036 #else
00037 # define UNUSED(x) x
00038 #endif
00039
00040 namespace OpenBabel
00041 {
00042
00043
00044
00045 class OBBase;
00046 class OBConversion;
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
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 }
00177 enum DataOrigin {
00178 any,
00179 fileformatInput,
00180 userInput,
00181 perceived,
00182 external,
00183 local
00184 };
00185
00187
00188
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
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 virtual OBGenericData* Clone(OBBase* ) const
00211 { return NULL; }
00212 virtual ~OBGenericData() {}
00213
00214
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
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>* ,
00263 OBConversion* )
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)
00280 Clear();
00281 return pOb;
00282 }
00283
00286
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 }
00345
00346 #endif // OB_BASE_H
00347