OGS
ProcessLib::Graph::detail Namespace Reference

Classes

struct  GetFlattenedTupleOfPassedArgs
struct  GetFlattenedTupleOfPassedArgs< Result(*)(DeclaredArgs...), Tuples... >
struct  GetFlattenedTupleOfPassedArgs< Result(Class::*)(DeclaredArgs...) const, ClassAndPassedArgsTuples... >
struct  GetFlattenedTupleOfPassedArgs< Result(Class::*)(DeclaredArgs...), ClassAgain, PassedArgsTuples... >
struct  GetFlattenedTupleTypes
struct  GetFunctionArgumentTypes
struct  GetFunctionArgumentTypes< Result(*)(Args...)>
struct  GetFunctionArgumentTypes< Result(Class::*)(Args...) const >
struct  GetFunctionArgumentTypes< Result(Class::*)(Args...)>
struct  GetFunctionReturnType
struct  GetFunctionReturnType< Result(*)(Args...)>
struct  GetFunctionReturnType< Result(Class::*)(Args...) const >
struct  GetFunctionReturnType< Result(Class::*)(Args...)>
struct  IsInputArgument
struct  IsOutputArgument

Typedefs

template<typename Function>
using GetFunctionArgumentTypesPlain

Functions

template<typename Object, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
auto unpackAndInvoke (boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... >, Object &&o, Tuples &... ts) -> typename GetFunctionReturnType< decltype(&std::decay_t< Object >::operator())>::type
template<typename Result, typename Object, typename... Args, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
Result unpackAndInvoke (boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... >, Result(Object::*m)(Args...), Object &o, Tuples &... ts)
template<typename Result, typename Object, typename... Args, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
Result unpackAndInvoke (boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... >, Result(Object::*m)(Args...), Object &&o, Tuples &... ts)
template<typename Result, typename Object, typename... Args, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
Result unpackAndInvoke (boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... >, Result(Object::*m)(Args...) const, Object const &o, Tuples &... ts)
template<typename Result, typename... Args, typename... Tuples, typename... FunctionArgumentTypesPlain>
Result unpackAndInvoke (boost::mp11::mp_list< FunctionArgumentTypesPlain... >, Result(*fct)(Args...), Tuples &... ts)
template<typename Function, typename... Args>
auto applyImpl (Function &&f, Args &&... args) -> typename detail::GetFunctionReturnType< std::decay_t< Function > >::type
template<typename Model>
bool isEvalOrderCorrectRT (std::unordered_set< std::type_index > &computed_data)
template<typename... Models>
bool isEvalOrderCorrectRT (boost::mp11::mp_list< Models... >, std::unordered_set< std::type_index > &&computed_data)
template<typename Model, typename TupleOfArgs>
Model constructModel (TupleOfArgs &args)
template<template< typename... > typename Tuple, typename... Models, typename TupleOfArgs>
Tuple< Models... > constructModels (std::type_identity< Tuple< Models... > >, TupleOfArgs &&args)
template<typename T, typename Tuple, typename... Tuples>
auto & getImpl (Tuple &t, Tuples &... ts)

Typedef Documentation

◆ GetFunctionArgumentTypesPlain

Initial value:
std::type_identity<boost::mp11::mp_transform<
std::remove_cvref_t,

Definition at line 43 of file Apply.h.

Function Documentation

◆ applyImpl()

template<typename Function, typename... Args>
auto ProcessLib::Graph::detail::applyImpl ( Function && f,
Args &&... args ) -> typename detail::GetFunctionReturnType<std::decay_t<Function>>::type

Invokes the passed function f.

f can be a function object, a free function, or a member function pointer. In the latter case, the first entry of args must be the object for which f shall be invoked. (The remainder of) args are an arbitrary number of tuples from which arguments to f are taken based on their types.

See also
ProcessLib::Graph::apply()

Definition at line 214 of file Apply.h.

