Coverage Report

Created: 2026-04-10 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rdkit/Code/GraphMol/AtomIterators.h
Line
Count
Source
1
//
2
//  Copyright (C) 2002-2006 Greg Landrum and Rational Discovery LLC
3
//
4
//   @@ All Rights Reserved @@
5
//  This file is part of the RDKit.
6
//  The contents are covered by the terms of the BSD license
7
//  which is included in the file license.txt, found at the root
8
//  of the RDKit source tree.
9
//
10
/*! \file AtomIterators.h
11
12
  \brief various tools for iterating over a molecule's Atoms.
13
14
   <b>WARNING:</b> If you go changing the molecule underneath one of
15
   these iterators you will be sad...
16
*/
17
#include <RDGeneral/export.h>
18
#ifndef __RD_ATOM_ITERATORS_H__
19
#define __RD_ATOM_ITERATORS_H__
20
21
#ifdef _MSC_VER
22
#pragma warning(disable : 4661)  // no suitable definition provided for explicit
23
                                 // template instantiation request
24
#endif
25
26
namespace RDKit {
27
class QueryAtom;
28
29
//! A general random access iterator
30
template <class Atom_, class Mol_>
31
class RDKIT_GRAPHMOL_EXPORT AtomIterator_ {
32
 public:
33
  typedef AtomIterator_<Atom_, Mol_> ThisType;
34
0
  AtomIterator_() : _mol(nullptr) {}
Unexecuted instantiation: RDKit::AtomIterator_<RDKit::Atom const, RDKit::ROMol const>::AtomIterator_()
Unexecuted instantiation: RDKit::AtomIterator_<RDKit::Atom, RDKit::ROMol>::AtomIterator_()
35
  AtomIterator_(Mol_ *mol);
36
  AtomIterator_(Mol_ *mol, int pos);
37
  AtomIterator_(const ThisType &other);
38
  AtomIterator_ &operator=(const ThisType &other);
39
  AtomIterator_ &operator+=(int val);
40
  AtomIterator_ &operator-=(int val);
41
  AtomIterator_ operator+(int val) const;
42
  AtomIterator_ operator-(int val) const;
43
44
  // iterator subtraction
45
  int operator-(ThisType &other) const;
46
47
  // dereference
48
  Atom_ *operator*() const;
49
  // random access
50
  Atom_ *operator[](const int which) const;
51
  bool operator==(const ThisType &other) const;
52
  bool operator!=(const ThisType &other) const;
53
  bool operator<(const ThisType &other) const;
54
  bool operator<=(const ThisType &other) const;
55
  bool operator>(const ThisType &other) const;
56
  bool operator>=(const ThisType &other) const;
57
58
  // pre-increment
59
  ThisType &operator++();
60
  ThisType operator++(int);
61
62
  // pre-decrement
63
  ThisType &operator--();
64
  ThisType operator--(int);
65
66
 private:
67
  int _pos{-1};
68
  int _max{-1};
69
  Mol_ *_mol;
70
};
71
72
//! Iterate over heteroatoms, this is bidirectional
73
template <class Atom_, class Mol_>
74
class RDKIT_GRAPHMOL_EXPORT HeteroatomIterator_ {
75
 public:
76
  typedef HeteroatomIterator_<Atom_, Mol_> ThisType;
77
0
  HeteroatomIterator_() : _mol(nullptr) {}
Unexecuted instantiation: RDKit::HeteroatomIterator_<RDKit::Atom, RDKit::ROMol>::HeteroatomIterator_()
Unexecuted instantiation: RDKit::HeteroatomIterator_<RDKit::Atom const, RDKit::ROMol const>::HeteroatomIterator_()
78
  HeteroatomIterator_(Mol_ *mol);
79
  HeteroatomIterator_(Mol_ *mol, int pos);
80
  ~HeteroatomIterator_();
81
  HeteroatomIterator_(const ThisType &other);
82
  HeteroatomIterator_ &operator=(const ThisType &other);
83
  bool operator==(const ThisType &other) const;
84
  bool operator!=(const ThisType &other) const;
85
86
  Atom_ *operator*() const;
87
88
  // pre-increment
89
  ThisType &operator++();
90
  ThisType operator++(int);
91
92
  // pre-decrement
93
  ThisType &operator--();
94
  ThisType operator--(int);
95
96
 private:
97
  int _end{-1};
98
  int _pos{-1};
99
  Mol_ *_mol;
100
  // FIX: somehow changing the following to a pointer make the regression test
101
  // pass
102
  // QueryAtom _qA;
103
  QueryAtom *_qA;
104
105
  int _findNext(int from);
106
  int _findPrev(int from);
107
};
108
109
//! Iterate over aromatic atoms, this is bidirectional
110
template <class Atom_, class Mol_>
111
class RDKIT_GRAPHMOL_EXPORT AromaticAtomIterator_ {
112
 public:
113
  typedef AromaticAtomIterator_<Atom_, Mol_> ThisType;
114
0
  AromaticAtomIterator_() : _mol(nullptr) {}
Unexecuted instantiation: RDKit::AromaticAtomIterator_<RDKit::Atom, RDKit::ROMol>::AromaticAtomIterator_()
Unexecuted instantiation: RDKit::AromaticAtomIterator_<RDKit::Atom const, RDKit::ROMol const>::AromaticAtomIterator_()
115
  AromaticAtomIterator_(Mol_ *mol);
116
  AromaticAtomIterator_(Mol_ *mol, int pos);
117
  ~AromaticAtomIterator_();
118
  AromaticAtomIterator_(const ThisType &other);
119
  AromaticAtomIterator_ &operator=(const ThisType &other);
120
  bool operator==(const ThisType &other) const;
121
  bool operator!=(const ThisType &other) const;
122
123
  Atom_ *operator*() const;
124
125
  // pre-increment
126
  ThisType &operator++();
127
  ThisType operator++(int);
128
129
  // pre-decrement
130
  ThisType &operator--();
131
  ThisType operator--(int);
132
133
 private:
134
  int _end{-1};
135
  int _pos{-1};
136
  Mol_ *_mol;
137
138
  int _findNext(int from);
139
  int _findPrev(int from);
140
};
141
142
//! Iterate over atoms matching a query. This is bidirectional.
143
template <class Atom_, class Mol_>
144
class RDKIT_GRAPHMOL_EXPORT QueryAtomIterator_ {
145
 public:
146
  typedef QueryAtomIterator_<Atom_, Mol_> ThisType;
147
0
  QueryAtomIterator_() : _mol(nullptr) {}
Unexecuted instantiation: RDKit::QueryAtomIterator_<RDKit::Atom, RDKit::ROMol>::QueryAtomIterator_()
Unexecuted instantiation: RDKit::QueryAtomIterator_<RDKit::Atom const, RDKit::ROMol const>::QueryAtomIterator_()
148
  QueryAtomIterator_(Mol_ *mol, QueryAtom const *what);
149
  QueryAtomIterator_(Mol_ *mol, int pos);
150
  ~QueryAtomIterator_();
151
  QueryAtomIterator_(const ThisType &other);
152
  QueryAtomIterator_ &operator=(const ThisType &other);
153
  bool operator==(const ThisType &other) const;
154
  bool operator!=(const ThisType &other) const;
155
156
  Atom_ *operator*() const;
157
158
  // pre-increment
159
  ThisType &operator++();
160
  ThisType operator++(int);
161
162
  // pre-decrement
163
  ThisType &operator--();
164
  ThisType operator--(int);
165
166
 private:
167
  int _end{-1};
168
  int _pos{-1};
169
  Mol_ *_mol;
170
  QueryAtom *_qA{nullptr};
171
172
  int _findNext(int from);
173
  int _findPrev(int from);
174
};
175
176
//! Iterate over atoms matching a query function. This is bidirectional.
177
template <class Atom_, class Mol_>
178
class RDKIT_GRAPHMOL_EXPORT MatchingAtomIterator_ {
179
 public:
180
  typedef MatchingAtomIterator_<Atom_, Mol_> ThisType;
181
0
  MatchingAtomIterator_() : _mol(nullptr), _qF(nullptr) {}
Unexecuted instantiation: RDKit::MatchingAtomIterator_<RDKit::Atom, RDKit::ROMol>::MatchingAtomIterator_()
Unexecuted instantiation: RDKit::MatchingAtomIterator_<RDKit::Atom const, RDKit::ROMol const>::MatchingAtomIterator_()
182
  MatchingAtomIterator_(Mol_ *mol, bool (*fn)(Atom_ *));
183
  MatchingAtomIterator_(Mol_ *mol, int pos);
184
  ~MatchingAtomIterator_();
185
  MatchingAtomIterator_(const ThisType &other);
186
  MatchingAtomIterator_ &operator=(const ThisType &other);
187
  bool operator==(const ThisType &other) const;
188
  bool operator!=(const ThisType &other) const;
189
190
  Atom_ *operator*() const;
191
192
  // pre-increment
193
  ThisType &operator++();
194
  ThisType operator++(int);
195
196
  // pre-decrement
197
  ThisType &operator--();
198
  ThisType operator--(int);
199
200
 private:
201
  int _end{-1};
202
  int _pos{-1};
203
  Mol_ *_mol;
204
  bool (*_qF)(Atom_ *);
205
206
  int _findNext(int from);
207
  int _findPrev(int from);
208
};
209
210
}  // namespace RDKit
211
212
#endif