2#ifndef LIBSBX_ECS_DETAIL_REGISTRY_STORAGE_ITERATOR_HPP_
3#define LIBSBX_ECS_DETAIL_REGISTRY_STORAGE_ITERATOR_HPP_
8#include <libsbx/utility/concepts.hpp>
9#include <libsbx/utility/iterator.hpp>
11#include <libsbx/memory/iterable_adaptor.hpp>
13namespace sbx::ecs::detail {
15template<
typename Iterator>
18 template<
typename Other>
21 template<
typename Lhs,
typename Rhs>
24 template<
typename Lhs,
typename Rhs>
27 using mapped_type = std::remove_reference_t<decltype(std::declval<Iterator>()->second)>;
31 using value_type = std::pair<std::uint32_t, utility::constness_as_t<typename mapped_type::element_type, mapped_type>&>;
33 using reference = value_type;
34 using difference_type = std::ptrdiff_t;
35 using iterator_category = std::input_iterator_tag;
36 using iterator_concept = std::random_access_iterator_tag;
44 template<
typename Other>
45 requires (!std::is_same_v<Iterator, Other> && std::is_constructible_v<Iterator, Other>)
55 const auto original = *
this;
66 const auto original = *
this;
78 return (copy += value);
82 return (*
this += -value);
86 return (*
this + -value);
89 [[nodiscard]]
constexpr auto operator[](
const difference_type value)
const noexcept -> reference {
90 return {_iterator[value].first, *_iterator[value].second};
93 [[nodiscard]]
constexpr auto operator*()
const noexcept -> reference {
97 [[nodiscard]]
constexpr auto operator->()
const noexcept ->
pointer {
107template<
typename Lhs,
typename Rhs>
109 return lhs._iterator - rhs._iterator;
112template<
typename Lhs,
typename Rhs>
113[[nodiscard]]
constexpr auto operator==(
const registry_storage_iterator<Lhs>& lhs,
const registry_storage_iterator<Rhs>& rhs)
noexcept ->
bool {
114 return lhs._iterator == rhs._iterator;
Definition: registry_storage_iterator.hpp:16