216{
217 using namespace boost::mp11;
218
219 using FunctionPlain = std::decay_t<Function>;
220 using FlattenedTuple =
221 typename GetFlattenedTupleOfPassedArgs<FunctionPlain, Args...>::type;
222 using FlattenedTupleOfPlainTypes =
223 mp_transform<std::remove_cvref_t, FlattenedTuple>;
224
225 static_assert(
227 "The types of all elements of all passed tuples must be unique.");
228
229 using FunctionArgumentTypesPlain =
231
232 static_assert(
234 "The argument types of the function to be called must be unique.");
235
236 return unpackAndInvoke(FunctionArgumentTypesPlain{},
237 std::forward<Function>(f),
238 std::forward<Args>(args)...);
239}
auto unpackAndInvoke(boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... >, Object &&o, Tuples &... ts) -> typename GetFunctionReturnType< decltype(&std::decay_t< Object >::operator())>::type
Definition Apply.h:85
std::type_identity< boost::mp11::mp_transform< std::remove_cvref_t, typename GetFunctionArgumentTypes< Function >::type > > GetFunctionArgumentTypesPlain
Definition Apply.h:43
constexpr bool mp_is_set_v

References boost::mp11::mp_is_set_v, and unpackAndInvoke().

Referenced by ProcessLib::Graph::apply(), constructModel(), and ProcessLib::Graph::eval().

◆ constructModel()

template<typename Model, typename TupleOfArgs>
Model ProcessLib::Graph::detail::constructModel ( TupleOfArgs & args)

Definition at line 22 of file ConstructModels.h.

23{
24 if constexpr (HasCreate<Model>)
25 {
26 return applyImpl(&Model::create, args);
27 }
28 else if constexpr (std::is_default_constructible_v<Model>)
29 {
30 return Model{};
31 }
32 else
33 {
34 static_assert(std::is_default_constructible_v<
35 Model> /* This is definitely false, here. */,
36 "The model to be constructed has neither a static "
37 "create() function nor is it default constructible.");
38 }
39}
auto applyImpl(Function &&f, Args &&... args) -> typename detail::GetFunctionReturnType< std::decay_t< Function > >::type
Definition Apply.h:214

References applyImpl().

Referenced by constructModels().

◆ constructModels()

template<template< typename... > typename Tuple, typename... Models, typename TupleOfArgs>
Tuple< Models... > ProcessLib::Graph::detail::constructModels ( std::type_identity< Tuple< Models... > > ,
TupleOfArgs && args )

Definition at line 43 of file ConstructModels.h.

45{
46 return Tuple{constructModel<Models>(args)...};
47}
Model constructModel(TupleOfArgs &args)

References constructModel().

Referenced by ProcessLib::Graph::constructModels().

◆ getImpl()

template<typename T, typename Tuple, typename... Tuples>
auto & ProcessLib::Graph::detail::getImpl ( Tuple & t,
Tuples &... ts )

Definition at line 15 of file Get.h.

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}
auto & getImpl(Tuple &t, Tuples &... ts)
Definition Get.h:15

References getImpl().

Referenced by ProcessLib::Graph::get(), and getImpl().

◆ isEvalOrderCorrectRT() [1/2]

template<typename... Models>
bool ProcessLib::Graph::detail::isEvalOrderCorrectRT ( boost::mp11::mp_list< Models... > ,
std::unordered_set< std::type_index > && computed_data )

Definition at line 93 of file CheckEvalOrderRT.h.

95{
96 return (isEvalOrderCorrectRT<Models>(computed_data) && ...);
97}
bool isEvalOrderCorrectRT(std::unordered_set< std::type_index > &computed_data)

References isEvalOrderCorrectRT().

◆ isEvalOrderCorrectRT() [2/2]

template<typename Model>
bool ProcessLib::Graph::detail::isEvalOrderCorrectRT ( std::unordered_set< std::type_index > & computed_data)

Definition at line 39 of file CheckEvalOrderRT.h.

