7#include "fixed_string.hpp"
9#include "../macros.hpp"
11#include "debugger.hpp"
12#include "exception.hpp"
17hi_export_module(hikogui.utility.reflection);
19hi_export
namespace hi {
inline namespace v1 {
25 [[
nodiscard]]
constexpr operator T()
const noexcept
33template<
typename T,
typename... C>
36 static_assert(std::is_trivially_constructible_v<T>);
39 if constexpr (
sizeof...(C) <
sizeof(T)) {
40 if constexpr (
constexpr auto next = count_data_members<T, C...,
convertible_to_any>()) {
47 if constexpr (
requires { T{C{}...}; }) {
56[[
nodiscard]]
constexpr std::string_view type_name_token(std::string_view str)
noexcept
58 for (
auto i = 0
_uz; i != str.size(); ++i) {
61 if (
not((c >=
'a' and c <=
'z')
or (c >=
'A' and c <=
'Z')
or (c >=
'0' and c <=
'9')
or c ==
'_')) {
63 return str.substr(0, i + 1);
72 if (type_name ==
"std::basic_string<char,std::char_traits<char>,std::allocator<char>>") {
74 }
else if (type_name ==
"std::basic_string<char,std::char_traits<char>,std::allocator<char>>&") {
75 return "std::string&";
76 }
else if (type_name ==
"const std::basic_string<char,std::char_traits<char>,std::allocator<char>>&") {
77 return "const std::string&";
83#if HI_COMPILER == HI_CC_MSVC
92 auto first = signature.
find(
"type_name<");
93 hi_assert(first != std::string_view::npos);
96 auto last = signature.rfind(
'>');
97 hi_assert(last != std::string_view::npos);
99 signature = signature.substr(first, last - first);
102 while (
not signature.empty()) {
103 if (signature.starts_with(
"class ")) {
104 signature = signature.
substr(6);
105 }
else if (signature.starts_with(
"struct ")) {
106 signature = signature.substr(7);
107 }
else if (signature.starts_with(
" >")) {
109 signature = signature.substr(2);
110 }
else if (signature.starts_with(
" *")) {
112 signature = signature.substr(2);
114 auto token = type_name_token(signature);
116 signature = signature.substr(token.size());
120 return type_name_short_hand(r);
123#error "_type_name() not implemented for this compiler."
134template<
size_t Index,
typename Type>
135constexpr decltype(
auto) get_data_member(Type&& rhs)
noexcept
137#define HI_X_FORWARD(x) forward_like<Type>(x),
142 hi_static_no_default();
145#define HI_X(count, ...) \
146 } else if constexpr (number_of_members == count) { \
147 auto&& [__VA_ARGS__] = rhs; \
148 return std::get<Index>(std::forward_as_tuple(hi_for_each(HI_X_FORWARD, __VA_ARGS__) 0));
155 HI_X( 6, a,b,c,d,e,f)
156 HI_X( 7, a,b,c,d,e,f,g)
157 HI_X( 8, a,b,c,d,e,f,g,h)
158 HI_X( 9, a,b,c,d,e,f,g,h,i)
159 HI_X(10, a,b,c,d,e,f,g,h,i,
j)
160 HI_X(11, a,b,c,d,e,f,g,h,i,
j,k)
161 HI_X(12, a,b,c,d,e,f,g,h,i,
j,k,
l)
162 HI_X(13, a,b,c,d,e,f,g,h,i,
j,k,
l,m)
163 HI_X(14, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n)
164 HI_X(15, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o)
165 HI_X(16, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p)
166 HI_X(17, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q)
167 HI_X(18, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r)
168 HI_X(19, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s)
169 HI_X(20, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t)
170 HI_X(21, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u)
171 HI_X(22, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v)
172 HI_X(23, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w)
173 HI_X(24, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x)
174 HI_X(25, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y)
175 HI_X(26, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z)
176 HI_X(27, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A)
177 HI_X(28, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B)
178 HI_X(29, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C)
179 HI_X(30, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D)
180 HI_X(31, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E)
181 HI_X(32, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F)
182 HI_X(33, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G)
183 HI_X(34, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H)
184 HI_X(35, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I)
185 HI_X(36, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J)
186 HI_X(37, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K)
187 HI_X(38, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L)
188 HI_X(39, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M)
189 HI_X(40, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N)
190 HI_X(41, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O)
191 HI_X(42, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P)
192 HI_X(43, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q)
193 HI_X(44, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R)
194 HI_X(45, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S)
195 HI_X(46, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T)
196 HI_X(47, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U)
197 HI_X(48, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V)
198 HI_X(49, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W)
199 HI_X(50, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X)
200 HI_X(51, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y)
201 HI_X(52, a,b,c,d,e,f,g,h,i,
j,k,
l,m,n,o,p,
q,r,s,t,
u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z)
205 hi_static_not_implemented();
215 return hi_to_fixed_string(detail::type_name<T>());
Utilities to assert and bound check.
DOXYGEN BUG.
Definition algorithm.hpp:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
A type that can be implicitly converted to any type.
Definition reflection.hpp:23
Definition reflection.hpp:129