00001 #ifndef POINTERPROPERTY_H 00002 #define POINTERPROPERTY_H 00003 00004 #include "Types.h" 00005 #include "Util.h" 00006 #include "AbstractProperty.h" 00007 #include "AbstractPropertyContainer.h" 00008 00009 #include <typeinfo> 00010 00011 namespace RenderTools { 00012 00013 template< class T > 00014 class PointerProperty : public AbstractProperty { 00015 public: 00016 00017 PointerProperty( const shared_ptr< T > & pointer ): 00018 AbstractProperty(), 00019 m_pointer( pointer ){ 00020 } 00021 00022 virtual void onInitialize( void ){ 00023 00024 } 00025 00026 virtual const string getTypeName( bool ofComponent ) const { 00027 T t; 00028 return( RenderTools::getTypeName( t, ofComponent ) ); 00029 } 00030 00031 virtual bool isInteger( void ) const { 00032 T t; 00033 return( RenderTools::isInteger( t ) ); 00034 } 00035 00036 virtual bool isReal( void ) const { 00037 T t; 00038 return( RenderTools::isReal( t ) ); 00039 } 00040 00041 virtual bool isBoolean( void ) const { 00042 T t; 00043 return( RenderTools::isBoolean( t ) ); 00044 } 00045 00046 virtual bool isMatrix( void ) const { 00047 T t; 00048 return( RenderTools::isMatrix( t ) ); 00049 } 00050 00051 virtual bool isMultiComponent( void ) const { 00052 T t; 00053 return( RenderTools::isMultiComponent( t ) ); 00054 } 00055 00056 virtual bool setValue( const string toValue, int element = -1 ){ 00057 string value = toValue; 00058 if( toValue == "" ){ 00059 value = string( " " ); 00060 } 00061 stringstream s( AbstractPropertyContainer::interpret( value ) ); 00062 string prevValue = getValue(); 00063 if( typeid( * m_pointer ) == typeid( string ) ){ 00064 if( value == " " ){ 00065 noskipws( s ); 00066 } 00067 else{ 00068 skipws( s ); 00069 } 00070 } 00071 s >> const_cast< T & >( * m_pointer ); 00072 return( getValue() != prevValue ); 00073 } 00074 00075 virtual const string getValue( int element = -1 ) const { 00076 stringstream s; 00077 s << ( * m_pointer ) << string( " " ); 00078 return( trim( s.str() ) ); 00079 } 00080 00081 virtual const void * getPointer( unsigned int offset ) const { 00082 return( ( void * ) & m_pointer.get()[ offset ] ); 00083 } 00084 00085 const shared_ptr< T > & getPointer( void ) const { 00086 return( m_pointer.lock() ); 00087 } 00088 00089 shared_ptr< T > & getPointer( void ) { 00090 return( m_pointer ); 00091 } 00092 protected: 00093 shared_ptr< T > m_pointer; 00094 }; 00095 00096 }; // namespace RenderTools 00097 00098 00099 #endif
1.5.8