00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef _PROPERTY_HPP
00012 #define _PROPERTY_HPP
00013
00014 #define INITBUFFSIZE 128
00015 #define INITNAMESIZE 32
00016 #include "common_headers.hpp"
00017 #include <cstring>
00018 namespace lemur
00019 {
00020 namespace parse
00021 {
00022
00037 class Property {
00038 public:
00039 enum DataType {EMPTY = 0, INT = 1, STRING = 2, DOUBLE = 3, UNKNOWN = 4, STDSTRING = 5};
00040
00041 Property();
00042 Property(const string initName);
00043 ~Property();
00044
00045 void setName(const string newName);
00046 void copyValue(const Property * property);
00048 const string getName() const;
00050 const void * getValue() const;
00052 DataType getType() const;
00053 int getSize() const;
00054 int getLength() const;
00055
00059 template<typename T>
00060 void setObjectValue( const T& value ) {
00061 dataSize = sizeof(T);
00062 void* memory = allocate( dataSize );
00063 setDestructor( &Property::destruct<T> );
00064 new(memory) T(value);
00065 setType( Property::UNKNOWN );
00066 }
00067
00069 template<typename T>
00070 void setFundamentalValue( T value, DataType t ) {
00071 dataSize = sizeof(T);
00072 void* memory = allocate( sizeof(T) );
00073 setDestructor( 0 );
00074 std::memcpy( memory, &value, sizeof(T) );
00075 setType( t );
00076 }
00077
00079 template<typename T>
00080 void setArrayValue( T* value, DataType t, int length ) {
00081 dataSize = sizeof(T) * length;
00082 void* memory = allocate( dataSize );
00083 setDestructor( 0 );
00084 std::memcpy( memory, value, length );
00085 setType( t );
00086 }
00087
00093 template<typename T>
00094 void setValue( T value ) {
00095 setObjectValue( value );
00096 }
00097
00099 void setValue( const char* value ) {
00100 setArrayValue( value, STRING, strlen(value)+1 );
00101 }
00102
00104 void setValue( const string value) {
00105 setObjectValue(value);
00106 setType(STDSTRING);
00107 }
00108
00110 void setValue( char* value ) {
00111 setArrayValue( value, STRING, strlen(value)+1 );
00112 }
00113
00115 void setValue( int value ) {
00116 setFundamentalValue( value, INT );
00117 }
00118
00120 void setValue( double value ) {
00121 setFundamentalValue( value, DOUBLE );
00122 }
00123
00124 template<class T>
00125 void destruct( void* value ) {
00126 ( (T*) value )->~T();
00127 }
00128
00129 protected:
00130 void (Property::*destructor)( void* object );
00132 void* allocate( int size );
00133 void setDestructor( void (Property::*destructor)(void* object) );
00134 void setType( DataType type );
00135
00136 DataType type;
00137 int bufferSize;
00138 int dataSize;
00139 char * buffer;
00140
00141 string name;
00142 bool nullName;
00143 };
00144 }
00145 }
00146
00147
00148 #endif //_PROPERTY_HPP