X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fcpp-common%2Fbt2%2Fvalue.hpp;h=fab17ca3a6981a6c191b3ec89af7f79f74532dd2;hb=9ded84531ea41e90a0d0869ca3bcd3c7d051477d;hp=a1a7d5010e22cfb9760abcb0ed2c8fd7f153f34f;hpb=c3d8db2a06c3405a53332599628a33ba2ea5603a;p=babeltrace.git diff --git a/src/cpp-common/bt2/value.hpp b/src/cpp-common/bt2/value.hpp index a1a7d501..fab17ca3 100644 --- a/src/cpp-common/bt2/value.hpp +++ b/src/cpp-common/bt2/value.hpp @@ -15,6 +15,7 @@ #include "common/assert.h" #include "common/common.h" +#include "common-iter.hpp" #include "internal/borrowed-obj.hpp" #include "internal/shared-obj.hpp" #include "internal/utils.hpp" @@ -623,82 +624,6 @@ struct CommonArrayValueSpec final } /* namespace internal */ -template -class CommonArrayValueIterator -{ - friend CommonArrayValue; - - using difference_type = std::ptrdiff_t; - using value_type = CommonValue; - using pointer = value_type *; - using reference = value_type&; - using iterator_category = std::input_iterator_tag; - -private: - explicit CommonArrayValueIterator(const CommonArrayValue& arrayVal, - const uint64_t idx) : - _mArrayVal {arrayVal}, - _mIdx {idx} - { - this->_updateCurrentValue(); - } - -public: - CommonArrayValueIterator(const CommonArrayValueIterator&) = default; - CommonArrayValueIterator(CommonArrayValueIterator&&) = default; - CommonArrayValueIterator& operator=(const CommonArrayValueIterator&) = default; - CommonArrayValueIterator& operator=(CommonArrayValueIterator&&) = default; - - CommonArrayValueIterator& operator++() noexcept - { - ++_mIdx; - this->_updateCurrentValue(); - return *this; - } - - CommonArrayValueIterator operator++(int) noexcept - { - const auto tmp = *this; - - ++(*this); - return tmp; - } - - bool operator==(const CommonArrayValueIterator& other) const noexcept - { - return _mIdx == other._mIdx; - } - - bool operator!=(const CommonArrayValueIterator& other) const noexcept - { - return !(*this == other); - } - - reference operator*() noexcept - { - return *_mCurrVal; - } - - pointer operator->() noexcept - { - return &(*_mCurrVal); - } - -private: - void _updateCurrentValue() noexcept - { - if (_mIdx < _mArrayVal.length()) { - _mCurrVal = _mArrayVal[_mIdx]; - } else { - _mCurrVal = nonstd::nullopt; - } - } - - nonstd::optional> _mCurrVal; - CommonArrayValue _mArrayVal; - uint64_t _mIdx; -}; - template class CommonArrayValue final : public CommonValue { @@ -708,7 +633,7 @@ private: public: using Shared = internal::SharedValue, LibObjT>; - using Iterator = CommonArrayValueIterator; + using Iterator = CommonIterator, CommonValue>; explicit CommonArrayValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr} { @@ -740,6 +665,12 @@ public: return bt_value_array_get_length(this->_libObjPtr()); } + /* Required by the `CommonIterator` template class */ + std::uint64_t size() const noexcept + { + return this->length(); + } + Iterator begin() const noexcept { return Iterator {*this, 0};