13 template<
typename First,
typename... Rest>
18 template<
typename Con>
22 template<
typename First,
typename... Rest>
27 template<
typename First,
typename... Rest>
30 template<
typename... Cons>
33 template<
typename First,
typename... Cons>
38 template<CartesianProductCommonArg Con>
52 template<
bool is_const>
57 detail::CartesianProductIsRandomAccess<meta::MaybeConst<is_const, First>,
58 meta::MaybeConst<is_const, Rest>...>,
59 RandomAccessIteratorTag,
60 meta::Conditional<detail::CartesianProductIsBidirectional<meta::MaybeConst<is_const, First>,
61 meta::MaybeConst<is_const, Rest>...>,
62 RandomAccessIteratorTag,
63 meta::Conditional<concepts::ForwardContainer<meta::MaybeConst<is_const, First>>,
64 ForwardIteratorTag, InputIteratorTag>>>,
65 Tuple<meta::ContainerValue<First>, meta::ContainerValue<Rest>...>, ssize_t> {
74 constexpr explicit Iterator(Parent& parent, Storage storage)
75 : m_parent(util::addressof(parent)), m_iterators(util::move(storage)) {}
80 constexpr Iterator(Iterator<!is_const> other)
84 : m_parent(other.m_parent), m_iterators(util::move(other)) {}
86 constexpr auto operator*()
const {
88 [](
auto& iterator) ->
decltype(*iterator) {
94 constexpr void advance_one() { this->
next(); }
96 constexpr void back_one()
103 constexpr void advance_n(
ssize_t n)
111 if (*
this == m_parent->end()) {
113 *
this = m_parent->begin();
114 advance_n(m_parent->size() + n);
121 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool {
122 return a.m_iterators == b.m_iterators;
125 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
129 return a.m_iterators <=> b.m_iterators;
132 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) ->
ssize_t
139 return a.distance_from(b.m_iterators);
144 constexpr auto at_end()
const ->
bool {
156 return a.distance_to_end();
159 constexpr auto distance_to_end()
const {
164 return distance_to(end_tuple);
188 template<
size_t N =
sizeof...(Rest)>
189 constexpr void next() {
192 if constexpr (N > 0) {
200 template<
size_t N =
sizeof...(Rest)>
201 constexpr void prev() {
205 if constexpr (N > 0) {
212 template<
size_t N =
sizeof...(Rest)>
216 auto new_position = position + n;
218 if constexpr (N == 0) {
219 it += (new_position - position);
222 if (new_position < 0) {
223 new_position =
size - (-new_position %
size);
225 new_position %=
size;
226 it += (new_position - position);
232 template<
size_t N =
sizeof...(Rest),
typename Tuple>
233 constexpr auto distance_from(
Tuple const& a)
const ->
ssize_t {
235 if constexpr (N == 0) {
239 return distance + scale * this->distance_from<N - 1>(a);
243 Parent* m_parent {
nullptr };
259 constexpr auto begin() const -> Iterator<true>
270 bool is_empty =
false;
271 bool is_first =
true;
286 constexpr auto end() const
287 requires(
detail::CartesianProductIsCommon<First const, Rest const...>)
290 bool is_empty =
false;
291 bool is_first =
true;
306 constexpr auto end() const
307 requires(!
detail::CartesianProductIsCommon<First const, Rest const...>)
325 requires(
detail::CartesianProductIsSized<First const, Rest const...>)
337 Tuple<First, Rest...> m_bases;
340template<
typename... Cons>
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition cartesian_product_view.h:50
constexpr auto end() const
Definition cartesian_product_view.h:286
constexpr auto end()
Definition cartesian_product_view.h:265
CartesianProductView()=default
constexpr CartesianProductView(First first, Rest... bases)
Definition cartesian_product_view.h:250
constexpr auto size() const
Definition cartesian_product_view.h:324
constexpr auto end() const
Definition cartesian_product_view.h:306
constexpr auto begin()
Definition cartesian_product_view.h:253
constexpr auto begin() const -> Iterator< true > requires(concepts::Container< First > &&(concepts::Container< Rest > &&...))
Definition cartesian_product_view.h:259
constexpr auto size()
Definition cartesian_product_view.h:312
Definition view_interface.h:26
Definition tuple_forward_declaration.h:5
Definition bidirectional_container.h:8
Definition common_container.h:10
Definition operations.h:99
Definition forward_container.h:8
Definition indirectly_swappable.h:7
Definition random_access_container.h:8
Definition simple_view.h:11
Definition sized_container.h:8
Definition sized_sentinel_for.h:9
Definition cartesian_product_view.h:19
Definition cartesian_product_view.h:23
Definition cartesian_product_view.h:28
Definition cartesian_product_view.h:14
Definition cartesian_product_view.h:31
Definition cartesian_product_view.h:34
Definition any_storable.h:9
constexpr auto cartiesian_common_arg_end(Con &&con)
Definition cartesian_product_view.h:39
constexpr auto prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
constexpr auto empty
Definition empty.h:45
constexpr auto operator<=>(MoveIterator< Iter > const &a, MoveIterator< U > const &b)
Definition move_iterator.h:90
constexpr auto operator-(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> decltype(a.base() - b.base())
Definition move_iterator.h:95
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto move
Definition move.h:38
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto distance
Definition distance.h:44
constexpr auto size
Definition size.h:54
CartesianProductView(Cons &&...) -> CartesianProductView< meta::AsView< Cons >... >
constexpr auto iterator_swap
Definition iterator_swap.h:49
constexpr auto default_sentinel
Definition default_sentinel.h:6
constexpr auto end
Definition end.h:47
constexpr auto advance
Definition advance.h:62
auto tag_invoke(types::Tag< util::deduce_create >, InPlaceTemplate< NodeHashMap >, Con &&) -> NodeHashMap< meta::TupleElement< T, 0 >, meta::TupleElement< T, 1 > >
constexpr auto begin
Definition begin.h:44
constexpr auto unpack
Definition unpack.h:24
ptrdiff_t ssize_t
Definition ssize_t.h:6
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto tuple_transform(F &&function, Tup &&tuple)
Definition tuple_transform.h:22
constexpr auto make_tuple(Args &&... args)
Definition make_tuple.h:9
constexpr void tuple_for_each(F &&function, Tup &&tuple)
Definition tuple_for_each.h:22
Definition default_sentinel.h:4
Definition iterator_base.h:14