Commit | Line | Data |
---|---|---|
9ded8453 FD |
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> | |
9ded8453 FD |
11 | |
12 | #include "cpp-common/optional.hpp" | |
13 | ||
14 | namespace bt2 { | |
15 | ||
16 | template <typename ContainerT, typename ElemT> | |
17 | class CommonIterator | |
18 | { | |
19 | friend ContainerT; | |
20 | ||
21 | public: | |
22 | using difference_type = std::ptrdiff_t; | |
23 | using value_type = ElemT; | |
24 | using pointer = value_type *; | |
25 | using reference = value_type&; | |
26 | using iterator_category = std::input_iterator_tag; | |
27 | ||
28 | private: | |
29 | explicit CommonIterator(const ContainerT container, const uint64_t idx) : | |
30 | _mContainer {container}, _mIdx {idx} | |
31 | { | |
32 | this->_updateCurrentValue(); | |
33 | } | |
34 | ||
35 | public: | |
36 | CommonIterator(const CommonIterator&) = default; | |
37 | CommonIterator(CommonIterator&&) = default; | |
38 | CommonIterator& operator=(const CommonIterator&) = default; | |
39 | CommonIterator& operator=(CommonIterator&&) = default; | |
40 | ||
41 | CommonIterator& operator++() noexcept | |
42 | { | |
43 | ++_mIdx; | |
44 | this->_updateCurrentValue(); | |
45 | return *this; | |
46 | } | |
47 | ||
48 | CommonIterator operator++(int) noexcept | |
49 | { | |
50 | const auto tmp = *this; | |
51 | ||
52 | ++(*this); | |
53 | return tmp; | |
54 | } | |
55 | ||
56 | bool operator==(const CommonIterator& other) const noexcept | |
57 | { | |
58 | return _mIdx == other._mIdx; | |
59 | } | |
60 | ||
61 | bool operator!=(const CommonIterator& other) const noexcept | |
62 | { | |
63 | return !(*this == other); | |
64 | } | |
65 | ||
66 | reference operator*() noexcept | |
67 | { | |
68 | return *_mCurrVal; | |
69 | } | |
70 | ||
71 | pointer operator->() noexcept | |
72 | { | |
73 | return &(*_mCurrVal); | |
74 | } | |
75 | ||
76 | private: | |
77 | void _updateCurrentValue() noexcept | |
78 | { | |
79 | if (_mIdx < _mContainer.size()) { | |
80 | _mCurrVal = _mContainer[_mIdx]; | |
81 | } else { | |
82 | _mCurrVal = nonstd::nullopt; | |
83 | } | |
84 | } | |
85 | ||
86 | nonstd::optional<value_type> _mCurrVal; | |
87 | ContainerT _mContainer; | |
88 | uint64_t _mIdx; | |
89 | }; | |
90 | } /* namespace bt2 */ | |
91 | ||
92 | #endif /* BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP */ |