DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
ObjectUtils.hpp
Go to the documentation of this file.
1#pragma once
2/// @file ObjectUtils.hpp
3/// @brief Tiny reflection-style helpers (@ref DNDS::MemberRef "MemberRef", @ref DNDS::MemberPtr "MemberPtr") and
4/// `for_each_member_*` visitors used by config / serializer code to iterate
5/// struct members with their names.
6
7#include "Defines.hpp"
8#include <tuple>
9// #include <boost/preprocessor.hpp>
10
11namespace DNDS
12{
13 /// @brief Invoke `f(member)` for every element of a `std::tuple` of members.
14 /// @details Companion to @ref DNDS::MemberRef "MemberRef" / @ref DNDS::MemberPtr "MemberPtr" below; used to build
15 /// auto-generated JSON / diagnostic dumps of struct contents.
16 template <typename TList, typename F>
17 void for_each_member_list(TList &&obj_member_list, F &&f)
18 {
19 std::apply([&](auto &...members)
20 { (f(members), ...); }, obj_member_list);
21 }
22
23 /// @brief Simple `{reference, name}` bundle for a struct member.
24 /// @details Produced by @ref DNDS_MAKE_1_MEMBER_REF from a variable name;
25 /// consumed by `for_each_member_list`.
26 template <typename T>
27 struct MemberRef
28 {
29 T &ref; ///< Reference to the member.
30 const char *name; ///< Compile-time-known member name.
31 };
32
33 template <typename T>
34 MemberRef(T &, const char *) -> MemberRef<T>;
35
36/// @brief Construct a @ref DNDS::MemberRef "MemberRef" capturing `x` and its stringified name.
37#define DNDS_MAKE_1_MEMBER_REF(x) \
38 MemberRef { x, #x }
39
40 /// @brief Invoke `f(name, obj.*ptr)` for every member in a list of @ref DNDS::MemberPtr "MemberPtr".
41 template <typename Class, typename TList, typename F>
42 void for_each_member_ptr_list(Class &obj, TList &&obj_member_ptr_list, F &&f)
43 {
44 std::apply([&](auto &...member_ptr)
45 { (f(member_ptr.name, obj.*(member_ptr.ptr)), ...); }, obj_member_ptr_list);
46 }
47
48 /// @brief Low-level variant that passes each @ref DNDS::MemberPtr "MemberPtr" object through
49 /// to `f` directly (for callers that need access to both `ptr` and `name`).
50 template <typename TList, typename F>
51 void for_each_member_ptr_list_raw(TList &&obj_member_ptr_list, F &&f)
52 {
53 std::apply([&](auto &...members)
54 { (f(members), ...); }, obj_member_ptr_list);
55 }
56
57 /// @brief Pointer-to-member wrapper with a symbolic name; the pointer-based
58 /// cousin of @ref DNDS::MemberRef "MemberRef" used when the object is known only at visit time.
59 template <typename Class, typename T>
60 struct MemberPtr
61 {
62 using t_member_ptr = T Class::*;
63 t_member_ptr ptr; ///< Pointer-to-member.
64 const char *name; ///< Compile-time-known member name.
65 };
66
67 template <typename Class, typename T>
68 MemberPtr(T Class::*, const char *) -> MemberPtr<Class, T>;
69
70/// @brief Build a @ref DNDS::MemberPtr "MemberPtr" for `Class::member`.
71#define DNDS_MAKE_1_MEMBER_PTR(Class, member) \
72 MemberPtr { &Class::member, #member }
73
74/// @brief Like @ref DNDS_MAKE_1_MEMBER_PTR but uses the surrounding `t_self` alias,
75/// common in DNDSR member definitions (`using t_self = ...;`).
76#define DNDS_MAKE_1_MEMBER_PTR_SELF(member) \
77 MemberPtr { &t_self::member, #member }
78}
Core type aliases, constants, and metaprogramming utilities for the DNDS framework.
the host side operators are provided as implemented
void for_each_member_ptr_list(Class &obj, TList &&obj_member_ptr_list, F &&f)
Invoke f(name, obj.*ptr) for every member in a list of MemberPtr.
void for_each_member_ptr_list_raw(TList &&obj_member_ptr_list, F &&f)
Low-level variant that passes each MemberPtr object through to f directly (for callers that need acce...
void for_each_member_list(TList &&obj_member_list, F &&f)
Invoke f(member) for every element of a std::tuple of members.
Pointer-to-member wrapper with a symbolic name; the pointer-based cousin of MemberRef used when the o...
t_member_ptr ptr
Pointer-to-member.
const char * name
Compile-time-known member name.
T Class::* t_member_ptr
Simple {reference, name} bundle for a struct member.
const char * name
Compile-time-known member name.
T & ref
Reference to the member.