Line data Source code
1 1 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : /// \file
5 : /// Defines IndexIterator.
6 :
7 : #pragma once
8 :
9 : #include <cstddef>
10 :
11 : #include "DataStructures/Index.hpp"
12 :
13 : /// \ingroup DataStructuresGroup
14 : /// IndexIterator iterates over a unique set of Index.
15 : ///
16 : /// \example
17 : /// \snippet Test_IndexIterator.cpp index_iterator_example
18 : ///
19 : /// Each integer of the Index will vary from 0 to extents[d] - 1,
20 : /// with the lowest dimension varying the fastest.
21 : template <std::size_t Dim>
22 1 : class IndexIterator {
23 : public:
24 : /// Construct from an Index
25 1 : explicit IndexIterator(Index<Dim> extents);
26 : /// It does not make sense to default construct an IndexIterator
27 1 : IndexIterator() = delete;
28 : /// \cond HIDDEN_SYMBOLS
29 : ~IndexIterator() = default;
30 : /// @{
31 : /// No copy or move semantics
32 : IndexIterator(const IndexIterator<Dim>&) = delete;
33 : IndexIterator(IndexIterator<Dim>&&) = delete;
34 : IndexIterator<Dim>& operator=(const IndexIterator<Dim>&) = delete;
35 : IndexIterator<Dim>& operator=(IndexIterator<Dim>&&) = delete;
36 : /// @}
37 : /// \endcond
38 :
39 : /// Returns false if the end of the Index iteration is reached
40 1 : explicit operator bool() const { return valid_; }
41 :
42 : /// Advance to next Index.
43 1 : IndexIterator<Dim>& operator++();
44 :
45 0 : const Index<Dim>& operator*() const { return index_; }
46 0 : const Index<Dim>* operator->() const { return &index_; }
47 :
48 : /// Returns an index representing the (i, j, ...)th values that the iterator
49 : /// currently represents
50 1 : const Index<Dim>& operator()() const { return index_; }
51 :
52 : /// Get the collapsed index into a 1D array of the data corresponding to the
53 : /// current Index of the IndexIterator. Note that the first dimension of the
54 : /// Index varies fastest when computing the collapsed index.
55 1 : size_t collapsed_index() const { return collapsed_index_; }
56 :
57 : private:
58 0 : const Index<Dim> extents_{};
59 0 : Index<Dim> index_{};
60 0 : size_t collapsed_index_{0};
61 0 : bool valid_{false};
62 : };
|