Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef OB_OBITER_H
00021 #define OB_OBITER_H
00022
00023 #include <openbabel/babelconfig.h>
00024 #include <openbabel/base.h>
00025 #include <openbabel/bitvec.h>
00026
00027 #include <vector>
00028 #include <stack>
00029 #include <queue>
00030
00031 namespace OpenBabel
00032 {
00033
00034 class OBMol;
00035 class OBAtom;
00036 class OBBond;
00037 class OBResidue;
00038
00039
00040
00042 class OBAPI OBMolAtomIter {
00043 std::vector<OBAtom*>::iterator _i;
00044 OBMol *_parent;
00045 OBAtom *_ptr;
00046 public:
00047
00048 OBMolAtomIter() :_parent(NULL), _ptr(NULL) { }
00049 OBMolAtomIter(OBMol *mol);
00050 OBMolAtomIter(OBMol &mol);
00051 OBMolAtomIter(const OBMolAtomIter &ai);
00052 ~OBMolAtomIter() { }
00053
00054 OBMolAtomIter& operator=(const OBMolAtomIter &ai);
00056 operator bool() const { return _ptr != NULL; }
00058 OBMolAtomIter& operator++();
00060 OBMolAtomIter operator++(int);
00062 OBAtom* operator->() const { return _ptr; }
00064 OBAtom& operator*() const { return *_ptr; }
00065 };
00066
00068 class OBAPI OBMolAtomDFSIter {
00069 OBMol *_parent;
00070 OBAtom *_ptr;
00071 OBBitVec _notVisited;
00072 std::stack<OBAtom *> _stack;
00073 public:
00074
00075 OBMolAtomDFSIter() : _parent(NULL), _ptr(NULL) { }
00076 OBMolAtomDFSIter(OBMol *mol, int StartIndex=1);
00077 OBMolAtomDFSIter(OBMol &mol, int StartIndex=1);
00078 OBMolAtomDFSIter(const OBMolAtomDFSIter &ai);
00079 ~OBMolAtomDFSIter() { }
00080
00081 OBMolAtomDFSIter& operator=(const OBMolAtomDFSIter &ai);
00083 operator bool() const { return _ptr != NULL; }
00085 OBMolAtomDFSIter& operator++();
00087 OBMolAtomDFSIter operator++(int);
00089 OBAtom* operator->() const { return _ptr; }
00091 OBAtom& operator*() const { return *_ptr; }
00093 OBAtom* next()
00094 {
00095 if(_stack.empty())
00096 return NULL;
00097 else
00098 return _stack.top();
00099 }
00100 };
00101
00103 class OBAPI OBMolAtomBFSIter {
00104 OBMol *_parent;
00105 OBAtom *_ptr;
00106 OBBitVec _notVisited;
00107 std::queue<OBAtom *> _queue;
00108 std::vector<int> _depth;
00109 public:
00110
00111 OBMolAtomBFSIter(): _parent(NULL), _ptr(NULL) { }
00112 OBMolAtomBFSIter(OBMol *mol, int StartIndex = 1);
00113 OBMolAtomBFSIter(OBMol &mol, int StartIndex = 1);
00114 OBMolAtomBFSIter(const OBMolAtomBFSIter &ai);
00115 ~OBMolAtomBFSIter() { }
00116
00117 OBMolAtomBFSIter& operator=(const OBMolAtomBFSIter &ai);
00119 operator bool() const { return _ptr != NULL; }
00121 OBMolAtomBFSIter& operator++();
00123 OBMolAtomBFSIter operator++(int);
00125 OBAtom* operator->() const { return _ptr; }
00127 OBAtom& operator*() const { return *_ptr; }
00130 int CurrentDepth() const;
00131 };
00132
00134 class OBAPI OBMolBondBFSIter {
00135 OBMol *_parent;
00136 OBBond *_ptr;
00137 OBBitVec _notVisited;
00138 std::queue<OBBond *> _queue;
00139 std::vector<int> _depth;
00140 public:
00141
00142 OBMolBondBFSIter(): _parent(NULL), _ptr(NULL) { }
00143 OBMolBondBFSIter(OBMol *mol, int StartIndex = 0);
00144 OBMolBondBFSIter(OBMol &mol, int StartIndex = 0);
00145 OBMolBondBFSIter(const OBMolBondBFSIter &ai);
00146 ~OBMolBondBFSIter() { }
00147
00148 OBMolBondBFSIter& operator=(const OBMolBondBFSIter &ai);
00150 operator bool() const { return _ptr != NULL; }
00152 OBMolBondBFSIter& operator++();
00154 OBMolBondBFSIter operator++(int);
00156 OBBond* operator->() const { return _ptr; }
00158 OBBond& operator*() const { return *_ptr; }
00161 int CurrentDepth() const;
00162 };
00163
00165 class OBAPI OBMolBondIter {
00166 std::vector<OBBond*>::iterator _i;
00167 OBMol *_parent;
00168 OBBond *_ptr;
00169 public:
00170
00171 OBMolBondIter() : _parent(NULL), _ptr(NULL) {}
00172 OBMolBondIter(OBMol *mol);
00173 OBMolBondIter(OBMol &mol);
00174 OBMolBondIter(const OBMolBondIter &bi);
00175 ~OBMolBondIter() { }
00176
00177 OBMolBondIter& operator=(const OBMolBondIter &bi);
00179 operator bool() const { return _ptr != NULL; }
00181 OBMolBondIter& operator++();
00183 OBMolBondIter operator++(int);
00185 OBBond* operator->() const { return _ptr; }
00187 OBBond& operator*() const { return *_ptr; }
00188 };
00189
00191 class OBAPI OBAtomAtomIter {
00192 std::vector<OBBond*>::iterator _i;
00193 OBAtom *_parent;
00194 OBAtom *_ptr;
00195 public:
00196
00197 OBAtomAtomIter() : _parent(NULL), _ptr(NULL) { }
00198 OBAtomAtomIter(OBAtom *atm);
00199 OBAtomAtomIter(OBAtom &atm);
00200 OBAtomAtomIter(const OBAtomAtomIter &ai);
00201 ~OBAtomAtomIter() { }
00202
00203 OBAtomAtomIter& operator=(const OBAtomAtomIter &ai);
00205 operator bool() const { return _ptr != NULL; }
00207 OBAtomAtomIter& operator++();
00209 OBAtomAtomIter operator++(int);
00211 OBAtom* operator->() const { return _ptr; }
00213 OBAtom& operator*() const { return *_ptr; }
00214 };
00215
00217 class OBAPI OBAtomBondIter {
00218 std::vector<OBBond*>::iterator _i;
00219 OBAtom *_parent;
00220 OBBond *_ptr;
00221 public:
00222
00223 OBAtomBondIter(): _parent(NULL), _ptr(NULL) { }
00224 OBAtomBondIter(OBAtom *atm);
00225 OBAtomBondIter(OBAtom &atm);
00226 OBAtomBondIter(const OBAtomBondIter &bi);
00227 ~OBAtomBondIter() { }
00228
00229 OBAtomBondIter& operator=(const OBAtomBondIter &bi);
00231 operator bool() const { return _ptr != NULL; }
00233 OBAtomBondIter& operator++();
00235 OBAtomBondIter operator++(int);
00237 OBBond* operator->() const { return _ptr; }
00239 OBBond& operator*() const { return *_ptr;}
00240 };
00241
00243 class OBAPI OBResidueIter {
00244 std::vector<OBResidue*>::iterator _i;
00245 OBResidue *_ptr;
00246 OBMol *_parent;
00247 public:
00248
00249 OBResidueIter() : _ptr(NULL), _parent(NULL) { }
00250 OBResidueIter(OBMol *mol);
00251 OBResidueIter(OBMol &mol);
00252 OBResidueIter(const OBResidueIter &ri);
00253 ~OBResidueIter() { }
00254
00255 OBResidueIter& operator=(const OBResidueIter &ri);
00257 operator bool() const { return _ptr != NULL; }
00259 OBResidueIter& operator++();
00261 OBResidueIter operator++(int);
00263 OBResidue* operator->() const{ return _ptr; }
00265 OBResidue& operator*() const { return *_ptr;}
00266 };
00267
00269 class OBAPI OBResidueAtomIter {
00270 std::vector<OBAtom*>::iterator _i;
00271 OBResidue *_parent;
00272 OBAtom *_ptr;
00273 public:
00274
00275 OBResidueAtomIter() : _parent(NULL), _ptr(NULL) { }
00276 OBResidueAtomIter(OBResidue *res);
00277 OBResidueAtomIter(OBResidue &res);
00278 OBResidueAtomIter(const OBResidueAtomIter &ri);
00279 ~OBResidueAtomIter() { }
00280
00281 OBResidueAtomIter &operator = (const OBResidueAtomIter &ri);
00283 operator bool() const { return _ptr != NULL; }
00285 OBResidueAtomIter& operator++ ();
00287 OBResidueAtomIter operator++ (int);
00289 OBAtom *operator->() const { return _ptr; }
00291 OBAtom &operator*() const { return *_ptr;}
00292 };
00293
00295 class OBAPI OBMolAngleIter {
00296 OBMol *_parent;
00297 std::vector<std::vector<unsigned int> > _vangle;
00298 std::vector<std::vector<unsigned int> >::iterator _i;
00299 std::vector<unsigned int> _angle;
00300 public:
00301
00302 OBMolAngleIter() :_parent(NULL) { }
00303 OBMolAngleIter(OBMol *mol);
00304 OBMolAngleIter(OBMol &mol);
00305 OBMolAngleIter(const OBMolAngleIter &ai);
00306 ~OBMolAngleIter() { }
00307
00308 OBMolAngleIter& operator=(const OBMolAngleIter &ai);
00310 operator bool() const { return (_i != _vangle.end()); }
00312 OBMolAngleIter& operator++();
00315 std::vector<unsigned int> operator*() const { return _angle; }
00316 };
00317
00319 class OBAPI OBMolTorsionIter {
00320 OBMol *_parent;
00321 std::vector<std::vector<unsigned int> > _vtorsion;
00322 std::vector<std::vector<unsigned int> >::iterator _i;
00323 std::vector<unsigned int> _torsion;
00324 public:
00325
00326 OBMolTorsionIter() :_parent(NULL) { }
00327 OBMolTorsionIter(OBMol *mol);
00328 OBMolTorsionIter(OBMol &mol);
00329 OBMolTorsionIter(const OBMolTorsionIter &ai);
00330 ~OBMolTorsionIter() { }
00331
00332 OBMolTorsionIter& operator=(const OBMolTorsionIter &ai);
00334 operator bool() const { return (_i != _vtorsion.end()); }
00336 OBMolTorsionIter& operator++();
00339 std::vector<unsigned int> operator*() const { return _torsion; }
00340 };
00341
00343 class OBAPI OBMolPairIter {
00344 std::vector<OBAtom*>::iterator _i;
00345 std::vector<OBAtom*>::iterator _j;
00346 OBMol *_parent;
00347
00348
00349 std::vector<unsigned int> _pair;
00350
00351 public:
00352
00353 OBMolPairIter() :_parent(NULL) { }
00354 OBMolPairIter(OBMol *mol);
00355 OBMolPairIter(OBMol &mol);
00356 OBMolPairIter(const OBMolPairIter &ai);
00357 ~OBMolPairIter() { }
00358
00359 OBMolPairIter& operator=(const OBMolPairIter &ai);
00361 operator bool() const { return _pair.size()>0; }
00363 OBMolPairIter& operator++();
00366 std::vector<unsigned int> operator*() const { return _pair; }
00367 };
00368
00369 class OBRing;
00370 class OBRingData;
00371
00373 class OBAPI OBMolRingIter {
00374 std::vector<OBRing*>::iterator _i;
00375 OBRing *_ptr;
00376 OBMol *_parent;
00377 OBRingData *_rings;
00378 public:
00379
00380 OBMolRingIter() : _ptr(NULL), _parent(NULL), _rings(NULL) { }
00381 OBMolRingIter(OBMol *mol);
00382 OBMolRingIter(OBMol &mol);
00383 OBMolRingIter(const OBMolRingIter &ri);
00384 ~OBMolRingIter() { }
00385
00386 OBMolRingIter& operator=(const OBMolRingIter &ri);
00388 operator bool() const { return _ptr != NULL; }
00390 OBMolRingIter& operator++();
00392 OBMolRingIter operator++(int);
00394 OBRing* operator->() const { return _ptr; }
00396 OBRing& operator*() const { return *_ptr;}
00397 };
00398
00399 #define FOR_ATOMS_OF_MOL(a,m) for( OBMolAtomIter a(m); a; ++a )
00400 #define FOR_BONDS_OF_MOL(b,m) for( OBMolBondIter b(m); b; ++b )
00401 #define FOR_NBORS_OF_ATOM(a,p) for( OBAtomAtomIter a(p); a; ++a )
00402 #define FOR_BONDS_OF_ATOM(b,p) for( OBAtomBondIter b(p); b; ++b )
00403 #define FOR_RESIDUES_OF_MOL(r,m) for( OBResidueIter r(m); r; ++r )
00404 #define FOR_ATOMS_OF_RESIDUE(a,r) for( OBResidueAtomIter a(r); a; ++a )
00405 #define FOR_DFS_OF_MOL(a,m) for( OBMolAtomDFSIter a(m); a; ++a )
00406 #define FOR_BFS_OF_MOL(a,m) for( OBMolAtomBFSIter a(m); a; ++a )
00407 #define FOR_BONDBFS_OF_MOL(b,m) for( OBMolBondBFSIter b(m); b; ++b )
00408 #define FOR_RINGS_OF_MOL(r,m) for( OBMolRingIter r(m); r; ++r )
00409 #define FOR_ANGLES_OF_MOL(a,m) for( OBMolAngleIter a(m); a; ++a )
00410 #define FOR_TORSIONS_OF_MOL(t,m) for( OBMolTorsionIter t(m); t; ++t )
00411 #define FOR_PAIRS_OF_MOL(p,m) for( OBMolPairIter p(m); p; ++p )
00412
00413 }
00414 #endif // OB_OBITER_H
00415