di 0.1.0
Loading...
Searching...
No Matches
reflect.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/algorithm.h"
5#include "di/meta/core.h"
6#include "di/reflect/atom.h"
8#include "di/reflect/field.h"
9#include "di/types/prelude.h"
11
12namespace di::concepts {
13template<typename T>
16}
17
18namespace di::reflection {
19namespace detail {
20 struct ReflectFunction {
21 template<typename T, typename U = meta::RemoveCVRef<T>>
23 constexpr auto operator()(InPlaceType<T>) const -> decltype(auto) {
25 static_assert(concepts::ReflectionValue<R>, "Reflect function must return fields or an atom");
27 }
28
29 template<typename T, typename U = meta::RemoveCVRef<T>>
31 (concepts::SameAs<U, bool> || concepts::Integer<U> || concepts::detail::ConstantString<U> ||
33 requires { typename U::IsAtom; }))
34 constexpr auto operator()(InPlaceType<T>) const -> decltype(auto) {
35 return Atom<U> {};
36 }
37
38 template<typename T, typename U = meta::RemoveCVRef<T>>
41 constexpr auto operator()(T&&) const -> decltype(auto) {
42 return (*this)(in_place_type<U>);
43 }
44 };
45}
46
47constexpr inline auto reflect = detail::ReflectFunction {};
48}
49
50namespace di::concepts {
51template<typename T>
52concept Reflectable = requires {
54};
55
56template<typename T>
60
61template<typename T>
65
66template<typename T>
70}
71
72namespace di::meta {
73template<concepts::Reflectable T>
75}
76
77namespace di {
82using meta::Reflect;
84}
Definition container.h:8
Definition core.h:139
Definition language.h:215
Definition reflect.h:57
Definition reflect.h:62
Definition reflect.h:52
Definition reflect.h:14
Definition core.h:114
Definition tag_invoke.h:33
Definition tuple_like.h:38
Definition variant_like.h:37
Definition any_storable.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition merge_interfaces.h:6
decltype(reflection::reflect(in_place_type< T >)) Reflect
Definition reflect.h:74
decltype(di::function::tag_invoke(util::declval< Tag >(), util::declval< Args >()...)) TagInvokeResult
Definition tag_invoke.h:40
Definition atom.h:10
constexpr auto reflect
Definition reflect.h:47
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition any_storable.h:9
constexpr auto in_place_type
Definition in_place_type.h:12
Definition atom.h:12
Definition in_place_type.h:5