Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 : #include <limits>
8 :
9 : #include "Utilities/Gsl.hpp"
10 :
11 : template <size_t>
12 : class Index;
13 :
14 : /*!
15 : * \ingroup DataStructuresGroup
16 : * \brief Iterates over the 1-dimensional stripes with info on how to
17 : * iterate over the current stripe
18 : */
19 1 : class StripeIterator {
20 : public:
21 : /// Construct from the grid points in each direction and which dimension the
22 : /// stripes are in.
23 : template <size_t Dim>
24 1 : StripeIterator(const Index<Dim>& extents, size_t stripe_dim);
25 :
26 : /// Returns `true` if the iterator is valid
27 1 : explicit operator bool() const { return offset_ < size_; }
28 :
29 : /// Increment to the next stripe.
30 1 : StripeIterator& operator++() {
31 : ++offset_;
32 : ++stride_count_;
33 : if (UNLIKELY(stride_count_ == stride_)) {
34 : offset_ += jump_;
35 : stride_count_ = 0;
36 : }
37 : return *this;
38 : }
39 :
40 : /// Offset into DataVector for first element of stripe.
41 1 : size_t offset() const { return offset_; }
42 :
43 : /// Stride of elements in DataVector for the stripe.
44 1 : size_t stride() const { return stride_; }
45 :
46 : private:
47 0 : size_t offset_ = std::numeric_limits<size_t>::max();
48 0 : size_t size_ = std::numeric_limits<size_t>::max();
49 0 : size_t stride_ = std::numeric_limits<size_t>::max();
50 0 : size_t stride_count_ = std::numeric_limits<size_t>::max();
51 0 : size_t jump_ = std::numeric_limits<size_t>::max();
52 : };
|