PixelLightAPI
.
|
00001 /*********************************************************\ 00002 * File: Var.h * 00003 * 00004 * Copyright (C) 2002-2012 The PixelLight Team (http://www.pixellight.org/) 00005 * 00006 * This file is part of PixelLight. 00007 * 00008 * PixelLight is free software: you can redistribute it and/or modify 00009 * it under the terms of the GNU Lesser General Public License as published by 00010 * the Free Software Foundation, either version 3 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * PixelLight is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public License 00019 * along with PixelLight. If not, see <http://www.gnu.org/licenses/>. 00020 \*********************************************************/ 00021 00022 00023 #ifndef __PLCORE_VAR_H__ 00024 #define __PLCORE_VAR_H__ 00025 #pragma once 00026 00027 00028 //[-------------------------------------------------------] 00029 //[ Includes ] 00030 //[-------------------------------------------------------] 00031 #include "PLCore/Base/Tools/TypeTraits.h" 00032 #include "PLCore/Base/Type/Type.h" 00033 #include "PLCore/Base/Var/DynVar.h" 00034 #include "PLCore/Base/Var/VarAccess.h" 00035 00036 00037 //[-------------------------------------------------------] 00038 //[ Namespace ] 00039 //[-------------------------------------------------------] 00040 namespace PLCore { 00041 00042 00043 //[-------------------------------------------------------] 00044 //[ Forward declarations ] 00045 //[-------------------------------------------------------] 00046 class Object; 00047 00048 00049 //[-------------------------------------------------------] 00050 //[ Classes ] 00051 //[-------------------------------------------------------] 00052 /** 00053 * @brief 00054 * Typed variable 00055 * 00056 * @remarks 00057 * This class represents an actual variable of a certain type. 00058 * The two other template parameters control, where the actual value 00059 * is stored (STORAGE) and how the variable is allowed to be accessed (ACCESS). 00060 */ 00061 template <typename T, typename ACCESS = PLCore::AccessReadWrite, typename STORAGE = PLCore::StorageDirectValue > 00062 class Var : public DynVar { 00063 00064 00065 //[-------------------------------------------------------] 00066 //[ Public data types ] 00067 //[-------------------------------------------------------] 00068 public: 00069 // Storage type 00070 typedef typename Type<T>::_Type _Type; 00071 00072 00073 //[-------------------------------------------------------] 00074 //[ Public functions ] 00075 //[-------------------------------------------------------] 00076 public: 00077 /** 00078 * @brief 00079 * Constructor 00080 */ 00081 Var() : 00082 m_Value(DefaultValue<T>::Default()) 00083 { 00084 } 00085 00086 /** 00087 * @brief 00088 * Constructor 00089 * 00090 * @param[in] DefaultValue 00091 * Default value for the var 00092 */ 00093 Var(_Type DefaultValue) : 00094 m_Value(DefaultValue) 00095 { 00096 } 00097 00098 /** 00099 * @brief 00100 * Constructor 00101 * 00102 * @param[in] DefaultValue 00103 * Default value for the var 00104 * @param[in] pObject 00105 * Pointer to object to which the attribute belongs 00106 */ 00107 Var(_Type DefaultValue, Object *pObject) : 00108 m_Value(DefaultValue, pObject) 00109 { 00110 } 00111 00112 /** 00113 * @brief 00114 * Destructor 00115 */ 00116 virtual ~Var() 00117 { 00118 } 00119 00120 /** 00121 * @brief 00122 * Get value 00123 * 00124 * @return 00125 * Value 00126 */ 00127 operator _Type() const 00128 { 00129 // Get value 00130 return m_Value.Get(); 00131 } 00132 00133 /** 00134 * @brief 00135 * Assignment operator 00136 * 00137 * @param[in] Value 00138 * New value 00139 * 00140 * @return 00141 * Reference to this instance 00142 */ 00143 Var &operator =(const _Type &Value) 00144 { 00145 // Set value 00146 m_Value.Set(Value); 00147 return *this; 00148 } 00149 00150 /** 00151 * @brief 00152 * Get value 00153 * 00154 * @return 00155 * Value 00156 */ 00157 inline _Type Get() const 00158 { 00159 // Return value 00160 return m_Value.Get(); 00161 } 00162 00163 /** 00164 * @brief 00165 * Set value 00166 * 00167 * @param[in] Value 00168 * New value 00169 */ 00170 inline void Set(const _Type &Value) 00171 { 00172 m_Value.Set(Value); 00173 } 00174 00175 /** 00176 * @brief 00177 * Get default value 00178 * 00179 * @return 00180 * Default value 00181 */ 00182 inline _Type Default() const 00183 { 00184 // Return default value 00185 return m_Value.GetDefault(); 00186 } 00187 00188 00189 //[-------------------------------------------------------] 00190 //[ Public virtual DynVar functions ] 00191 //[-------------------------------------------------------] 00192 public: 00193 virtual DynTypeInfo &GetType() const override 00194 { 00195 return TypeInfo<T>::Instance; 00196 } 00197 00198 virtual String GetTypeName() const override 00199 { 00200 return Type<T>::GetTypeName(); 00201 } 00202 00203 virtual int GetTypeID() const override 00204 { 00205 return Type<T>::TypeID; 00206 } 00207 00208 virtual bool IsDefault() const override 00209 { 00210 return (m_Value.Get() == m_Value.GetDefault()); 00211 } 00212 00213 virtual void SetDefault() override 00214 { 00215 m_Value.Set(m_Value.GetDefault()); 00216 } 00217 00218 virtual String GetDefault() const override 00219 { 00220 return Type<T>::ConvertToString(m_Value.GetDefault()); 00221 } 00222 00223 virtual void SetVar(const DynVar &cValue) override 00224 { 00225 m_Value.Set(Type<T>::ConvertFromVar(cValue)); 00226 } 00227 00228 virtual bool GetBool() const override 00229 { 00230 return Type<T>::ConvertToBool(m_Value.Get()); 00231 } 00232 00233 virtual void SetBool(bool bValue) override 00234 { 00235 m_Value.Set(Type<T>::ConvertFromBool(bValue)); 00236 } 00237 00238 virtual int GetInt() const override 00239 { 00240 return Type<T>::ConvertToInt(m_Value.Get()); 00241 } 00242 00243 virtual void SetInt(int nValue) override 00244 { 00245 m_Value.Set(Type<T>::ConvertFromInt(nValue)); 00246 } 00247 00248 virtual int8 GetInt8() const override 00249 { 00250 return Type<T>::ConvertToInt8(m_Value.Get()); 00251 } 00252 00253 virtual void SetInt8(int8 nValue) override 00254 { 00255 m_Value.Set(Type<T>::ConvertFromInt8(nValue)); 00256 } 00257 00258 virtual int16 GetInt16() const override 00259 { 00260 return Type<T>::ConvertToInt16(m_Value.Get()); 00261 } 00262 00263 virtual void SetInt16(int16 nValue) override 00264 { 00265 m_Value.Set(Type<T>::ConvertFromInt16(nValue)); 00266 } 00267 00268 virtual int32 GetInt32() const override 00269 { 00270 return Type<T>::ConvertToInt32(m_Value.Get()); 00271 } 00272 00273 virtual void SetInt32(int32 nValue) override 00274 { 00275 m_Value.Set(Type<T>::ConvertFromInt32(nValue)); 00276 } 00277 00278 virtual int64 GetInt64() const override 00279 { 00280 return Type<T>::ConvertToInt64(m_Value.Get()); 00281 } 00282 00283 virtual void SetInt64(int64 nValue) override 00284 { 00285 m_Value.Set(Type<T>::ConvertFromInt64(nValue)); 00286 } 00287 00288 virtual uint8 GetUInt8() const override 00289 { 00290 return Type<T>::ConvertToUInt8(m_Value.Get()); 00291 } 00292 00293 virtual void SetUInt8(uint8 nValue) override 00294 { 00295 m_Value.Set(Type<T>::ConvertFromUInt8(nValue)); 00296 } 00297 00298 virtual uint16 GetUInt16() const override 00299 { 00300 return Type<T>::ConvertToUInt16(m_Value.Get()); 00301 } 00302 00303 virtual void SetUInt16(uint16 nValue) override 00304 { 00305 m_Value.Set(Type<T>::ConvertFromUInt16(nValue)); 00306 } 00307 00308 virtual uint32 GetUInt32() const override 00309 { 00310 return Type<T>::ConvertToUInt32(m_Value.Get()); 00311 } 00312 00313 virtual void SetUInt32(uint32 nValue) override 00314 { 00315 m_Value.Set(Type<T>::ConvertFromUInt32(nValue)); 00316 } 00317 00318 virtual uint64 GetUInt64() const override 00319 { 00320 return Type<T>::ConvertToUInt64(m_Value.Get()); 00321 } 00322 00323 virtual void SetUInt64(uint64 nValue) override 00324 { 00325 m_Value.Set(Type<T>::ConvertFromUInt64(nValue)); 00326 } 00327 00328 virtual uint_ptr GetUIntPtr() const override 00329 { 00330 return Type<T>::ConvertToUIntPtr(m_Value.Get()); 00331 } 00332 00333 virtual void SetUIntPtr(uint_ptr nValue) override 00334 { 00335 m_Value.Set(Type<T>::ConvertFromUIntPtr(nValue)); 00336 } 00337 00338 virtual float GetFloat() const override 00339 { 00340 return Type<T>::ConvertToFloat(m_Value.Get()); 00341 } 00342 00343 virtual void SetFloat(float fValue) override 00344 { 00345 m_Value.Set(Type<T>::ConvertFromFloat(fValue)); 00346 } 00347 00348 virtual double GetDouble() const override 00349 { 00350 return Type<T>::ConvertToDouble(m_Value.Get()); 00351 } 00352 00353 virtual void SetDouble(double dValue) override 00354 { 00355 m_Value.Set(Type<T>::ConvertFromDouble(dValue)); 00356 } 00357 00358 virtual String GetString() const override 00359 { 00360 return Type<T>::ConvertToString(m_Value.Get()); 00361 } 00362 00363 virtual void SetString(const String &sValue) override 00364 { 00365 m_Value.Set(Type<T>::ConvertFromString(sValue)); 00366 } 00367 00368 00369 //[-------------------------------------------------------] 00370 //[ Private data ] 00371 //[-------------------------------------------------------] 00372 private: 00373 // Variable value 00374 VarAccess<_Type, ACCESS, STORAGE> m_Value; /**< Value storage and access */ 00375 00376 00377 }; 00378 00379 00380 //[-------------------------------------------------------] 00381 //[ Namespace ] 00382 //[-------------------------------------------------------] 00383 } // PLCore 00384 00385 00386 #endif // __PLCORE_VAR_H__
|