OGS
Get.h
Go to the documentation of this file.
1
10#pragma once
11
12#include <boost/mp11.hpp>
13
14namespace ProcessLib::Graph
15{
16namespace detail
17{
18template <typename T, typename Tuple, typename... Tuples>
19auto& getImpl(Tuple& t, Tuples&... ts)
20{
21 using namespace boost::mp11;
22
23 using PlainTuple = std::remove_cv_t<Tuple>;
24 using TupleOfPlainTypes = mp_transform<std::remove_cvref_t, PlainTuple>;
25 using Index = mp_find<TupleOfPlainTypes, T>;
26
27 if constexpr (Index::value != mp_size<PlainTuple>::value)
28 {
29 return std::get<Index::value>(t);
30 }
31 else
32 {
33 return getImpl<T>(ts...);
34 }
35}
36
37template <typename... Tuples>
39{
40 // This check is necessary only to ensure that mp_flatten works as expected.
41 static_assert(boost::mp11::mp_similar<std::tuple<>, Tuples...>::value,
42 "All template arguments must be std::tuple's.");
43
44 using type = boost::mp11::mp_flatten<std::tuple<Tuples...>>;
45};
46
47// Alias to be used together with static_assert to improve possible compile
48// error messages.
49template <typename List, typename Elem>
50constexpr bool mp_contains_v = boost::mp11::mp_contains<List, Elem>::value;
51
52// Alias to be used together with static_assert to improve possible compile
53// error messages
54template <typename Set>
55constexpr bool mp_is_set_v = boost::mp11::mp_is_set<Set>::value;
56} // namespace detail
57
66template <typename T, typename... Tuples>
67auto& get(Tuples&... ts)
68{
69 using namespace boost::mp11;
70
71 static_assert(std::is_same_v<T, std::remove_cvref_t<T>>,
72 "The passed type T must not be cvref qualified.");
73
74 using FlattenedTuple = typename detail::GetFlattenedTupleTypes<
75 std::remove_cv_t<Tuples>...>::type;
76 using FlattenedTupleOfPlainTypes =
77 mp_transform<std::remove_cvref_t, FlattenedTuple>;
78
79 static_assert(
80 detail::mp_is_set_v<FlattenedTupleOfPlainTypes>,
81 "The types of all elements of all passed tuples must be unique.");
82
83 static_assert(detail::mp_contains_v<FlattenedTupleOfPlainTypes, T>,
84 "Type T must be inside any of the passed tuples.");
85
86 return detail::getImpl<T>(ts...);
87}
88
89} // namespace ProcessLib::Graph
constexpr bool mp_contains_v
Definition Get.h:50
auto & getImpl(Tuple &t, Tuples &... ts)
Definition Get.h:19
constexpr bool mp_is_set_v
Definition Get.h:55
auto & get(Tuples &... ts)
Definition Get.h:67
boost::mp11::mp_flatten< std::tuple< Tuples... > > type
Definition Get.h:44