24#include "AstUtil/StringView.hpp"
25#include "AstUtil/Dimension.hpp"
38 using output_type = T;
45 using output_type = std::string;
58typedef errc_t (*FPropertyGet)(
const void* obj,
void* value);
59typedef errc_t (*FPropertySet)(
void* obj,
void const* value);
105A_ALWAYS_INLINE
Property* _aNewProperty(FPropertyGet getter, FPropertySet setter);
115A_ALWAYS_INLINE
Property* _aNewProperty<bool>(FPropertyGet getter, FPropertySet setter)
126A_ALWAYS_INLINE
Property* _aNewProperty<int>(FPropertyGet getter, FPropertySet setter)
137A_ALWAYS_INLINE
Property* _aNewProperty<double>(FPropertyGet getter, FPropertySet setter)
149A_ALWAYS_INLINE
Property* _aNewProperty<std::string>(FPropertyGet getter, FPropertySet setter)
160template<
typename T,
bool T::* Member>
164 [](
const void* obj,
void* value) -> errc_t
166 *((
bool*)value) = ((T*)obj)->*Member;
169 [](
void* obj,
const void* value) -> errc_t
171 ((T*)obj)->*Member = *((
bool*)value);
184template<
typename T,
bool T::* Member>
187 return aNewPropertyBoolMem<T, Member>();
191template<
typename T,
int T::* Member>
192A_ALWAYS_INLINE Property* aNewPropertyIntMem()
194 return _aNewPropertyInt(
195 [](
const void* obj,
void* value) -> errc_t
197 *((
int*)value) = ((T*)obj)->*Member;
200 [](
void* obj,
const void* value) -> errc_t
202 ((T*)obj)->*Member = *((
int*)value);
210template<
typename T,
int T::* Member>
211A_ALWAYS_INLINE Property* aNewPropertyInt()
213 return aNewPropertyIntMem<T, Member>();
217template<
typename T,
double T::* Member>
218A_ALWAYS_INLINE Property* aNewPropertyDoubleMem()
221 [](
const void* obj,
void* value) -> errc_t
223 *((
double*)value) = ((T*)obj)->*Member;
226 [](
void* obj,
const void* value) -> errc_t
228 ((T*)obj)->*Member = *((
double*)value);
241template<
typename T,
double T::* Member>
244 return aNewPropertyDoubleMem<T, Member>();
249template<
typename T,
double T::* Member>
250A_ALWAYS_INLINE Property* aNewPropertyQuantityMem(Dimension dimension)
252 return _aNewPropertyDouble(
253 [](
const void* obj,
void* value) -> errc_t
255 *((
double*)value) = ((T*)obj)->*Member;
258 [](
void* obj,
const void* value) -> errc_t
260 ((T*)obj)->*Member = *((
double*)value);
274template<
typename T,
double T::* Member>
277 return aNewPropertyQuantityMem<T, Member>(dimension);
280template<
typename T, std::
string T::* Member>
281A_ALWAYS_INLINE Property* aNewPropertyStringMem()
283 return _aNewPropertyString(
284 [](
const void* obj,
void* value) -> errc_t
286 *((std::string*)value) = ((T*)obj)->*Member;
289 [](
void* obj,
const void* value) -> errc_t
291 ((T*)obj)->*Member = std::string(*((
typename property_trait<std::string>::input_type*)value));
298template<
typename T, std::
string T::* Member>
301 return aNewPropertyStringMem<T, Member>();
311template<
typename T,
bool(T::* Getter) () const>
312A_ALWAYS_INLINE Property* aNewPropertyBool()
314 return _aNewPropertyBool(
315 [](
const void* obj,
void* value) -> errc_t
317 *((
bool*)value) = (((T*)obj)->*Getter)();
325template<
typename T,
int(T::* Getter) () const>
326A_ALWAYS_INLINE Property* aNewPropertyInt()
329 [](
const void* obj,
void* value) -> errc_t
331 *((
int*)value) = (((T*)obj)->*Getter)();
345template<
typename T,
double (T::* Getter) () const>
348 static_assert(Getter!=
nullptr,
"invalid getter");
351 [](
const void* obj,
void* value) -> errc_t
353 *((
double*)value) = (((T*)obj)->*Getter)();
366template<
typename T,
double (T::* Getter) () const>
369 static_assert(Getter!=
nullptr,
"invalid getter");
372 [](
const void* obj,
void* value) -> errc_t
374 *((
double*)value) = (((T*)obj)->*Getter)();
388template<
typename T, std::
string(T::*Getter)() const>
392 [](
const void* obj,
void* value) -> errc_t
394 *((std::string*)value) = (((T*)obj)->*Getter)();
402template<
typename T,
bool (T::* Getter) () const,
void (T::* Setter)(
bool)>
406 [](
const void* obj,
void* value) -> errc_t
408 *((
bool*)value) = (((T*)obj)->*Getter)();
411 [](
void* obj,
const void* value) -> errc_t
413 static_assert(Setter!=
nullptr,
"invalid setter");
414 (((T*)obj)->*Setter)(*((
bool*)value));
428template<
typename T,
int(T::* Getter) () const,
void (T::* Setter)(
int)>
431 static_assert(Getter!=
nullptr,
"invalid getter");
432 static_assert(Setter!=
nullptr,
"invalid setter");
435 [](
const void* obj,
void* value) -> errc_t
437 *((
int*)value) = (((T*)obj)->*Getter)();
440 [](
void* obj,
const void* value) -> errc_t
442 (((T*)obj)->*Setter)(*((
int*)value));
455template<
typename T,
double (T::* Getter) () const,
void (T::* Setter)(
double)>
458 static_assert(Getter!=
nullptr,
"invalid getter");
459 static_assert(Setter!=
nullptr,
"invalid setter");
462 [](
const void* obj,
void* value) -> errc_t
464 *((
double*)value) = (((T*)obj)->*Getter)();
467 [](
void* obj,
const void* value) -> errc_t
469 (((T*)obj)->*Setter)(*((
double*)value));
481template<
typename T,
double (T::* Getter) () const,
void (T::* Setter)(
double)>
484 static_assert(Getter!=
nullptr,
"invalid getter");
485 static_assert(Setter!=
nullptr,
"invalid setter");
488 [](
const void* obj,
void* value) -> errc_t
490 *((
double*)value) = (((T*)obj)->*Getter)();
493 [](
void* obj,
const void* value) -> errc_t
495 (((T*)obj)->*Setter)(*((
double*)value));
503template<
typename T, const std::
string& (T::* Getter) () const,
void (T::* Setter)(StringView)>
506 static_assert(Getter!=
nullptr,
"invalid getter");
507 static_assert(Setter!=
nullptr,
"invalid setter");
510 [](
const void* obj,
void* value) -> errc_t
512 *((std::string*)value) = (((T*)obj)->*Getter)();
515 [](
void* obj,
const void* value) -> errc_t
517 (((T*)obj)->*Setter)(*((
typename property_trait<std::string>::input_type*)value));
531template<
typename T,
bool (T::* Getter) () const, errc_t (T::* Setter)(
bool)>
532A_ALWAYS_INLINE Property* aNewPropertyBool()
534 return _aNewPropertyBool(
535 [](
const void* obj,
void* value) -> errc_t
537 *((
bool*)value) = (((T*)obj)->*Getter)();
540 [](
void* obj,
const void* value) -> errc_t
542 static_assert(Setter!=
nullptr,
"invalid setter");
543 return (((T*)obj)->*Setter)(*((
bool*)value));
556template<
typename T,
int (T::* Getter) () const, errc_t (T::* Setter)(
int)>
557A_ALWAYS_INLINE Property* aNewPropertyInt()
559 static_assert(Getter!=
nullptr,
"invalid getter");
560 static_assert(Setter!=
nullptr,
"invalid setter");
563 [](
const void* obj,
void* value) -> errc_t
565 *((
int*)value) = (((T*)obj)->*Getter)();
568 [](
void* obj,
const void* value) -> errc_t
570 return (((T*)obj)->*Setter)(*((
int*)value));
582template<
typename T,
double (T::* Getter) () const, errc_t (T::* Setter)(
double)>
585 static_assert(Getter!=
nullptr,
"invalid getter");
586 static_assert(Setter!=
nullptr,
"invalid setter");
589 [](
const void* obj,
void* value) -> errc_t
591 *((
double*)value) = (((T*)obj)->*Getter)();
594 [](
void* obj,
const void* value) -> errc_t
596 return (((T*)obj)->*Setter)(*((
double*)value));
608template<
typename T,
double (T::* Getter) () const, errc_t (T::* Setter)(
double)>
611 static_assert(Getter!=
nullptr,
"invalid getter");
612 static_assert(Setter!=
nullptr,
"invalid setter");
615 [](
const void* obj,
void* value) -> errc_t
617 *((
double*)value) = (((T*)obj)->*Getter)();
620 [](
void* obj,
const void* value) -> errc_t
622 return (((T*)obj)->*Setter)(*((
double*)value));
634template<
typename T, const std::
string& (T::* Getter) () const, errc_t (T::* Setter)(StringView)>
637 static_assert(Getter!=
nullptr,
"invalid getter");
638 static_assert(Setter!=
nullptr,
"invalid setter");
641 [](
const void* obj,
void* value) -> errc_t
643 *((std::string*)value) = (((T*)obj)->*Getter)();
646 [](
void* obj,
const void* value) -> errc_t
648 return (((T*)obj)->*Setter)(*((
typename property_trait<std::string>::input_type*)value));
绝对时间点
定义 TimePoint.hpp:106
Property * _aNewPropertyBool(FPropertyGet getter, FPropertySet setter)
创建一个布尔属性
定义 ReflectAPI.cpp:33
A_ALWAYS_INLINE Property * aNewPropertyQuantity(Dimension dimension)
创建一个数量值属性
定义 ReflectAPI.hpp:275
Property * _aNewPropertyString(FPropertyGet getter, FPropertySet setter)
创建一个字符串属性
定义 ReflectAPI.cpp:48
Property * _aNewPropertyQuantity(FPropertyGet getter, FPropertySet setter, Dimension dimension)
创建一个量纲属性
定义 ReflectAPI.cpp:53
A_ALWAYS_INLINE Property * aNewPropertyString()
创建一个字符串属性
定义 ReflectAPI.hpp:299
A_ALWAYS_INLINE Property * aNewPropertyDouble()
创建一个双精度属性
定义 ReflectAPI.hpp:242
A_ALWAYS_INLINE Property * aNewPropertyBool()
创建一个布尔属性
定义 ReflectAPI.hpp:185
Property * _aNewPropertyInt(FPropertyGet getter, FPropertySet setter)
创建一个整数属性
定义 ReflectAPI.cpp:38
Property * _aNewPropertyDouble(FPropertyGet getter, FPropertySet setter)
创建一个双精度属性
定义 ReflectAPI.cpp:43
A_ALWAYS_INLINE Property * aNewPropertyBoolMem()
创建一个布尔属性
定义 ReflectAPI.hpp:161