24#include "AstUtil/StringView.hpp"
25#include "AstUtil/Dimension.hpp"
38using FPropertyGetItemByString = errc_t (*)(
const void* obj,
StringView key,
Object*& value);
39using FPropertyGetItemByIndex = errc_t (*)(
const void* obj,
size_t key,
Object*& value);
62 using output_type = T;
69 using output_type = std::string;
90 return _aNewPropertyBool(getter, setter);
94inline Property* _aNewProperty<int>(FPropertyGet getter, FPropertySet setter)
96 return _aNewPropertyInt(getter, setter);
100inline Property* _aNewProperty<double>(FPropertyGet getter, FPropertySet setter)
102 return _aNewPropertyDouble(getter, setter);
106inline Property* _aNewProperty<std::string>(FPropertyGet getter, FPropertySet setter)
108 return _aNewPropertyString(getter, setter);
123 template<
typename T,
typename ValueType,
typename Tag>
127 template<
typename T,
typename ValueType>
130 template<ValueType T::*Member>
133 return [](
const void* obj,
void* value) -> errc_t
135 *
static_cast<ValueType*
>(value) =
static_cast<const T*
>(obj)->*Member;
140 template<ValueType T::*Member>
143 return [](
void* obj,
const void* value) -> errc_t
145 using InputType =
typename property_trait<ValueType>::input_type;
146 static_cast<T*
>(obj)->*Member = ValueType(*
static_cast<const InputType*
>(value));
153 template<
typename T,
typename ValueType>
156 template<ValueType (T::*Getter)() const>
159 return [](
const void* obj,
void* value) -> errc_t
161 *
static_cast<ValueType*
>(value) = (
static_cast<const T*
>(obj)->*Getter)();
170 template<
typename T,
typename ValueType>
173 template<ValueType (T::*Getter)() const>
176 return [](
const void* obj,
void* value) -> errc_t
178 *
static_cast<ValueType*
>(value) = (
static_cast<const T*
>(obj)->*Getter)();
183 template<
void (T::*Setter)(ValueType)>
186 return [](
void* obj,
const void* value) -> errc_t
188 (
static_cast<T*
>(obj)->*Setter)(*
static_cast<const ValueType*
>(value));
195 template<
typename T,
typename ValueType>
198 template<ValueType (T::*Getter)() const>
201 return [](
const void* obj,
void* value) -> errc_t
203 *
static_cast<ValueType*
>(value) = (
static_cast<const T*
>(obj)->*Getter)();
208 template<errc_t (T::*Setter)(ValueType)>
211 return [](
void* obj,
const void* value) -> errc_t
213 return (
static_cast<T*
>(obj)->*Setter)(*
static_cast<const ValueType*
>(value));
222 template<const std::
string& (T::*Getter)() const>
225 return [](
const void* obj,
void* value) -> errc_t
227 *
static_cast<std::string*
>(value) = (
static_cast<const T*
>(obj)->*Getter)();
232 template<
void (T::*Setter)(StringView)>
235 return [](
void* obj,
const void* value) -> errc_t
237 (
static_cast<T*
>(obj)->*Setter)(*
static_cast<const StringView*
>(value));
246 template<const std::
string& (T::*Getter)() const>
249 return [](
const void* obj,
void* value) -> errc_t
251 *
static_cast<std::string*
>(value) = (
static_cast<const T*
>(obj)->*Getter)();
256 template<errc_t (T::*Setter)(StringView)>
259 return [](
void* obj,
const void* value) -> errc_t
261 return (
static_cast<T*
>(obj)->*Setter)(*
static_cast<const StringView*
>(value));
270 template<std::
string (T::*Getter)() const>
273 return [](
const void* obj,
void* value) -> errc_t
275 *
static_cast<std::string*
>(value) = (
static_cast<const T*
>(obj)->*Getter)();
280 template<
void (T::*Setter)(StringView)>
283 return [](
void* obj,
const void* value) -> errc_t
285 (
static_cast<T*
>(obj)->*Setter)(*
static_cast<const StringView*
>(value));
290 template<errc_t (T::*Setter)(StringView)>
293 return [](
void* obj,
const void* value) -> errc_t
295 return (
static_cast<T*
>(obj)->*Setter)(*
static_cast<const StringView*
>(value));
309template<
typename T,
typename MemberType, MemberType T::*Member>
310A_ALWAYS_INLINE
Property* aNewPropertyMem()
312 using ValueType =
typename std::decay<MemberType>::type;
314 return _aNewProperty<ValueType>(
315 Builder::template makeGetter<Member>(),
316 Builder::template makeSetter<Member>()
323template<
typename T,
typename Ret, Ret (T::*Getter)() const>
324A_ALWAYS_INLINE Property* aNewPropertyReadOnly()
326 using ValueType =
typename std::decay<Ret>::type;
327 using Builder = detail::PropertyBuilder<T, ValueType, detail::GetterOnlyTag>;
328 return _aNewProperty<ValueType>(
329 Builder::template makeGetter<Getter>(),
339 Ret (T::*Getter)()
const,
340 void (T::*Setter)(Ret)>
341A_ALWAYS_INLINE Property* aNewProperty()
343 using ValueType =
typename std::decay<Ret>::type;
344 using Builder = detail::PropertyBuilder<T, ValueType, detail::GetterVoidSetterTag>;
345 return _aNewProperty<ValueType>(
346 Builder::template makeGetter<Getter>(),
347 Builder::template makeSetter<Setter>()
356 Ret (T::*Getter)()
const,
357 errc_t (T::*Setter)(Ret)>
358A_ALWAYS_INLINE Property* aNewPropertyWithError()
360 using ValueType =
typename std::decay<Ret>::type;
361 using Builder = detail::PropertyBuilder<T, ValueType, detail::GetterErrorSetterTag>;
362 return _aNewProperty<ValueType>(
363 Builder::template makeGetter<Getter>(),
364 Builder::template makeSetter<Setter>()
370template<
typename T,
double T::*Member>
371A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim)
373 using Builder = detail::PropertyBuilder<T, double, detail::MemberPtrTag>;
374 return _aNewPropertyQuantity(
375 Builder::template makeGetter<Member>(),
376 Builder::template makeSetter<Member>(),
382template<
typename T,
double (T::*Getter)() const>
383A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim)
385 using Builder = detail::PropertyBuilder<T, double, detail::GetterOnlyTag>;
386 return _aNewPropertyQuantity(
387 Builder::template makeGetter<Getter>(),
395 double (T::*Getter)()
const,
396 void (T::*Setter)(double)>
397A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim)
399 using Builder = detail::PropertyBuilder<T, double, detail::GetterVoidSetterTag>;
400 return _aNewPropertyQuantity(
401 Builder::template makeGetter<Getter>(),
402 Builder::template makeSetter<Setter>(),
409 double (T::*Getter)()
const,
410 errc_t (T::*Setter)(double)>
411A_ALWAYS_INLINE Property* aNewPropertyQuantityWithError(Dimension dim)
413 using Builder = detail::PropertyBuilder<T, double, detail::GetterErrorSetterTag>;
414 return _aNewPropertyQuantity(
415 Builder::template makeGetter<Getter>(),
416 Builder::template makeSetter<Setter>(),
426template<
typename T,
typename ObjectType, ObjectType* T::*Member>
427A_ALWAYS_INLINE Property* aNewPropertyObject()
429 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::MemberPtrTag>;
430 return _aNewPropertyObject(
431 Builder::template makeGetter<Member>(),
432 Builder::template makeSetter<Member>(),
433 &ObjectType::staticType
438template<
typename T,
typename ObjectType, ObjectType* (T::*Getter)() const>
439A_ALWAYS_INLINE Property* aNewPropertyObject()
441 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::GetterOnlyTag>;
442 return _aNewPropertyObject(
443 Builder::template makeGetter<Getter>(),
445 &ObjectType::staticType
450template<
typename T,
typename ObjectType, ObjectType* (T::*Getter)() const,
void (T::*Setter)(ObjectType*)>
451A_ALWAYS_INLINE Property* aNewPropertyObject()
453 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::GetterVoidSetterTag>;
454 return _aNewPropertyObject(
455 Builder::template makeGetter<Getter>(),
456 Builder::template makeSetter<Setter>(),
457 &ObjectType::staticType
462template<
typename T,
typename ObjectType, ObjectType* (T::*Getter)() const, errc_t (T::*Setter)(ObjectType*)>
463A_ALWAYS_INLINE Property* aNewPropertyObjectWithError()
465 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::GetterErrorSetterTag>;
466 return _aNewPropertyObject(
467 Builder::template makeGetter<Getter>(),
468 Builder::template makeSetter<Setter>(),
469 &ObjectType::staticType
478template<
typename T,
bool T::*Member>
479A_ALWAYS_INLINE Property* aNewPropertyBoolMem() {
return aNewPropertyMem<T, bool, Member>(); }
480template<
typename T,
int T::*Member>
481A_ALWAYS_INLINE Property* aNewPropertyIntMem() {
return aNewPropertyMem<T, int, Member>(); }
482template<
typename T,
double T::*Member>
483A_ALWAYS_INLINE Property* aNewPropertyDoubleMem() {
return aNewPropertyMem<T, double, Member>(); }
484template<
typename T, std::
string T::*Member>
485A_ALWAYS_INLINE Property* aNewPropertyStringMem() {
return aNewPropertyMem<T, std::string, Member>(); }
487template<
typename T,
bool T::*Member>
488A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewPropertyBoolMem<T, Member>(); }
489template<
typename T,
int T::*Member>
490A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewPropertyIntMem<T, Member>(); }
491template<
typename T,
double T::*Member>
492A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewPropertyDoubleMem<T, Member>(); }
493template<
typename T, std::
string T::*Member>
494A_ALWAYS_INLINE Property* aNewPropertyString() {
return aNewPropertyStringMem<T, Member>(); }
496template<
typename T,
double T::*Member>
497A_ALWAYS_INLINE Property* aNewPropertyQuantityMem(Dimension dim) {
498 return aNewPropertyQuantity<T, Member>(dim);
502template<
typename T,
bool (T::*Getter)() const>
503A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewPropertyReadOnly<T, bool, Getter>(); }
504template<
typename T,
int (T::*Getter)() const>
505A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewPropertyReadOnly<T, int, Getter>(); }
506template<
typename T,
double (T::*Getter)() const>
507A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewPropertyReadOnly<T, double, Getter>(); }
508template<
typename T, std::
string (T::*Getter)() const>
509A_ALWAYS_INLINE Property* aNewPropertyString() {
return aNewPropertyReadOnly<T, std::string, Getter>(); }
514template<
typename T,
bool (T::*Getter)() const,
void (T::*Setter)(
bool)>
515A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewProperty<T, bool, Getter, Setter>(); }
516template<
typename T,
int (T::*Getter)() const,
void (T::*Setter)(
int)>
517A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewProperty<T, int, Getter, Setter>(); }
518template<
typename T,
double (T::*Getter)() const,
void (T::*Setter)(
double)>
519A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewProperty<T, double, Getter, Setter>(); }
521 const std::string& (T::*Getter)() const,
522 void (T::*Setter)(StringView)>
523A_ALWAYS_INLINE Property* aNewPropertyString()
525 using Builder = detail::PropertyBuilder<T, std::string, detail::GetterVoidSetterTag>;
526 return _aNewProperty<std::string>(
527 Builder::template makeGetter<Getter>(),
528 Builder::template makeSetter<Setter>()
534 std::string (T::*Getter)()
const,
535 void (T::*Setter)(StringView)>
536A_ALWAYS_INLINE Property* aNewPropertyString()
538 using Builder = detail::PropertyBuilderValueString<T>;
539 return _aNewProperty<std::string>(
540 Builder::template makeGetter<Getter>(),
541 Builder::template makeVoidSetter<Setter>()
547template<
typename T,
bool (T::*Getter)() const, errc_t (T::*Setter)(
bool)>
548A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewPropertyWithError<T, bool, Getter, Setter>(); }
549template<
typename T,
int (T::*Getter)() const, errc_t (T::*Setter)(
int)>
550A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewPropertyWithError<T, int, Getter, Setter>(); }
551template<
typename T,
double (T::*Getter)() const, errc_t (T::*Setter)(
double)>
552A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewPropertyWithError<T, double, Getter, Setter>(); }
554 const std::string& (T::*Getter)() const,
555 errc_t (T::*Setter)(StringView)>
556A_ALWAYS_INLINE Property* aNewPropertyString()
558 using Builder = detail::PropertyBuilder<T, std::string, detail::GetterErrorSetterTag>;
559 return _aNewProperty<std::string>(
560 Builder::template makeGetter<Getter>(),
561 Builder::template makeSetter<Setter>()
567 std::string (T::*Getter)()
const,
568 errc_t (T::*Setter)(StringView)>
569A_ALWAYS_INLINE Property* aNewPropertyString()
571 using Builder = detail::PropertyBuilderValueString<T>;
572 return _aNewProperty<std::string>(
573 Builder::template makeGetter<Getter>(),
574 Builder::template makeErrorSetter<Setter>()
578template<
typename T,
double (T::*Getter)() const, errc_t (T::*Setter)(
double)>
579A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim) {
580 return aNewPropertyQuantityWithError<T, Getter, Setter>(dim);
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:86
绝对时间点
定义 TimePoint.hpp:106
errc_t(*)(void *obj, const void *value) FPropertySet
设置属性值
定义 ReflectAPI.hpp:37
errc_t(*)(const void *obj, void *value) FPropertyGet
获取属性值
定义 ReflectAPI.hpp:36