Member.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /******************************************************************************
  2. Use 'MemberDesc' to describe a C++ structure/class member,
  3. including its type, size, and offset in the class.
  4. /******************************************************************************/
  5. enum DATA_TYPE : Byte // Data Type
  6. {
  7. DATA_NONE , // none
  8. DATA_CHAR , // Char[] 16-bit character array forming a text
  9. DATA_CHAR_PTR , // Char* pointer to 16-bit character array forming a text
  10. DATA_CHAR8 , // Char8[] 8-bit character array forming a text
  11. DATA_CHAR8_PTR, // Char8* pointer to 8-bit character array forming a text
  12. DATA_STR , // Str String with 16-bit per character
  13. DATA_STR8 , // Str8 String with 8-bit per character
  14. DATA_BOOL , // Bool boolean
  15. DATA_INT , // Int integer
  16. DATA_UINT , // UInt unsigned integer
  17. DATA_REAL , // Real floating point
  18. DATA_PTR , // Ptr memory address
  19. DATA_VEC2 , // Vec2 vector2D floating point
  20. DATA_VEC , // Vec vector3D floating point
  21. DATA_VEC4 , // Vec4 vector4D floating point
  22. DATA_VECI2 , // VecI2 vector2D integer
  23. DATA_VECI , // VecI vector3D integer
  24. DATA_VECI4 , // VecI4 vector4D integer
  25. DATA_VECU2 , // VecU2 vector2D unsigned integer
  26. DATA_VECU , // VecU vector3D unsigned integer
  27. DATA_VECU4 , // VecU4 vector4D unsigned integer
  28. DATA_COLOR , // Color color
  29. DATA_IMAGE , // Image texture
  30. DATA_IMAGE_PTR, // Image* pointer to image object
  31. DATA_IMAGEPTR , // ImagePtr pointer to image object in cache
  32. DATA_DATE_TIME, // DateTime date and time
  33. DATA_UID , // UID unique ID
  34. DATA_KBSC , // KbSc keyboard shortcut
  35. #if EE_PRIVATE
  36. DATA_CHECK , // if checked
  37. DATA_MENU_PTR , // Menu* pointer to menu
  38. #endif
  39. };
  40. /******************************************************************************/
  41. struct MemberDesc // Member Description - Description of a Member in a C++ class
  42. {
  43. DATA_TYPE type ; // data type
  44. UInt offset; // memory offset of member in class
  45. Int size ; // member memory size in bytes
  46. // conversion functions
  47. T1(TYPE) MemberDesc& setDataToTextFunc(Str (*data_to_text)(C TYPE &object) ) {T._data_to_text=(Str (*)(CPtr object ))data_to_text; return T;} // set data to text custom function
  48. T1(TYPE) MemberDesc& setTextToDataFunc( void (*text_to_data)(TYPE &object, C Str &text)) {T._text_to_data=(void(*)( Ptr object, C Str &text))text_to_data; return T;} // set text to data custom function
  49. T1(TYPE) MemberDesc& setFunc (Str (*data_to_text)(C TYPE &object), void (*text_to_data)(TYPE &object, C Str &text)) {return setDataToTextFunc(data_to_text).setTextToDataFunc(text_to_data);} // set custom functions
  50. T1(TYPE) MemberDesc& setCompareFunc(Int (*compare)(C TYPE &object0, C TYPE &object1)) {T._compare=(Int(*)(CPtr object0, CPtr object1))compare; return T;} // set custom compare function
  51. // get
  52. Int compare(CPtr object0, CPtr object1)C; // compare members of 'object0' and 'object1' C++ objects of class that this member belongs to
  53. Bool integer ()C; // if this member doesn't use floating point values
  54. Bool dblPrecision()C; // if this member stores real values as 'Dbl'
  55. Bool asBool (CPtr object )C; // get member value as Bool , 'object'=pointer to C++ object of class that this member belongs to, false on fail
  56. Int asInt (CPtr object )C; // get member value as Int , 'object'=pointer to C++ object of class that this member belongs to, 0 on fail
  57. Long asLong (CPtr object )C; // get member value as Long , 'object'=pointer to C++ object of class that this member belongs to, 0 on fail
  58. Flt asFlt (CPtr object )C; // get member value as Flt , 'object'=pointer to C++ object of class that this member belongs to, 0 on fail
  59. Dbl asDbl (CPtr object )C; // get member value as Dbl , 'object'=pointer to C++ object of class that this member belongs to, 0 on fail
  60. Vec2 asVec2 (CPtr object )C; // get member value as Vec2 , 'object'=pointer to C++ object of class that this member belongs to, Vec2 (0, 0) on fail
  61. VecD2 asVecD2(CPtr object )C; // get member value as VecD2 , 'object'=pointer to C++ object of class that this member belongs to, VecD2(0, 0) on fail
  62. Vec4 asColor(CPtr object )C; // get member value as Color (in Vec4 format), 'object'=pointer to C++ object of class that this member belongs to, Vec4 (0, 0, 0, 0) on fail
  63. Str asText (CPtr object, Int precision=INT_MAX)C; // get member value as Text , 'object'=pointer to C++ object of class that this member belongs to, "" on fail
  64. UID asUID (CPtr object )C; // get member value as UID , 'object'=pointer to C++ object of class that this member belongs to, UIDZero on fail
  65. Int asEnum (CPtr object )C; // get member value as Enum Int , 'object'=pointer to C++ object of class that this member belongs to, -1 on fail
  66. #if EE_PRIVATE
  67. Image* asImage(CPtr object )C; // get member value as Image pointer , 'object'=pointer to C++ object of class that this member belongs to
  68. #endif
  69. T1(TYPE) TYPE& as(Ptr object)C {return *(TYPE*)((Byte*)object+offset);} // get reference to member, 'object'=pointer to C++ object of class that this member belongs to !! specified TYPE should be the exact same type of the class member !!
  70. // operations
  71. void fromBool (Ptr object, Bool value); // set member value from Bool , 'object'=pointer to C++ object of class that this member belongs to
  72. void fromInt (Ptr object, Int value); // set member value from Int , 'object'=pointer to C++ object of class that this member belongs to
  73. void fromUInt (Ptr object, UInt value); // set member value from UInt , 'object'=pointer to C++ object of class that this member belongs to
  74. void fromLong (Ptr object, Long value); // set member value from Long , 'object'=pointer to C++ object of class that this member belongs to
  75. void fromULong(Ptr object, ULong value); // set member value from ULong, 'object'=pointer to C++ object of class that this member belongs to
  76. void fromFlt (Ptr object, Flt value); // set member value from Flt , 'object'=pointer to C++ object of class that this member belongs to
  77. void fromDbl (Ptr object, Dbl value); // set member value from Dbl , 'object'=pointer to C++ object of class that this member belongs to
  78. void fromVec2 (Ptr object, C Vec2 &value); // set member value from Vec2 , 'object'=pointer to C++ object of class that this member belongs to
  79. void fromColor(Ptr object, C Vec4 &color); // set member value from Color, 'object'=pointer to C++ object of class that this member belongs to
  80. void fromText (Ptr object, C Str &text ); // set member value from Text , 'object'=pointer to C++ object of class that this member belongs to
  81. void fromUID (Ptr object, C UID &uid ); // set member value from UID , 'object'=pointer to C++ object of class that this member belongs to
  82. MemberDesc( ) {set (DATA_NONE, 0, 0 );} // create as empty
  83. MemberDesc(DATA_TYPE type, UInt offset=0, Int size=0) {set (type, offset, size);} // create manually
  84. T1(TYPE) MemberDesc(TYPE &member ) {set (member );} // create using auto-detection, 'member'=custom structure/class member - 'MEMBER' macro usage is required
  85. MemberDesc( MemberDesc &md ) {Copy(T, md );} // create as copy of 'md'
  86. MemberDesc(C MemberDesc &md ) {Copy(T, md );} // create as copy of 'md'
  87. // manual setting
  88. MemberDesc& setType(DATA_TYPE type) {T.type=type; return T;}
  89. MemberDesc& set(DATA_TYPE type, UInt offset, Int size);
  90. T1(TYPE) MemberDesc& set(TYPE &member ) {return setDefault(DATA_NONE , member);} // 'member'=custom structure/class member - 'MEMBER' macro usage is required
  91. template<Int elms> MemberDesc& set(Char (&member)[elms]) {return setDefault(DATA_CHAR , member);}
  92. MemberDesc& set(Char* &member ) {return setDefault(DATA_CHAR_PTR , member);}
  93. MemberDesc& set(CChar* &member ) {return setDefault(DATA_CHAR_PTR , member);}
  94. template<Int elms> MemberDesc& set(Char8 (&member)[elms]) {return setDefault(DATA_CHAR8 , member);}
  95. MemberDesc& set(Char8* &member ) {return setDefault(DATA_CHAR8_PTR, member);}
  96. MemberDesc& set(CChar8* &member ) {return setDefault(DATA_CHAR8_PTR, member);}
  97. MemberDesc& set(Str &member ) {return setDefault(DATA_STR , member);}
  98. MemberDesc& set(Str8 &member ) {return setDefault(DATA_STR8 , member);}
  99. MemberDesc& set(Bool &member ) {return setDefault(DATA_BOOL , member);}
  100. MemberDesc& set(SByte &member ) {return setDefault(DATA_INT , member);}
  101. MemberDesc& set(Short &member ) {return setDefault(DATA_INT , member);}
  102. MemberDesc& set(Int &member ) {return setDefault(DATA_INT , member);}
  103. MemberDesc& set(Long &member ) {return setDefault(DATA_INT , member);}
  104. MemberDesc& set(Byte &member ) {return setDefault(DATA_UINT , member);}
  105. MemberDesc& set(UShort &member ) {return setDefault(DATA_UINT , member);}
  106. MemberDesc& set(UInt &member ) {return setDefault(DATA_UINT , member);}
  107. MemberDesc& set(ULong &member ) {return setDefault(DATA_UINT , member);}
  108. MemberDesc& set(Half &member ) {return setDefault(DATA_REAL , member);}
  109. MemberDesc& set(Flt &member ) {return setDefault(DATA_REAL , member);}
  110. MemberDesc& set(Dbl &member ) {return setDefault(DATA_REAL , member);}
  111. MemberDesc& set(Ptr &member ) {return setDefault(DATA_PTR , member);}
  112. MemberDesc& set(VecH2 &member ) {return setDefault(DATA_VEC2 , member);}
  113. MemberDesc& set(Vec2 &member ) {return setDefault(DATA_VEC2 , member);}
  114. MemberDesc& set(VecD2 &member ) {return setDefault(DATA_VEC2 , member);}
  115. MemberDesc& set(VecH &member ) {return setDefault(DATA_VEC , member);}
  116. MemberDesc& set(Vec &member ) {return setDefault(DATA_VEC , member);}
  117. MemberDesc& set(VecD &member ) {return setDefault(DATA_VEC , member);}
  118. MemberDesc& set(VecH4 &member ) {return setDefault(DATA_VEC4 , member);}
  119. MemberDesc& set(Vec4 &member ) {return setDefault(DATA_VEC4 , member);}
  120. MemberDesc& set(VecD4 &member ) {return setDefault(DATA_VEC4 , member);}
  121. MemberDesc& set(VecSB2 &member ) {return setDefault(DATA_VECI2 , member);}
  122. MemberDesc& set(VecI2 &member ) {return setDefault(DATA_VECI2 , member);}
  123. MemberDesc& set(VecSB &member ) {return setDefault(DATA_VECI , member);}
  124. MemberDesc& set(VecI &member ) {return setDefault(DATA_VECI , member);}
  125. MemberDesc& set(VecSB4 &member ) {return setDefault(DATA_VECI4 , member);}
  126. MemberDesc& set(VecI4 &member ) {return setDefault(DATA_VECI4 , member);}
  127. MemberDesc& set(VecB2 &member ) {return setDefault(DATA_VECU2 , member);}
  128. MemberDesc& set(VecUS2 &member ) {return setDefault(DATA_VECU2 , member);}
  129. MemberDesc& set(VecB &member ) {return setDefault(DATA_VECU , member);}
  130. MemberDesc& set(VecUS &member ) {return setDefault(DATA_VECU , member);}
  131. MemberDesc& set(VecB4 &member ) {return setDefault(DATA_VECU4 , member);}
  132. MemberDesc& set(Color &member ) {return setDefault(DATA_COLOR , member);}
  133. MemberDesc& set(Image &member ) {return setDefault(DATA_IMAGE , member);}
  134. MemberDesc& set(Image* &member ) {return setDefault(DATA_IMAGE_PTR, member);}
  135. MemberDesc& set(ImagePtr &member ) {return setDefault(DATA_IMAGEPTR , member);}
  136. MemberDesc& set(DateTime &member ) {return setDefault(DATA_DATE_TIME, member);}
  137. MemberDesc& set(UID &member ) {return setDefault(DATA_UID , member);}
  138. MemberDesc& set(KbSc &member ) {return setDefault(DATA_KBSC , member);}
  139. #if EE_PRIVATE
  140. MemberDesc& set(Menu* &member ) {return setDefault(DATA_MENU_PTR , member);}
  141. #endif
  142. #if !EE_PRIVATE
  143. private:
  144. #endif
  145. Str (*_data_to_text)(CPtr object );
  146. void (*_text_to_data)( Ptr object , C Str &text );
  147. Int (*_compare )(CPtr object0, CPtr object1);
  148. T1(TYPE) MemberDesc& setDefault(DATA_TYPE type, TYPE &member) {return set(type, UInt(UIntPtr(&member)), SIZE(member));}
  149. };
  150. /******************************************************************************/
  151. #if EE_PRIVATE
  152. Bool DataIsImage (DATA_TYPE type); // if 'type' is of image data type
  153. Bool DataIsText (DATA_TYPE type); // if 'type' is of text data type
  154. Flt DataAlign (DATA_TYPE type); // get default text align for data type
  155. C ImagePtr& DataGuiImage(CPtr data, C ListColumn &list_col, Color &color); // convert data to gui image
  156. #endif
  157. /******************************************************************************/