OGS
ReflectionData.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 <string>
7#include <tuple>
8
10{
19template <typename Class, typename Accessor>
21{
22 static_assert(std::is_same_v<Accessor, std::remove_cvref_t<Accessor>>);
23 static_assert(std::is_invocable_v<Accessor, Class&>);
24 static_assert(std::is_invocable_v<Accessor, Class const&>);
25 static_assert(
26 std::is_lvalue_reference_v<std::invoke_result_t<Accessor, Class&>>);
27 static_assert(std::is_lvalue_reference_v<
28 std::invoke_result_t<Accessor, Class const&>>);
29
30 ReflectionData(std::string name, Accessor&& accessor)
31 : name(std::move(name)), accessor(std::move(accessor))
32 {
33 }
34
35 explicit ReflectionData(Accessor&& accessor) : accessor(std::move(accessor))
36 {
37 }
38
39 std::string name;
40 Accessor accessor;
41};
42
43template <typename Class, typename Accessor>
44auto makeReflectionData(Accessor&& accessor)
45{
47 std::forward<Accessor>(accessor)};
48}
49
50template <typename Class, typename Accessor>
51auto makeReflectionData(std::string name, Accessor&& accessor)
52{
54 std::move(name), std::forward<Accessor>(accessor)};
55}
56
57template <typename Class, typename Member>
58auto makeReflectionData(Member Class::*member)
59{
60 return makeReflectionData<Class>([member](auto& obj) -> auto&
61 { return obj.*member; });
62}
63
64template <typename Class, typename Member>
65auto makeReflectionData(std::string name, Member Class::*member)
66{
68 std::move(name), [member](auto& obj) -> auto& { return obj.*member; });
69}
70
71template <typename Class, typename Member>
72auto reflectWithName(std::string name, Member Class::*member)
73{
74 return std::tuple{makeReflectionData(std::move(name), member)};
75}
76
77template <typename Class, typename... Accessors>
78auto reflectWithoutName(Accessors&&... accessors)
79{
80 return std::tuple{
81 makeReflectionData<Class>(std::forward<Accessors>(accessors))...};
82}
83
84template <typename Class, typename... Members>
85auto reflectWithoutName(Members Class::*... members)
86{
87 return std::tuple{makeReflectionData<Class>(members)...};
88}
89} // namespace ProcessLib::Reflection
auto reflectWithName(std::string name, Member Class::*member)
auto makeReflectionData(Accessor &&accessor)
auto reflectWithoutName(Accessors &&... accessors)
ReflectionData(std::string name, Accessor &&accessor)