Iros
 
Loading...
Searching...
No Matches
cartesian_product.h
Go to the documentation of this file.
1#pragma once
2
6
7namespace di::container::view {
8namespace detail {
10
11 template<typename... Cons>
13
14 template<typename... Cons>
15 concept EmptyCartesianProduct = sizeof...(Cons) == 0;
16
17 template<typename... Cons>
19 requires(Cons&&... containers) { CartesianProductView { util::forward<Cons>(containers)... }; };
20
24 constexpr auto operator()(Cons&&... containers) const -> concepts::View auto {
25 if constexpr (CustomCartesianProduct<Cons...>) {
26 return function::tag_invoke(*this, util::forward<Cons>(containers)...);
27 } else if constexpr (EmptyCartesianProduct<Cons...>) {
28 return empty<Tuple<>>;
29 } else {
30 return CartesianProductView { util::forward<Cons>(containers)... };
31 }
32 }
33 };
34}
35
37}
38
39namespace di {
40using view::cartesian_product;
41}
Definition cartesian_product_view.h:50
Definition tag_invoke.h:33
Definition view.h:10
Definition viewable_container.h:14
Definition cartesian_product.h:18
Definition adjacent.h:9
concept Cons
Definition zip_transform.h:12
Definition adjacent.h:8
constexpr auto cartesian_product
Definition cartesian_product.h:36
constexpr auto empty
Definition empty.h:7
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition zstring_parser.h:9