2 * Copyright (c) 2022 Francis Deslauriers <francis.deslauriers@efficios.com>
4 * SPDX-License-Identifier: MIT
7 #ifndef BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP
8 #define BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP
12 #include "cpp-common/optional.hpp"
16 template <typename ContainerT, typename ElemT>
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;
29 explicit CommonIterator(const ContainerT container, const uint64_t idx) :
30 _mContainer {container}, _mIdx {idx}
32 this->_updateCurrentValue();
36 CommonIterator(const CommonIterator&) = default;
37 CommonIterator(CommonIterator&&) = default;
38 CommonIterator& operator=(const CommonIterator&) = default;
39 CommonIterator& operator=(CommonIterator&&) = default;
41 CommonIterator& operator++() noexcept
44 this->_updateCurrentValue();
48 CommonIterator operator++(int) noexcept
50 const auto tmp = *this;
56 bool operator==(const CommonIterator& other) const noexcept
58 return _mIdx == other._mIdx;
61 bool operator!=(const CommonIterator& other) const noexcept
63 return !(*this == other);
66 reference operator*() noexcept
71 pointer operator->() noexcept
77 void _updateCurrentValue() noexcept
79 if (_mIdx < _mContainer.size()) {
80 _mCurrVal = _mContainer[_mIdx];
82 _mCurrVal = nonstd::nullopt;
86 nonstd::optional<value_type> _mCurrVal;
87 ContainerT _mContainer;
92 #endif /* BABELTRACE_CPP_COMMON_BT2_COMMON_ITER_HPP */