2 * Copyright (c) 2022 Francis Deslauriers <francis.deslauriers@efficios.com>
3 * Copyright (c) 2023 Philippe Proulx <pproulx@efficios.com>
5 * SPDX-License-Identifier: MIT
8 #ifndef BABELTRACE_CPP_COMMON_BT2_BORROWED_OBJECT_ITERATOR_HPP
9 #define BABELTRACE_CPP_COMMON_BT2_BORROWED_OBJECT_ITERATOR_HPP
12 #include <type_traits>
15 #include "common/assert.h"
17 #include "borrowed-object-proxy.hpp"
22 * An iterator class to iterate an instance of a borrowed object
23 * container of type `ContainerT`.
25 * `ContainerT` must implement:
27 * // Returns the number of contained borrowed objects.
28 * std::uint64_t length() const noexcept;
30 * // Returns the borrowed object at index `i`.
31 * SomeObject operator[](std::uint64_t i) const noexcept;
33 template <typename ContainerT>
34 class BorrowedObjectIterator final
39 using Object = typename std::remove_reference<
40 decltype(std::declval<ContainerT>()[std::declval<std::uint64_t>()])>::type;
43 explicit BorrowedObjectIterator(const ContainerT container, const uint64_t idx) :
44 _mContainer {container}, _mIdx {idx}
49 BorrowedObjectIterator& operator++() noexcept
55 BorrowedObjectIterator operator++(int) noexcept
57 const auto tmp = *this;
63 bool operator==(const BorrowedObjectIterator& other) const noexcept
65 BT_ASSERT_DBG(_mContainer.isSame(other._mContainer));
66 return _mIdx == other._mIdx;
69 bool operator!=(const BorrowedObjectIterator& other) const noexcept
71 return !(*this == other);
74 Object operator*() const noexcept
76 return _mContainer[_mIdx];
79 BorrowedObjectProxy<Object> operator->() const noexcept
81 return BorrowedObjectProxy<Object> {(**this).libObjPtr()};
85 ContainerT _mContainer;
91 #endif /* BABELTRACE_CPP_COMMON_BT2_BORROWED_OBJECT_ITERATOR_HPP */