34template <
class ParticleIterator>
36 iterator.deleteCurrentParticle();
43namespace containerIteratorUtils {
56template <
bool regionIter,
class Particle_T,
class Arr>
58 const Arr ®ionMin,
const Arr ®ionMax) {
62 if constexpr (regionIter) {
71 if (((behavior & IteratorBehavior::ownedOrHaloOrDummy) == IteratorBehavior::ownedOrHaloOrDummy) or
72 (behavior & IteratorBehavior::dummy and p.isDummy())) {
76 return static_cast<unsigned int>(p.getOwnershipState()) &
static_cast<unsigned int>(behavior);
92template <
class Particle_T,
bool modifiable,
bool regionIter>
101 using ParticleType = std::conditional_t<modifiable, Particle_T, const Particle_T>;
105 using ParticleVecType = std::conditional_t<modifiable, std::vector<std::vector<Particle_T> *>,
106 std::vector<std::vector<Particle_T>
const *>>;
110 using ContainerType = std::conditional_t<modifiable, ParticleContainerInterface<Particle_T>,
128 const std::array<double, 3> ®ionMin,
const std::array<double, 3> ®ionMax)
129 :
ContainerIterator(nullptr, container, behavior, additionalVectorsToIterate, regionMin, regionMax) {
131 static_assert(regionIter ==
true,
132 "Constructor for Region iterator called but template argument regionIter is false");
143 :
ContainerIterator(nullptr, container, behavior, additionalVectorsToIterate, {}, {}) {
144 static_assert(regionIter ==
false,
145 "Constructor for non-Region iterator called but template argument regionIter is true");
153 : _container(other._container),
154 _currentParticleIndex(other._currentParticleIndex),
155 _currentVectorIndex(other._currentVectorIndex),
156 _currentParticle(other._currentParticle),
157 _additionalVectors(other._additionalVectors),
158 _behavior(other._behavior),
159 _iteratingAdditionalVectors(other._iteratingAdditionalVectors),
160 _vectorIndexOffset(other._vectorIndexOffset),
161 _regionMin(other._regionMin),
162 _regionMax(other._regionMax) {}
172 _container = other._container;
173 _currentParticleIndex = other._currentParticleIndex;
174 _currentVectorIndex = other._currentVectorIndex;
175 _currentParticle = other._currentParticle;
176 _additionalVectors = other._additionalVectors;
177 _behavior = other._behavior;
178 _iteratingAdditionalVectors = other._iteratingAdditionalVectors;
179 _vectorIndexOffset = other._vectorIndexOffset;
180 if constexpr (regionIter) {
181 _regionMin = other._regionMin;
182 _regionMax = other._regionMax;
193 : _container(other._container),
194 _currentParticleIndex(other._currentParticleIndex),
195 _currentVectorIndex(other._currentVectorIndex),
196 _currentParticle(other._currentParticle),
197 _additionalVectors(std::move(other._additionalVectors)),
198 _behavior(other._behavior),
199 _iteratingAdditionalVectors(other._iteratingAdditionalVectors),
200 _vectorIndexOffset(other._vectorIndexOffset),
201 _regionMin(std::move(other._regionMin)),
202 _regionMax(std::move(other._regionMax)) {}
211 if (
this != &other) {
212 _container = other._container;
213 _currentParticleIndex = other._currentParticleIndex;
214 _currentVectorIndex = other._currentVectorIndex;
215 _currentParticle = other._currentParticle;
216 _additionalVectors = std::move(other._additionalVectors);
217 _behavior = other._behavior;
218 _iteratingAdditionalVectors = other._iteratingAdditionalVectors;
219 _vectorIndexOffset = other._vectorIndexOffset;
220 if constexpr (regionIter) {
221 _regionMin = std::move(other._regionMin);
222 _regionMax = std::move(other._regionMax);
241 ParticleVecType *additionalVectorsToIterate,
const std::array<double, 3> ®ionMin,
242 const std::array<double, 3> ®ionMax)
243 : _container(&container),
246 if (additionalVectorsToIterate) {
248 _additionalVectors.insert(_additionalVectors.end(), additionalVectorsToIterate->begin(),
249 additionalVectorsToIterate->end());
252 if constexpr (regionIter) {
260 fetchParticleAtCurrentIndex();
274 ++_currentParticleIndex;
275 fetchParticleAtCurrentIndex();
295 [[nodiscard]]
bool isValid()
const {
return _currentParticle !=
nullptr; }
313 bool operator!=(
const bool input)
const {
return not(*
this == input); }
320 void fetchParticleAtCurrentIndex() {
321 if (not _iteratingAdditionalVectors) {
323 if constexpr (regionIter) {
324 std::tie(_currentParticle, _currentVectorIndex, _currentParticleIndex) =
325 _container->getParticle(_currentVectorIndex, _currentParticleIndex, _behavior, _regionMin, _regionMax);
327 std::tie(_currentParticle, _currentVectorIndex, _currentParticleIndex) =
328 _container->getParticle(_currentVectorIndex, _currentParticleIndex, _behavior);
331 if (_currentParticle ==
nullptr and not _additionalVectors.empty()) {
334 _currentParticleIndex = 0;
335 _iteratingAdditionalVectors =
true;
342 if (_iteratingAdditionalVectors) {
344 for (; _currentVectorIndex < _additionalVectors.size(); _currentVectorIndex += _vectorIndexOffset) {
346 for (; _currentParticleIndex < _additionalVectors[_currentVectorIndex]->size(); ++_currentParticleIndex) {
347 _currentParticle = &(_additionalVectors[_currentVectorIndex]->operator[](_currentParticleIndex));
349 if (containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(*_currentParticle, _behavior,
350 _regionMin, _regionMax)) {
354 _currentParticleIndex = 0;
358 _currentParticle =
nullptr;
359 _currentParticleIndex = std::numeric_limits<
decltype(_currentParticleIndex)>::max();
360 _currentVectorIndex = std::numeric_limits<
decltype(_currentVectorIndex)>::max();
368 void deleteCurrentParticle() {
369 if (_iteratingAdditionalVectors) {
372 auto ¤tVector = *_additionalVectors[_currentVectorIndex];
374 *_currentParticle = currentVector.back();
375 currentVector.pop_back();
377 if (currentVector.empty() or not containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(
378 *_currentParticle, _behavior, _regionMin, _regionMax)) {
382 const auto indicesValid = _container->deleteParticle(_currentVectorIndex, _currentParticleIndex);
384 if (not indicesValid) {
387 }
else if (not containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(
388 *_currentParticle, _behavior, _regionMin, _regionMax)) {
394 --_currentParticleIndex;
406 size_t _currentParticleIndex{0};
413 size_t _currentVectorIndex{};
429 IteratorBehavior _behavior;
435 bool _iteratingAdditionalVectors{
false};
440 size_t _vectorIndexOffset{};
449 using RegionCornerT = std::conditional_t<regionIter, std::array<double, 3>, empty>;
455 [[no_unique_address]] RegionCornerT _regionMin{};
461 [[no_unique_address]] RegionCornerT _regionMax{};
Public iterator class that iterates over a particle container and additional vectors (which are typic...
Definition: ContainerIterator.h:93
std::conditional_t< modifiable, Particle_T, const Particle_T > ParticleType
Type of the particle this iterator points to.
Definition: ContainerIterator.h:101
ContainerIterator(const ContainerIterator< Particle_T, modifiable, regionIter > &other)
Copy constructor.
Definition: ContainerIterator.h:152
ContainerIterator< Particle_T, modifiable, regionIter > & operator=(ContainerIterator< Particle_T, modifiable, regionIter > &&other) noexcept
Move assignment operator.
Definition: ContainerIterator.h:209
std::conditional_t< modifiable, ParticleContainerInterface< Particle_T >, const ParticleContainerInterface< Particle_T > > ContainerType
Type of the Particle Container type.
Definition: ContainerIterator.h:111
ContainerIterator< Particle_T, modifiable, regionIter > & operator=(const ContainerIterator< Particle_T, modifiable, regionIter > &other)
Copy assignment operator.
Definition: ContainerIterator.h:169
ParticleType * operator->() const
Dereference operator.
Definition: ContainerIterator.h:289
bool operator==(const bool input) const
Checks if the current iterator has a given validity.
Definition: ContainerIterator.h:306
bool operator!=(const bool input) const
Checks if the current iterator does not have a given validity.
Definition: ContainerIterator.h:313
ContainerIterator< Particle_T, modifiable, regionIter > & operator++()
Increments the iterator.
Definition: ContainerIterator.h:272
std::conditional_t< modifiable, std::vector< std::vector< Particle_T > * >, std::vector< std::vector< Particle_T > const * > > ParticleVecType
Type of the additional vector collection.
Definition: ContainerIterator.h:106
ContainerIterator(ContainerIterator< Particle_T, modifiable, regionIter > &&other) noexcept
Move constructor.
Definition: ContainerIterator.h:192
ContainerIterator(ContainerType &container, IteratorBehavior behavior, ParticleVecType *additionalVectorsToIterate)
Regular Iterator constructor meant to be called from the logic handler.
Definition: ContainerIterator.h:142
ContainerIterator()
Default constructor that guarantees an invalid iterator.
Definition: ContainerIterator.h:116
ParticleType & operator*() const
Dereference operator.
Definition: ContainerIterator.h:283
ContainerIterator(ContainerType &container, IteratorBehavior behavior, ParticleVecType *additionalVectorsToIterate, const std::array< double, 3 > ®ionMin, const std::array< double, 3 > ®ionMax)
Region Iterator constructor meant to be called from the logic handler.
Definition: ContainerIterator.h:127
bool isValid() const
Check whether the iterator currently points to a valid particle.
Definition: ContainerIterator.h:295
The ParticleContainerInterface class provides a basic interface for all Containers within AutoPas.
Definition: ParticleContainerInterface.h:37
bool particleFulfillsIteratorRequirements(const Particle_T &p, IteratorBehavior behavior, const Arr ®ionMin, const Arr ®ionMax)
Indicates whether the particle has the correct ownership state and if this is a region iterator is in...
Definition: ContainerIterator.h:57
void deleteParticle(ParticleIterator &iterator)
Function to access private iterator.deleteCurrentParticle() via friend.
Definition: ContainerIterator.h:35
constexpr std::array< T, SIZE > max(const std::array< T, SIZE > &a, const std::array< T, SIZE > &b)
Takes elementwise maximum and returns the result.
Definition: ArrayMath.h:96
constexpr std::array< T, SIZE > subScalar(const std::array< T, SIZE > &a, T s)
Subtracts a scalar s from each element of array a and returns the result.
Definition: ArrayMath.h:164
constexpr std::array< T, SIZE > addScalar(const std::array< T, SIZE > &a, T s)
Adds a scalar s to each element of array a and returns the result.
Definition: ArrayMath.h:147
constexpr std::array< T, SIZE > min(const std::array< T, SIZE > &a, const std::array< T, SIZE > &b)
Takes elementwise minimum, returns the result.
Definition: ArrayMath.h:62
bool inBox(const std::array< T, 3 > &position, const std::array< T, 3 > &low, const std::array< T, 3 > &high)
Checks if position is inside of a box defined by low and high.
Definition: inBox.h:26
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:32
int autopas_get_num_threads()
Dummy for omp_get_num_threads() when no OpenMP is available.
Definition: WrapOpenMP.h:138
int autopas_get_thread_num()
Dummy for omp_set_lock() when no OpenMP is available.
Definition: WrapOpenMP.h:132