71 class IndexListContainer {
73 static const int MAX_INTEGER = 2147483647;
75 using IndexListContainerIterator = std::list<std::pair<int, int>>::iterator;
77 IndexListContainer(
int minIndex = 0,
int maxIndex = MAX_INTEGER) :
79 indexContainer_.push_back(std::make_pair(minIndex, maxIndex));
83 if (indexContainer_.empty()) { std::cerr <<
"" << std::endl; }
87 result = indexContainer_.front().first;
89 if (indexContainer_.front().first == indexContainer_.front().second) {
90 indexContainer_.pop_front();
91 }
else if (indexContainer_.front().first <
92 indexContainer_.front().second) {
93 ++indexContainer_.front().first;
95 std::cerr <<
"" << std::endl;
104 void insert(
int index) {
105 IndexListContainerIterator insertPos = internalInsert(index, index);
114 void insert(
int beginIndex,
int endIndex) {
115 IndexListContainerIterator insertPos =
116 internalInsert(beginIndex, endIndex);
125 if (indices.empty()) {
return; }
127 std::sort(indices.begin(), indices.end());
128 auto last = std::unique(indices.begin(), indices.end());
129 indices.erase(last, indices.end());
131 std::vector<int>::iterator i;
134 beginIndex = indices[0];
136 for (i = indices.begin() + 1; i != indices.end(); ++i) {
137 if (*i != *(i - 1) + 1) {
138 insert(beginIndex, *(i - 1));
144 std::vector<int> getIndicesBefore(
int index) {
145 std::vector<int> result;
146 IndexListContainerIterator i;
148 for (i = indexContainer_.begin(); i != indexContainer_.end(); ++i) {
149 if ((*i).first > index) {
151 indexContainer_.erase(indexContainer_.begin(), i);
153 }
else if ((*i).second < index) {
155 for (
int j = (*i).first; j <= (*i).second; ++j) {
159 }
else if ((*i).first == (*i).second) {
161 result.push_back((*i).first);
162 indexContainer_.erase(indexContainer_.begin(), i);
165 for (
int j = (*i).first; j < index; ++j) {
169 indexContainer_.erase(indexContainer_.begin(), i);
176 int getMaxIndex() {
return maxIndex_; }
179 IndexListContainerIterator internalInsert(
int beginIndex,
int endIndex) {
180 if (beginIndex > endIndex) {
181 std::swap(beginIndex, endIndex);
182 std::cerr <<
"" << std::endl;
185 if (endIndex > maxIndex_) { std::cerr <<
"" << std::endl; }
187 IndexListContainerIterator i = indexContainer_.begin();
188 for (; i != indexContainer_.end(); ++i) {
189 if ((*i).first > endIndex) {
190 indexContainer_.insert(i, std::make_pair(beginIndex, endIndex));
192 }
else if ((*i).second < beginIndex) {
195 std::cerr <<
"" << std::endl;
199 indexContainer_.push_back(std::make_pair(beginIndex, endIndex));
200 return --indexContainer_.end();
203 void merge(IndexListContainerIterator i) {
204 IndexListContainerIterator j;
207 if (i != indexContainer_.begin()) {
210 if (j != indexContainer_.begin() && (*j).second + 1 == (*i).first) {
211 (*i).first = (*j).first;
212 indexContainer_.erase(j);
217 if (i != indexContainer_.end()) {
221 if (j != indexContainer_.end() && (*i).second + 1 == (*j).first) {
222 (*i).second = (*j).second;
223 indexContainer_.erase(j);
229 std::list<std::pair<int, int>> indexContainer_;
239 int getNextAtomIndex() {
return atomIndexContainer_.pop(); }
241 std::vector<int> getAtomIndicesBefore(
int index) {
242 return atomIndexContainer_.getIndicesBefore(index);
245 void releaseAtomIndex(
int index) { atomIndexContainer_.insert(index); }
247 void releaseAtomIndex(
int beginIndex,
int endIndex) {
248 atomIndexContainer_.insert(beginIndex, endIndex);
251 void releaseAtomIndex(std::vector<int> indices) {
252 atomIndexContainer_.insert(indices);
255 int getNextRigidBodyIndex() {
return rigidBodyIndexContainer_.pop(); }
257 std::vector<int> getRigidBodyIndicesBefore(
int index) {
258 return rigidBodyIndexContainer_.getIndicesBefore(index);
261 void releaseRigidBodyIndex(
int index) {
262 rigidBodyIndexContainer_.insert(index);
265 void releaseRigidBodyIndex(
int beginIndex,
int endIndex) {
266 rigidBodyIndexContainer_.insert(beginIndex, endIndex);
269 void releaseRigidBodyIndex(std::vector<int> indices) {
270 rigidBodyIndexContainer_.insert(indices);
273 int getNextCutoffGroupIndex() {
return cutoffGroupIndexContainer_.pop(); }
275 std::vector<int> getCutoffGroupIndicesBefore(
int index) {
276 return cutoffGroupIndexContainer_.getIndicesBefore(index);
279 void releaseCutoffGroupIndex(
int index) {
280 cutoffGroupIndexContainer_.insert(index);
283 void releaseCutoffGroupIndex(
int beginIndex,
int endIndex) {
284 cutoffGroupIndexContainer_.insert(beginIndex, endIndex);
287 void releaseCutoffGroupIndex(std::vector<int> indices) {
288 cutoffGroupIndexContainer_.insert(indices);
291 int getNextBondIndex() {
return bondIndexContainer_.pop(); }
293 std::vector<int> getBondIndicesBefore(
int index) {
294 return bondIndexContainer_.getIndicesBefore(index);
297 void releaseBondIndex(
int index) { bondIndexContainer_.insert(index); }
299 void releaseBondIndex(
int beginIndex,
int endIndex) {
300 bondIndexContainer_.insert(beginIndex, endIndex);
303 void releaseBondIndex(std::vector<int> indices) {
304 bondIndexContainer_.insert(indices);
307 int getNextBendIndex() {
return bendIndexContainer_.pop(); }
309 std::vector<int> getBendIndicesBefore(
int index) {
310 return bendIndexContainer_.getIndicesBefore(index);
313 void releaseBendIndex(
int index) { bendIndexContainer_.insert(index); }
315 void releaseBendIndex(
int beginIndex,
int endIndex) {
316 bendIndexContainer_.insert(beginIndex, endIndex);
319 void releaseBendIndex(std::vector<int> indices) {
320 bendIndexContainer_.insert(indices);
323 int getNextTorsionIndex() {
return torsionIndexContainer_.pop(); }
325 std::vector<int> getTorsionIndicesBefore(
int index) {
326 return torsionIndexContainer_.getIndicesBefore(index);
329 void releaseTorsionIndex(
int index) {
330 torsionIndexContainer_.insert(index);
333 void releaseTorsionIndex(
int beginIndex,
int endIndex) {
334 torsionIndexContainer_.insert(beginIndex, endIndex);
337 void releaseTorsionIndex(std::vector<int> indices) {
338 torsionIndexContainer_.insert(indices);
341 int getNextInversionIndex() {
return inversionIndexContainer_.pop(); }
343 std::vector<int> getInversionIndicesBefore(
int index) {
344 return inversionIndexContainer_.getIndicesBefore(index);
347 void releaseInversionIndex(
int index) {
348 inversionIndexContainer_.insert(index);
351 void releaseInversionIndex(
int beginIndex,
int endIndex) {
352 inversionIndexContainer_.insert(beginIndex, endIndex);
355 void releaseInversionIndex(std::vector<int> indices) {
356 inversionIndexContainer_.insert(indices);