metapropertyt.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file metapropertyt.h
  3.  *
  4.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2006-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #ifndef LL_METAPROPERTYT_H
  32. #define LL_METAPROPERTYT_H
  33. #include "llsd.h"
  34. #include "llstring.h"
  35. #include "metaclasst.h"
  36. #include "metaproperty.h"
  37. #include "reflectivet.h"
  38. template<class TProperty>
  39. class LLMetaPropertyT : public LLMetaProperty
  40. {
  41. public:
  42. virtual ~LLMetaPropertyT() {;}
  43. // Get value of this property. Gives ownership of returned value.
  44. virtual const LLReflective* get(const LLReflective* object) const
  45. {
  46. checkObjectClass(object);
  47. return getProperty(object);
  48. }
  49.   
  50. // Set value of this property.
  51. /*virtual void set(LLReflective* object, const LLReflective* value)
  52. {
  53. // TODO: Babbage: Check types.
  54. ref(object) = static_cast<const LLReflectiveT<TProperty>* >(value)->getValue();
  55. }*/
  56. // Get value of this property as LLSD.
  57. virtual LLSD getLLSD(const LLReflective* object) const
  58. {
  59. return LLSD();
  60. }
  61. protected:
  62. LLMetaPropertyT(const std::string& name, const LLMetaClass& object_class) : LLMetaProperty(name, object_class) {;}
  63. virtual const TProperty* getProperty(const LLReflective* object) const = 0;
  64. };
  65. template <>
  66. inline const LLReflective* LLMetaPropertyT<S32>::get(const LLReflective* object) const
  67. {
  68. checkObjectClass(object);
  69. return NULL;
  70. }
  71. template <>
  72. inline const LLReflective* LLMetaPropertyT<std::string>::get(const LLReflective* object) const
  73. {
  74. checkObjectClass(object);
  75. return NULL;
  76. }
  77. template <>
  78. inline const LLReflective* LLMetaPropertyT<LLUUID>::get(const LLReflective* object) const
  79. {
  80. checkObjectClass(object);
  81. return NULL;
  82. }
  83. template <>
  84. inline const LLReflective* LLMetaPropertyT<bool>::get(const LLReflective* object) const
  85. {
  86. checkObjectClass(object);
  87. return NULL;
  88. }
  89. template <>
  90. inline LLSD LLMetaPropertyT<S32>::getLLSD(const LLReflective* object) const
  91. {
  92. return *(getProperty(object));
  93. }
  94. template <>
  95. inline LLSD LLMetaPropertyT<std::string>::getLLSD(const LLReflective* object) const
  96. {
  97. return *(getProperty(object));
  98. }
  99. template <>
  100. inline LLSD LLMetaPropertyT<LLUUID>::getLLSD(const LLReflective* object) const
  101. {
  102. return *(getProperty(object));
  103. }
  104. template <>
  105. inline LLSD LLMetaPropertyT<bool>::getLLSD(const LLReflective* object) const
  106. {
  107. return *(getProperty(object));
  108. }
  109. template<class TObject, class TProperty>
  110. class LLMetaPropertyTT : public LLMetaPropertyT<TProperty>
  111. {
  112. public:
  113. LLMetaPropertyTT(const std::string& name, const LLMetaClass& object_class, TProperty (TObject::*property)) : 
  114.   LLMetaPropertyT<TProperty>(name, object_class), mProperty(property) {;}
  115. protected:
  116. // Get void* to property.
  117. virtual const TProperty* getProperty(const LLReflective* object) const
  118. {
  119. const TObject* typed_object = static_cast<const TObject*>(object);
  120. return &(typed_object->*mProperty);
  121. };
  122. private:
  123. TProperty (TObject::*mProperty);
  124. };
  125. template<class TObject, class TProperty>
  126. class LLMetaPropertyPtrTT : public LLMetaPropertyT<TProperty>
  127. {
  128. public:
  129. LLMetaPropertyPtrTT(const std::string& name, const LLMetaClass& object_class, TProperty* (TObject::*property)) : 
  130.   LLMetaPropertyT<TProperty>(name, object_class), mProperty(property) {;}
  131. protected:
  132. // Get void* to property.
  133. virtual const TProperty* getProperty(const LLReflective* object) const
  134. {
  135. const TObject* typed_object = static_cast<const TObject*>(object);
  136. return typed_object->*mProperty;
  137. };
  138. private:
  139. TProperty* (TObject::*mProperty);
  140. };
  141. // Utility function to simplify the registration of members.
  142. template<class TObject, class TProperty>
  143. void reflectProperty(LLMetaClass& meta_class, const std::string& name, TProperty (TObject::*property))
  144. {
  145. typedef LLMetaPropertyTT<TObject, TProperty> PropertyType;
  146. const LLMetaProperty* meta_property = new PropertyType(name, meta_class, property);
  147. meta_class.addProperty(meta_property);
  148. }
  149. // Utility function to simplify the registration of ptr properties.
  150. template<class TObject, class TProperty>
  151. void reflectPtrProperty(LLMetaClass& meta_class, const std::string& name, TProperty* (TObject::*property))
  152. {
  153. typedef LLMetaPropertyPtrTT<TObject, TProperty> PropertyType;
  154. const LLMetaProperty* meta_property = new PropertyType(name, meta_class, property);
  155. meta_class.addProperty(meta_property);
  156. }
  157. #endif // LL_METAPROPERTYT_H