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 using Builder = detail::PropertyBuilder<T, double, detail::MemberPtrTag>;
499 return _aNewPropertyQuantity(
500 Builder::template makeGetter<Member>(),
501 Builder::template makeSetter<Member>(),
507template<
typename T,
bool (T::*Getter)() const>
508A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewPropertyReadOnly<T, bool, Getter>(); }
509template<
typename T,
int (T::*Getter)() const>
510A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewPropertyReadOnly<T, int, Getter>(); }
511template<
typename T,
double (T::*Getter)() const>
512A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewPropertyReadOnly<T, double, Getter>(); }
513template<
typename T, std::
string (T::*Getter)() const>
514A_ALWAYS_INLINE Property* aNewPropertyString() {
return aNewPropertyReadOnly<T, std::string, Getter>(); }
519template<
typename T,
bool (T::*Getter)() const,
void (T::*Setter)(
bool)>
520A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewProperty<T, bool, Getter, Setter>(); }
521template<
typename T,
int (T::*Getter)() const,
void (T::*Setter)(
int)>
522A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewProperty<T, int, Getter, Setter>(); }
523template<
typename T,
double (T::*Getter)() const,
void (T::*Setter)(
double)>
524A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewProperty<T, double, Getter, Setter>(); }
526 const std::string& (T::*Getter)() const,
527 void (T::*Setter)(StringView)>
528A_ALWAYS_INLINE Property* aNewPropertyString()
530 using Builder = detail::PropertyBuilder<T, std::string, detail::GetterVoidSetterTag>;
531 return _aNewProperty<std::string>(
532 Builder::template makeGetter<Getter>(),
533 Builder::template makeSetter<Setter>()
539 std::string (T::*Getter)()
const,
540 void (T::*Setter)(StringView)>
541A_ALWAYS_INLINE Property* aNewPropertyString()
543 using Builder = detail::PropertyBuilderValueString<T>;
544 return _aNewProperty<std::string>(
545 Builder::template makeGetter<Getter>(),
546 Builder::template makeVoidSetter<Setter>()
552template<
typename T,
bool (T::*Getter)() const, errc_t (T::*Setter)(
bool)>
553A_ALWAYS_INLINE Property* aNewPropertyBool() {
return aNewPropertyWithError<T, bool, Getter, Setter>(); }
554template<
typename T,
int (T::*Getter)() const, errc_t (T::*Setter)(
int)>
555A_ALWAYS_INLINE Property* aNewPropertyInt() {
return aNewPropertyWithError<T, int, Getter, Setter>(); }
556template<
typename T,
double (T::*Getter)() const, errc_t (T::*Setter)(
double)>
557A_ALWAYS_INLINE Property* aNewPropertyDouble() {
return aNewPropertyWithError<T, double, Getter, Setter>(); }
559 const std::string& (T::*Getter)() const,
560 errc_t (T::*Setter)(StringView)>
561A_ALWAYS_INLINE Property* aNewPropertyString()
563 using Builder = detail::PropertyBuilder<T, std::string, detail::GetterErrorSetterTag>;
564 return _aNewProperty<std::string>(
565 Builder::template makeGetter<Getter>(),
566 Builder::template makeSetter<Setter>()
572 std::string (T::*Getter)()
const,
573 errc_t (T::*Setter)(StringView)>
574A_ALWAYS_INLINE Property* aNewPropertyString()
576 using Builder = detail::PropertyBuilderValueString<T>;
577 return _aNewProperty<std::string>(
578 Builder::template makeGetter<Getter>(),
579 Builder::template makeErrorSetter<Setter>()
583template<
typename T,
double (T::*Getter)() const, errc_t (T::*Setter)(
double)>
584A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim) {
585 return aNewPropertyQuantityWithError<T, Getter, Setter>(dim);
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:95
绝对时间点
定义 TimePoint.hpp:107
errc_t(*)(void *obj, const void *value) FPropertySet
设置属性值
定义 ReflectAPI.hpp:37
errc_t(*)(const void *obj, void *value) FPropertyGet
获取属性值
定义 ReflectAPI.hpp:36