36template <
class ParticleIterator>
38 iterator.deleteCurrentParticle();
45namespace containerIteratorUtils {
58template <
bool regionIter,
class Particle_T,
class Arr>
60 const Arr ®ionMin,
const Arr ®ionMax) {
64 if constexpr (regionIter) {
73 if (((behavior & IteratorBehavior::ownedOrHaloOrDummy) == IteratorBehavior::ownedOrHaloOrDummy) or
74 (behavior & IteratorBehavior::dummy and p.isDummy())) {
78 return static_cast<unsigned int>(p.getOwnershipState()) &
static_cast<unsigned int>(behavior);
94template <
class Particle_T,
bool modifiable,
bool regionIter>
103 using ParticleType = std::conditional_t<modifiable, Particle_T, const Particle_T>;
107 using ParticleVecType = std::conditional_t<modifiable, std::vector<std::vector<Particle_T> *>,
108 std::vector<std::vector<Particle_T>
const *>>;
112 using ContainerType = std::conditional_t<modifiable, ParticleContainerInterface<Particle_T>,
131 const std::array<double, 3> ®ionMax)
132 :
ContainerIterator(nullptr, container, behavior, additionalVectorsToIterate, regionMin, regionMax) {
134 static_assert(regionIter ==
true,
135 "Constructor for Region iterator called but template argument regionIter is false");
147 :
ContainerIterator(nullptr, container, behavior, additionalVectorsToIterate, {}, {}) {
148 static_assert(regionIter ==
false,
149 "Constructor for non-Region iterator called but template argument regionIter is true");
157 : _container(other._container),
158 _currentParticleIndex(other._currentParticleIndex),
159 _currentVectorIndex(other._currentVectorIndex),
160 _currentParticle(other._currentParticle),
161 _additionalVectors(other._additionalVectors),
162 _behavior(other._behavior),
163 _iteratingAdditionalVectors(other._iteratingAdditionalVectors),
164 _vectorIndexOffset(other._vectorIndexOffset),
165 _regionMin(other._regionMin),
166 _regionMax(other._regionMax) {}
176 _container = other._container;
177 _currentParticleIndex = other._currentParticleIndex;
178 _currentVectorIndex = other._currentVectorIndex;
179 _currentParticle = other._currentParticle;
180 _additionalVectors = other._additionalVectors;
181 _behavior = other._behavior;
182 _iteratingAdditionalVectors = other._iteratingAdditionalVectors;
183 _vectorIndexOffset = other._vectorIndexOffset;
184 if constexpr (regionIter) {
185 _regionMin = other._regionMin;
186 _regionMax = other._regionMax;
197 : _container(other._container),
198 _currentParticleIndex(other._currentParticleIndex),
199 _currentVectorIndex(other._currentVectorIndex),
200 _currentParticle(other._currentParticle),
201 _additionalVectors(std::move(other._additionalVectors)),
202 _behavior(other._behavior),
203 _iteratingAdditionalVectors(other._iteratingAdditionalVectors),
204 _vectorIndexOffset(other._vectorIndexOffset),
205 _regionMin(std::move(other._regionMin)),
206 _regionMax(std::move(other._regionMax)) {}
215 if (
this != &other) {
216 _container = other._container;
217 _currentParticleIndex = other._currentParticleIndex;
218 _currentVectorIndex = other._currentVectorIndex;
219 _currentParticle = other._currentParticle;
220 _additionalVectors = std::move(other._additionalVectors);
221 _behavior = other._behavior;
222 _iteratingAdditionalVectors = other._iteratingAdditionalVectors;
223 _vectorIndexOffset = other._vectorIndexOffset;
224 if constexpr (regionIter) {
225 _regionMin = std::move(other._regionMin);
226 _regionMax = std::move(other._regionMax);
246 const std::array<double, 3> ®ionMax)
247 : _container(&container),
250 if (additionalVectorsToIterate.has_value()) {
252 _additionalVectors.insert(_additionalVectors.end(), additionalVectorsToIterate->get().begin(),
253 additionalVectorsToIterate->get().end());
256 if constexpr (regionIter) {
264 fetchParticleAtCurrentIndex();
278 ++_currentParticleIndex;
279 fetchParticleAtCurrentIndex();
299 [[nodiscard]]
bool isValid()
const {
return _currentParticle !=
nullptr; }
317 bool operator!=(
const bool input)
const {
return not(*
this == input); }
324 void fetchParticleAtCurrentIndex() {
325 if (not _iteratingAdditionalVectors) {
327 if constexpr (regionIter) {
328 std::tie(_currentParticle, _currentVectorIndex, _currentParticleIndex) =
329 _container->getParticle(_currentVectorIndex, _currentParticleIndex, _behavior, _regionMin, _regionMax);
331 std::tie(_currentParticle, _currentVectorIndex, _currentParticleIndex) =
332 _container->getParticle(_currentVectorIndex, _currentParticleIndex, _behavior);
335 if (_currentParticle ==
nullptr and not _additionalVectors.empty()) {
338 _currentParticleIndex = 0;
339 _iteratingAdditionalVectors =
true;
346 if (_iteratingAdditionalVectors) {
348 for (; _currentVectorIndex < _additionalVectors.size(); _currentVectorIndex += _vectorIndexOffset) {
350 for (; _currentParticleIndex < _additionalVectors[_currentVectorIndex]->size(); ++_currentParticleIndex) {
351 _currentParticle = &(_additionalVectors[_currentVectorIndex]->operator[](_currentParticleIndex));
353 if (containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(*_currentParticle, _behavior,
354 _regionMin, _regionMax)) {
358 _currentParticleIndex = 0;
362 _currentParticle =
nullptr;
363 _currentParticleIndex = std::numeric_limits<
decltype(_currentParticleIndex)>::max();
364 _currentVectorIndex = std::numeric_limits<
decltype(_currentVectorIndex)>::max();
372 void deleteCurrentParticle() {
373 if (_iteratingAdditionalVectors) {
376 auto ¤tVector = *_additionalVectors[_currentVectorIndex];
378 *_currentParticle = currentVector.back();
379 currentVector.pop_back();
381 if (currentVector.empty() or not containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(
382 *_currentParticle, _behavior, _regionMin, _regionMax)) {
386 const auto indicesValid = _container->deleteParticle(_currentVectorIndex, _currentParticleIndex);
388 if (not indicesValid) {
391 }
else if (not containerIteratorUtils::particleFulfillsIteratorRequirements<regionIter>(
392 *_currentParticle, _behavior, _regionMin, _regionMax)) {
398 --_currentParticleIndex;
411 size_t _currentParticleIndex{0};
418 size_t _currentVectorIndex{};
434 IteratorBehavior _behavior;
440 bool _iteratingAdditionalVectors{
false};
445 size_t _vectorIndexOffset{};
454 using RegionCornerT = std::conditional_t<regionIter, std::array<double, 3>, empty>;
460 [[no_unique_address]] RegionCornerT _regionMin{};
466 [[no_unique_address]] RegionCornerT _regionMax{};
Public iterator class that iterates over a particle container and additional vectors (which are typic...
Definition: ContainerIterator.h:95
std::conditional_t< modifiable, Particle_T, const Particle_T > ParticleType
Type of the particle this iterator points to.
Definition: ContainerIterator.h:103
ContainerIterator(ContainerType &container, IteratorBehavior behavior, utils::optRef< 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:129
ContainerIterator(const ContainerIterator< Particle_T, modifiable, regionIter > &other)
Copy constructor.
Definition: ContainerIterator.h:156
ContainerIterator< Particle_T, modifiable, regionIter > & operator=(ContainerIterator< Particle_T, modifiable, regionIter > &&other) noexcept
Move assignment operator.
Definition: ContainerIterator.h:213
std::conditional_t< modifiable, ParticleContainerInterface< Particle_T >, const ParticleContainerInterface< Particle_T > > ContainerType
Type of the Particle Container type.
Definition: ContainerIterator.h:113
ContainerIterator< Particle_T, modifiable, regionIter > & operator=(const ContainerIterator< Particle_T, modifiable, regionIter > &other)
Copy assignment operator.
Definition: ContainerIterator.h:173
ParticleType * operator->() const
Dereference operator.
Definition: ContainerIterator.h:293
bool operator==(const bool input) const
Checks if the current iterator has a given validity.
Definition: ContainerIterator.h:310
ContainerIterator(ContainerType &container, IteratorBehavior behavior, utils::optRef< ParticleVecType > additionalVectorsToIterate)
Regular Iterator constructor meant to be called from the logic handler.
Definition: ContainerIterator.h:145
bool operator!=(const bool input) const
Checks if the current iterator does not have a given validity.
Definition: ContainerIterator.h:317
ContainerIterator< Particle_T, modifiable, regionIter > & operator++()
Increments the iterator.
Definition: ContainerIterator.h:276
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:108
ContainerIterator(ContainerIterator< Particle_T, modifiable, regionIter > &&other) noexcept
Move constructor.
Definition: ContainerIterator.h:196
ContainerIterator()
Default constructor that guarantees an invalid iterator.
Definition: ContainerIterator.h:118
ParticleType & operator*() const
Dereference operator.
Definition: ContainerIterator.h:287
bool isValid() const
Check whether the iterator currently points to a valid particle.
Definition: ContainerIterator.h:299
The ParticleContainerInterface class provides a basic interface for all Containers within AutoPas.
Definition: ParticleContainerInterface.h:38
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:59
void deleteParticle(ParticleIterator &iterator)
Function to access private iterator.deleteCurrentParticle() via friend.
Definition: ContainerIterator.h:37
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
std::optional< std::reference_wrapper< T > > optRef
Short alias for std::optional<std::reference_wrapper<T>>
Definition: optRef.h:16
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