40{
41 using namespace boost::mp11;
42
43 using ModelArgs =
44 typename GetFunctionArgumentTypes<decltype(&Model::eval)>::type;
45 using ModelInputs = mp_filter<IsInputArgument, ModelArgs>;
46 using ModelOutputs = mp_filter<IsOutputArgument, ModelArgs>;
47
48 using ModelInputsWrapped = mp_transform<mp_identity, ModelInputs>;
49
50 // Check that all inputs have already been computed before.
51 bool all_inputs_computed = true;
52 mp_for_each<ModelInputsWrapped>(
53 [&computed_data,
54 &all_inputs_computed]<typename Input>(mp_identity<Input>)
55 {
56 if (!computed_data.contains(std::type_index{typeid(Input)}))
57 {
58 ERR("Input {} of model {} has not been computed/set before the "
59 "model evaluation.",
62 all_inputs_computed = false;
63 }
64 });
65 if (!all_inputs_computed)
66 {
67 return false;
68 }
69
70 using ModelOutputsWrapped = mp_transform<mp_identity, ModelOutputs>;
71
72 // All outputs are "computed data", now.
73 bool no_output_precomputed = true;
74 mp_for_each<ModelOutputsWrapped>(
75 [&computed_data,
76 &no_output_precomputed]<typename Output>(mp_identity<Output>)
77 {
78 auto const [it, emplaced] = computed_data.emplace(typeid(Output));
79
80 if (!emplaced)
81 {
82 ERR("Output {} of model {} is computed more than once.",
85 no_output_precomputed = false;
86 }
87 });
88
89 return no_output_precomputed;
90}
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
std::string typeToString()

References ERR(), and BaseLib::typeToString().

Referenced by isEvalOrderCorrectRT(), and ProcessLib::Graph::isEvalOrderCorrectRT().

◆ unpackAndInvoke() [1/5]

template<typename Result, typename... Args, typename... Tuples, typename... FunctionArgumentTypesPlain>
Result ProcessLib::Graph::detail::unpackAndInvoke ( boost::mp11::mp_list< FunctionArgumentTypesPlain... > ,
Result(* fct )(Args...),
Tuples &... ts )

Definition at line 149 of file Apply.h.

152{
154}
auto & get(Tuples &... ts)
Definition Get.h:53

References ProcessLib::Graph::get().

◆ unpackAndInvoke() [2/5]

template<typename Object, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
auto ProcessLib::Graph::detail::unpackAndInvoke ( boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... > ,
Object && o,
Tuples &... ts ) -> typename GetFunctionReturnType< decltype(&std::decay_t<Object>::operator())>::type

Definition at line 85 of file Apply.h.

91{
92 return o(
94}

References ProcessLib::Graph::get().

Referenced by applyImpl().

◆ unpackAndInvoke() [3/5]

template<typename Result, typename Object, typename... Args, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
Result ProcessLib::Graph::detail::unpackAndInvoke ( boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... > ,
Result(Object::* )(Args...) const,
Object const & o,
Tuples &... ts )

Definition at line 134 of file Apply.h.

139{
140 return (o.*m)(
142}

References ProcessLib::Graph::get().

◆ unpackAndInvoke() [4/5]

template<typename Result, typename Object, typename... Args, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
Result ProcessLib::Graph::detail::unpackAndInvoke ( boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... > ,
Result(Object::* )(Args...),
Object && o,
Tuples &... ts )

Definition at line 118 of file Apply.h.

123{
124 return (o.*m)(
126}

References ProcessLib::Graph::get().

◆ unpackAndInvoke() [5/5]

template<typename Result, typename Object, typename... Args, typename... Tuples, typename... MemberFunctionArgumentTypesPlain>
Result ProcessLib::Graph::detail::unpackAndInvoke ( boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... > ,
Result(Object::* )(Args...),
Object & o,
Tuples &... ts )

Definition at line 102 of file Apply.h.

107{
108 return (o.*m)(
110}

References ProcessLib::Graph::get().