00001 #ifndef OBTAbstractAttribute_H
00002 #define OBTAbstractAttribute_H
00003
00004 #include <string>
00005 #include "OBT.h"
00006
00007 namespace OBT
00008 {
00009 class RTTI ;
00010
00020 class OBT_API AbstractAttribute
00021 {
00022 public:
00023
00027 virtual ~AbstractAttribute() ;
00028
00033 const char* getName() const;
00034
00039 virtual bool isReadOnly() const = 0 ;
00040
00045 virtual const RTTI& getOwnerRTTI() const = 0 ;
00046
00051 virtual const RTTI& getRTTI() const ;
00052
00057 static const RTTI& getClassRTTI() ;
00058
00059 protected:
00060
00065 AbstractAttribute( const char* name ) ;
00066
00067 private:
00068
00075 static void initRTTI() ;
00076
00080 static void destroyRTTI() ;
00081
00083 static RTTI* _rtti ;
00084
00086 std::string _name ;
00087 } ;
00088
00089
00090
00091
00092 inline const char*
00093 AbstractAttribute::getName( ) const
00094 {
00095 return _name.c_str() ;
00096 }
00097
00098
00099
00100
00101 template < class TAttribute >
00102 inline typename TAttribute::value_type
00103 getAttributeValue( const typename TAttribute::owner_type& owner, unsigned int attributeNumber )
00104 {
00105 return ( owner.getRTTI().template getAttribute< TAttribute >( attributeNumber )->getValue( owner ) ) ;
00106 }
00107
00108
00109
00110
00111 template < class TAttribute >
00112 inline typename TAttribute::value_type
00113 getAttributeValue( const typename TAttribute::owner_type& owner, const char* name )
00114 {
00115 return ( owner.getRTTI().template getAttribute< TAttribute >( name )->getValue( owner ) ) ;
00116 }
00117
00118
00119
00120
00121 template < class TAttribute >
00122 inline void
00123 setAttributeValue( typename TAttribute::owner_type& owner, unsigned int attributeNumber, typename TAttribute::value_type value )
00124 {
00125 owner.getRTTI().template getAttribute< TAttribute >( attributeNumber )->setValue( owner, value ) ;
00126 }
00127
00128
00129
00130
00131 template < class TAttribute >
00132 inline void
00133 setAttributeValue( typename TAttribute::owner_type& owner, const char* name, typename TAttribute::value_type value )
00134 {
00135 owner.getRTTI().template getAttribute< TAttribute >( name )->setValue( owner, value ) ;
00136 }
00137 }
00138 #endif //header