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>
34[[nodiscard]]
constexpr size_t count_data_members() noexcept
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);
70[[nodiscard]]
constexpr std::string type_name_short_hand(std::string_view type_name)
noexcept
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&";
79 return std::string{type_name};
83#if HI_COMPILER == HI_CC_MSVC
85[[nodiscard]]
constexpr std::string type_name() noexcept
89 auto signature = std::string_view{__FUNCSIG__};
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);
101 auto r = std::string{};
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),
141 if constexpr (number_of_members == 0) {
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();
213[[nodiscard]]
constexpr auto type_name() noexcept
215 return hi_to_fixed_string(detail::type_name<T>());
Utilities to assert and bound check.
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
The HikoGUI API version 1.
Definition lookahead_iterator.hpp:6
A type that can be implicitly converted to any type.
Definition reflection.hpp:23
Definition reflection.hpp:129