ECSTASY
All in the name
Loading...
Searching...
No Matches
outer_join.hpp
Go to the documentation of this file.
1
11
12#ifndef UTIL_META_OUTER_JOIN_HPP_
13#define UTIL_META_OUTER_JOIN_HPP_
14
15#include "Traits.hpp"
16#include "contains.hpp"
17
18namespace util::meta
19{
31 template <typename Rights, bool IsInner, typename Left, typename... OuterLefts>
33 using type = Traits<>;
34 };
35
47 template <typename... Rights, bool IsInner, typename Left, typename... OuterLefts>
48 struct _left_outer_join<Traits<Rights...>, IsInner, Left, OuterLefts...> {
57 template <typename... LeftsUntreated>
58 struct result {
59 // clang-format off
61 IsInner,
63 Traits<OuterLefts...>,
65 Traits<OuterLefts..., Left>
66 >;
67 // clang-format on
68 };
69
79 template <typename NextLeft, typename... LeftsUntreated>
80 struct result<NextLeft, LeftsUntreated...> {
81 // clang-format off
83 IsInner,
85 typename _left_outer_join<
86 Traits<Rights...>, // Rights
87 util::meta::contains<NextLeft, Rights...>, // IsInner
88 NextLeft, // Left
89 OuterLefts... // OuterLefts
90 >::template result<LeftsUntreated...>::type,
92 typename _left_outer_join<
93 Traits<Rights...>, // Rights
94 util::meta::contains<NextLeft, Rights...>, // IsInner
95 NextLeft, // Left
96 OuterLefts..., Left // OuterLefts
97 >::template result<LeftsUntreated...>::type
98 >;
99 // clang-format on
100 };
101 };
102
112 template <typename, typename>
114 using type = Traits<>;
115 };
116
128 template <typename Left, typename... Lefts, typename... Rights>
129 struct left_outer_join<Traits<Left, Lefts...>, Traits<Rights...>> {
130 // clang-format off
131 using type = typename
133 Traits<Rights...>, // Rights
134 contains<Left, Rights...>, // IsInner
135 Left // Left
136 >::template result<Lefts...>::type;
137 // clang-format on
138 };
139
150 template <typename... Lefts, typename... Rights>
151 struct left_outer_join<std::tuple<Lefts...>, std::tuple<Rights...>> {
152 using type = typename left_outer_join<Traits<Lefts...>, Traits<Rights...>>::type;
153 };
154
164 template <typename Lefts, typename Rights>
166
177 template <typename Lefts, typename Rights>
179
189 template <typename Lefts, typename Rights>
191} // namespace util::meta
192
193#endif /* !UTIL_META_OUTER_JOIN_HPP_ */
Helper types for parameter packs.
Checks if a type exists in a list of types.
Namespace regrouping all meta programmation helper types.
typename left_outer_join< Lefts, Rights >::type left_outer_join_t
Helper for left_outer_join<...>::type.
constexpr bool contains
Checks if the type T exists in the types Ts.
Definition contains.hpp:29
typename right_outer_join< Lefts, Rights >::type right_outer_join_t
Helper for right_outer_join<...>::type.
Empty parameter pack helper type.
Definition Traits.hpp:28
typename _left_outer_join< Traits< Rights... >, contains< Left, Rights... >, Left >::template result< Lefts... >::type type
typename left_outer_join< Traits< Lefts... >, Traits< Rights... > >::type type
Performs a left outer join on two parameter pack types (returns types in Lefts but no in Rights).