OGS
Get.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <boost/mp11.hpp>
7
9
10namespace ProcessLib::Graph
11{
12namespace detail
13{
14template <typename T, typename Tuple, typename... Tuples>
15auto& getImpl(Tuple& t, Tuples&... ts)
16{
17 using namespace boost::mp11;
18
19 using PlainTuple = std::remove_cv_t<Tuple>;
20 using TupleOfPlainTypes = mp_transform<std::remove_cvref_t, PlainTuple>;
21 using Index = mp_find<TupleOfPlainTypes, T>;
22
23 if constexpr (Index::value != mp_size<PlainTuple>::value)
24 {
25 return std::get<Index::value>(t);
26 }
27 else
28 {
29 return getImpl<T>(ts...);
30 }
31}
32
33template <typename... Tuples>
35{
36 // This check is necessary only to ensure that mp_flatten works as expected.
37 static_assert(boost::mp11::mp_similar<std::tuple<>, Tuples...>::value,
38 "All template arguments must be std::tuple's.");
39
40 using type = boost::mp11::mp_flatten<std::tuple<Tuples...>>;
41};
42} // namespace detail
43
52template <typename T, typename... Tuples>
53auto& get(Tuples&... ts)
54{
55 using namespace boost::mp11;
56
57 static_assert(std::is_same_v<T, std::remove_cvref_t<T>>,
58 "The passed type T must not be cvref qualified.");
59
60 using FlattenedTuple = typename detail::GetFlattenedTupleTypes<
61 std::remove_cv_t<Tuples>...>::type;
62 using FlattenedTupleOfPlainTypes =
63 mp_transform<std::remove_cvref_t, FlattenedTuple>;
64
65 static_assert(
67 "The types of all elements of all passed tuples must be unique.");
68
70 "Type T must be inside any of the passed tuples.");
71
72 return detail::getImpl<T>(ts...);
73}
74
75} // namespace ProcessLib::Graph
auto & getImpl(Tuple &t, Tuples &... ts)
Definition Get.h:15
auto & get(Tuples &... ts)
Definition Get.h:53
constexpr bool mp_is_set_v
constexpr bool mp_contains_v
boost::mp11::mp_flatten< std::tuple< Tuples... > > type
Definition Get.h:40