2#ifndef LIBSBX_ECS_DETAIL_SPARSE_SET_ITERATOR_HPP_
3#define LIBSBX_ECS_DETAIL_SPARSE_SET_ITERATOR_HPP_
7namespace sbx::ecs::detail {
9template<
typename Container>
14 using value_type =
typename Container::value_type;
15 using pointer =
typename Container::const_pointer;
16 using reference =
typename Container::const_reference;
17 using difference_type =
typename Container::difference_type;
18 using iterator_category = std::random_access_iterator_tag;
24 constexpr sparse_set_iterator(
const Container& dense,
const difference_type offset) noexcept
34 const auto original = *
this;
45 const auto original = *
this;
55 constexpr auto operator+(
const difference_type value)
const noexcept ->
sparse_set_iterator {
57 return (copy += value);
61 return (*
this += -value);
64 constexpr auto operator-(
const difference_type value)
const noexcept ->
sparse_set_iterator {
65 return (*
this + -value);
68 [[nodiscard]]
constexpr auto operator[](
const difference_type value)
const noexcept -> reference {
69 return (*_dense)[
static_cast<typename Container::size_type
>(index() - value)];
72 [[nodiscard]]
constexpr auto operator->()
const noexcept -> pointer {
73 return std::addressof(
operator[](0));
76 [[nodiscard]]
constexpr auto operator*()
const noexcept -> reference {
80 [[nodiscard]]
constexpr auto data()
const noexcept -> pointer {
81 return _dense ? _dense->data() :
nullptr;
84 [[nodiscard]]
constexpr auto index()
const noexcept -> difference_type {
90 const Container* _dense;
91 difference_type _offset;
95template<
typename Container>
97 return rhs.index() - lhs.index();
100template<
typename Container>
101[[nodiscard]]
constexpr auto operator==(
const sparse_set_iterator<Container> &lhs,
const sparse_set_iterator<Container> &rhs)
noexcept ->
bool {
102 return lhs.index() == rhs.index();
105template<
typename Container>
106[[nodiscard]]
constexpr auto operator!=(
const sparse_set_iterator<Container> &lhs,
const sparse_set_iterator<Container> &rhs)
noexcept ->
bool {
107 return !(lhs == rhs);
110template<
typename Container>
111[[nodiscard]]
constexpr auto operator<(
const sparse_set_iterator<Container> &lhs,
const sparse_set_iterator<Container> &rhs)
noexcept ->
bool {
112 return lhs.index() > rhs.index();
115template<
typename Container>
116[[nodiscard]]
constexpr auto operator>(
const sparse_set_iterator<Container> &lhs,
const sparse_set_iterator<Container> &rhs)
noexcept ->
bool {
120template<
typename Container>
121[[nodiscard]]
constexpr auto operator<=(
const sparse_set_iterator<Container> &lhs,
const sparse_set_iterator<Container> &rhs)
noexcept ->
bool {
125template<
typename Container>
126[[nodiscard]]
constexpr auto operator>=(
const sparse_set_iterator<Container> &lhs,
const sparse_set_iterator<Container> &rhs)
noexcept ->
bool {
Definition: sparse_set_iterator.hpp:10