OGRE  1.7
Object-Oriented Graphics Rendering Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OgreProperty.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4 (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6 
7 Copyright (c) 2000-2011 Torus Knot Software Ltd
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #ifndef __OGRE_PROPERTY_H__
29 #define __OGRE_PROPERTY_H__
30 
32 #include "OgreAny.h"
33 #include "OgreIteratorWrappers.h"
34 #include "OgreString.h"
35 #include "OgreException.h"
36 #include "OgreVector2.h"
37 #include "OgreVector3.h"
38 #include "OgreVector4.h"
39 #include "OgreColourValue.h"
40 #include "OgreQuaternion.h"
41 #include "OgreMatrix3.h"
42 #include "OgreMatrix4.h"
43 
44 #include <boost/bind.hpp>
45 #include <boost/function.hpp>
100 namespace Ogre
101 {
109  enum PropertyType
111  {
114  PROP_INT = 2,
116  PROP_LONG = 4,
124  PROP_BOOL = 12,
128 
130  };
131 
138  {
139  public:
140 
141  /* Construct a property.
142  @param name The name of the property
143  @param desc A (potentially) long description of the property
144  @param pType The type of the property
145  */
146  PropertyDef(const String& name, const String& desc, PropertyType pType)
147  : mName(name), mDesc(desc), mType(pType) {}
148 
150  const String& getName() const { return mName; }
151 
153  const String& getDescription() const { return mDesc; }
154 
156  PropertyType getType() const { return mType; }
157 
159  static const String& getTypeName(PropertyType theType);
160 
161  static PropertyType getTypeForValue(const short& val) { return PROP_SHORT; }
162  static PropertyType getTypeForValue(const unsigned short& val) { return PROP_UNSIGNED_SHORT; }
163  static PropertyType getTypeForValue(const int& val) { return PROP_INT; }
164  static PropertyType getTypeForValue(const unsigned int& val) { return PROP_UNSIGNED_INT; }
165  static PropertyType getTypeForValue(const long& val) { return PROP_LONG; }
166  static PropertyType getTypeForValue(const unsigned long& val) { return PROP_UNSIGNED_LONG; }
167  static PropertyType getTypeForValue(const Real& val) { return PROP_REAL; }
168  static PropertyType getTypeForValue(const String& val) { return PROP_STRING; }
169  static PropertyType getTypeForValue(const Vector2& val) { return PROP_VECTOR2; }
170  static PropertyType getTypeForValue(const Vector3& val) { return PROP_VECTOR3; }
171  static PropertyType getTypeForValue(const Vector4& val) { return PROP_VECTOR4; }
172  static PropertyType getTypeForValue(const ColourValue& val) { return PROP_COLOUR; }
173  static PropertyType getTypeForValue(const bool& val) { return PROP_BOOL; }
175  static PropertyType getTypeForValue(const Matrix3& val) { return PROP_MATRIX3; }
176  static PropertyType getTypeForValue(const Matrix4& val) { return PROP_MATRIX4; }
177 
178  protected:
179  // no default construction
181 
185 
186  };
187 
190 
194  {
195  public:
197  PropertyBase(PropertyDef* def) : mDef(def) {}
198  virtual ~PropertyBase() {}
199 
201  const String& getName() const { return mDef->getName(); }
202 
204  const String& getDescription() const { return mDef->getDescription(); }
205 
207  PropertyType getType() const { return mDef->getType(); }
208 
210  virtual Ogre::Any getValue() const = 0;
211 
212  protected:
213  // disallow default construction
216 
217  };
218 
220  template <typename T>
221  class Property : public PropertyBase
222  {
223  public:
224  typedef T value_type;
225  typedef boost::function< T (void) > getter_func;
226  typedef boost::function< void (T) > setter_func;
227 
232  : PropertyBase(def)
233  , mGetter(getter)
234  , mSetter(setter)
235  {
236  }
237 
240  virtual void set(T val)
241  {
242  mSetter(val);
243  }
244 
245  virtual T get() const
246  {
247  return mGetter();
248  }
249 
251  {
252  return Ogre::Any(get());
253  }
254 
255  protected:
256  // disallow default construction
257  Property() {}
259 
262  };
263 
269  {
272  };
275 
276 
280  {
281  public:
282  PropertySet();
283  ~PropertySet();
284 
289  void addProperty(PropertyBase* prop);
290 
298  PropertyBase* getProperty(const String& name) const;
299 
301  bool hasProperty(const String& name) const;
302 
306  PropertyIterator getPropertyIterator();
307 
311  PropertyValueMap getValueMap() const;
312 
315  void setValueMap(const PropertyValueMap& values);
316 
319  template<typename T>
320  void getValue(const String& name, T& value) const
321  {
322  getPropertyImpl(name, value, PropertyDef::getTypeForValue(value));
323  }
324 
327  template<typename T>
328  void setValue(const String& name, const T* value)
329  {
330  setPropertyImpl(name, *value, PropertyDef::getTypeForValue(*value));
331  }
334  template<typename T>
335  void setValue(const String& name, T value)
336  {
337  setPropertyImpl(name, value, PropertyDef::getTypeForValue(value));
338  }
341  void setValue(const String& name, const char* pChar)
342  {
343  String v(pChar);
344  setPropertyImpl(name, v, PROP_STRING);
345  }
346 
347 
348  protected:
350 
352  template <typename T>
353  void setPropertyImpl(const String& name, const T& val, PropertyType typeCheck)
354  {
355  PropertyBase* baseProp = getProperty(name);
356  if (baseProp->getType() != typeCheck)
357  {
359  msg << "Property error: type passed in: '" << PropertyDef::getTypeName(typeCheck)
360  << "', type of property: '" << PropertyDef::getTypeName(baseProp->getType()) << "'";
361  OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, msg.str(), "PropertySet::setPropertyImpl");
362  }
363  static_cast<Property<T>*>(baseProp)->set(val);
364  }
365 
367  template <typename T>
368  void getPropertyImpl(const String& name, T& refVal, PropertyType typeCheck) const
369  {
370  PropertyBase* baseProp = getProperty(name);
371  if (baseProp->getType() != typeCheck)
372  {
374  msg << "Property error: type requested: '" << PropertyDef::getTypeName(typeCheck)
375  << "', type of property: '" << PropertyDef::getTypeName(baseProp->getType()) << "'";
376  OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, msg.str(), "PropertySet::getPropertyImpl");
377  }
378  refVal = static_cast<Property<T>*>(baseProp)->get();
379  }
380 
381  };
382 
386 }
387 
388 #endif
static PropertyType getTypeForValue(const Matrix3 &val)
Definition: OgreProperty.h:175
Ogre::Any getValue() const
Return the current value as an Any.
Definition: OgreProperty.h:250
Class encapsulating a standard 4x4 homogeneous matrix.
Definition: OgreMatrix4.h:78
static PropertyType getTypeForValue(const bool &val)
Definition: OgreProperty.h:173
static PropertyType getTypeForValue(const Vector4 &val)
Definition: OgreProperty.h:171
float Real
Software floating point type.
PropertyMap mPropertyMap
Definition: OgreProperty.h:349
Variant type that can hold Any other type.
Definition: OgreAny.h:56
void getValue(const String &name, T &value) const
Get a named property value.
Definition: OgreProperty.h:320
static PropertyType getTypeForValue(const short &val)
Definition: OgreProperty.h:161
Class representing colour.
PropertyType mType
Definition: OgreProperty.h:184
static PropertyType getTypeForValue(const Vector3 &val)
Definition: OgreProperty.h:170
void setValue(const String &name, const T *value)
Set a named property value (via pointer to avoid copy).
Definition: OgreProperty.h:328
PropertyType propType
Definition: OgreProperty.h:270
StringStream StrStreamType
Definition: OgreString.h:77
getter_func mGetter
Definition: OgreProperty.h:260
A 3x3 matrix which can represent rotations around axes.
Definition: OgreMatrix3.h:68
void setValue(const String &name, T value)
Set a named property value.
Definition: OgreProperty.h:335
void getPropertyImpl(const String &name, T &refVal, PropertyType typeCheck) const
Set a named property value, internal implementation (type match required)
Definition: OgreProperty.h:368
static const String & getTypeName(PropertyType theType)
Get a string name of a property type.
void setPropertyImpl(const String &name, const T &val, PropertyType typeCheck)
Set a named property value, internal implementation (type match required)
Definition: OgreProperty.h:353
Implementation of a Quaternion, i.e.
Concrete IteratorWrapper for nonconst access to the underlying key-value container.
static PropertyType getTypeForValue(const Vector2 &val)
Definition: OgreProperty.h:169
static PropertyType getTypeForValue(const String &val)
Definition: OgreProperty.h:168
PropertyType getType() const
Get the type of the property.
Definition: OgreProperty.h:156
const String & getDescription() const
Get the description of the property.
Definition: OgreProperty.h:204
setter_func mSetter
Definition: OgreProperty.h:261
Ogre::MapIterator< PropertyMap > PropertyIterator
Definition: OgreProperty.h:304
static PropertyType getTypeForValue(const long &val)
Definition: OgreProperty.h:165
#define OGRE_EXCEPT(num, desc, src)
Superclass for all objects that wish to use custom memory allocators when their new / delete operator...
Standard 2-dimensional vector.
Definition: OgreVector2.h:51
const String & getName() const
Get the name of the property.
Definition: OgreProperty.h:150
const String & getDescription() const
Get the description of the property.
Definition: OgreProperty.h:153
boost::function< T(void) > getter_func
Definition: OgreProperty.h:225
static PropertyType getTypeForValue(const unsigned int &val)
Definition: OgreProperty.h:164
PropertyDef * mDef
Definition: OgreProperty.h:215
static PropertyType getTypeForValue(const unsigned short &val)
Definition: OgreProperty.h:162
Standard 3-dimensional vector.
Definition: OgreVector3.h:51
Base interface for an instance of a property.
Definition: OgreProperty.h:193
std::map< K, V, P, A > type
static PropertyType getTypeForValue(const unsigned long &val)
Definition: OgreProperty.h:166
static PropertyType getTypeForValue(const int &val)
Definition: OgreProperty.h:163
static PropertyType getTypeForValue(const ColourValue &val)
Definition: OgreProperty.h:172
static PropertyType getTypeForValue(const Matrix4 &val)
Definition: OgreProperty.h:176
A simple structure designed just as a holder of property values between the instances of objects they...
Definition: OgreProperty.h:268
Property instance with passthrough calls to a given object.
Definition: OgreProperty.h:221
virtual ~PropertyBase()
Definition: OgreProperty.h:198
PropertyType
The type of a property.
Definition: OgreProperty.h:110
Defines a complete set of properties for a single object instance.
Definition: OgreProperty.h:279
Definition of a property of an object.
Definition: OgreProperty.h:137
static PropertyType getTypeForValue(const Real &val)
Definition: OgreProperty.h:167
boost::function< void(T) > setter_func
Definition: OgreProperty.h:226
_StringBase String
#define _OgrePropertyExport
4-dimensional homogeneous vector.
Definition: OgreVector4.h:45
PropertyBase(PropertyDef *def)
Constructor.
Definition: OgreProperty.h:197
PropertyType getType() const
Get the type of the property.
Definition: OgreProperty.h:207
PropertyDef(const String &name, const String &desc, PropertyType pType)
Definition: OgreProperty.h:146
map< String, PropertyValue >::type PropertyValueMap
Defines a transferable map of properties using wrapped value types (Ogre::Any)
Definition: OgreProperty.h:274
map< String, PropertyBase * >::type PropertyMap
Definition: OgreProperty.h:303
const String & getName() const
Get the name of the property.
Definition: OgreProperty.h:201
map< String, PropertyDef >::type PropertyDefMap
Map from property name to shared definition.
Definition: OgreProperty.h:189
virtual void set(T val)
Set the property value.
Definition: OgreProperty.h:240
static PropertyType getTypeForValue(const Quaternion &val)
Definition: OgreProperty.h:174
Property(PropertyDef *def, getter_func getter, setter_func setter)
Construct a property which is able to directly call a given getter and setter on a specific object in...
Definition: OgreProperty.h:231
void setValue(const String &name, const char *pChar)
Special-case char*, convert to String automatically.
Definition: OgreProperty.h:341