5ebade34859c167b26ea6b64b1dd4418cad90eac
[babeltrace.git] / src / cpp-common / bt2 / common-iter.hpp
1 /*
2 * Copyright (c) 2022 Francis Deslauriers <francis.deslauriers@efficios.com>
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7 #ifndef BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP
8 #define BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP
9
10 #include <iterator>
11 #include <type_traits>
12
13 #include "cpp-common/optional.hpp"
14
15 namespace bt2 {
16
17 template <typename ContainerT, typename ElemT>
18 class CommonIterator
19 {
20 friend ContainerT;
21
22 public:
23 using difference_type = std::ptrdiff_t;
24 using value_type = ElemT;
25 using pointer = value_type *;
26 using reference = value_type&;
27 using iterator_category = std::input_iterator_tag;
28
29 private:
30 explicit CommonIterator(const ContainerT container, const uint64_t idx) :
31 _mContainer {container}, _mIdx {idx}
32 {
33 this->_updateCurrentValue();
34 }
35
36 public:
37 CommonIterator(const CommonIterator&) = default;
38 CommonIterator(CommonIterator&&) = default;
39 CommonIterator& operator=(const CommonIterator&) = default;
40 CommonIterator& operator=(CommonIterator&&) = default;
41
42 CommonIterator& operator++() noexcept
43 {
44 ++_mIdx;
45 this->_updateCurrentValue();
46 return *this;
47 }
48
49 CommonIterator operator++(int) noexcept
50 {
51 const auto tmp = *this;
52
53 ++(*this);
54 return tmp;
55 }
56
57 bool operator==(const CommonIterator& other) const noexcept
58 {
59 return _mIdx == other._mIdx;
60 }
61
62 bool operator!=(const CommonIterator& other) const noexcept
63 {
64 return !(*this == other);
65 }
66
67 reference operator*() noexcept
68 {
69 return *_mCurrVal;
70 }
71
72 pointer operator->() noexcept
73 {
74 return &(*_mCurrVal);
75 }
76
77 private:
78 void _updateCurrentValue() noexcept
79 {
80 if (_mIdx < _mContainer.size()) {
81 _mCurrVal = _mContainer[_mIdx];
82 } else {
83 _mCurrVal = nonstd::nullopt;
84 }
85 }
86
87 nonstd::optional<value_type> _mCurrVal;
88 ContainerT _mContainer;
89 uint64_t _mIdx;
90 };
91 } /* namespace bt2 */
92
93 #endif /* BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP */
This page took 0.032114 seconds and 3 git commands to generate.