di 0.1.0
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 {
9 struct CartesianProductFunction;
10
11 template<typename... Cons>
12 concept CustomCartesianProduct = concepts::TagInvocable<CartesianProductFunction, Cons...>;
13
14 template<typename... Cons>
15 concept EmptyCartesianProduct = sizeof...(Cons) == 0;
16
17 template<typename... Cons>
18 concept ViewCartesianProduct =
19 requires(Cons&&... containers) { CartesianProductView { util::forward<Cons>(containers)... }; };
20
21 struct CartesianProductFunction {
22 template<concepts::ViewableContainer... Cons>
23 requires(CustomCartesianProduct<Cons...> || EmptyCartesianProduct<Cons...> || ViewCartesianProduct<Cons...>)
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
36constexpr inline auto cartesian_product = detail::CartesianProductFunction {};
37}
38
39namespace di {
40using view::cartesian_product;
41}
Definition adjacent.h:8
constexpr auto cartesian_product
Definition cartesian_product.h:36
constexpr auto empty
Definition empty.h:7
CartesianProductView(Cons &&...) -> CartesianProductView< meta::AsView< Cons >... >
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition any_storable.h:9