Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Property.hpp

Go to the documentation of this file.
00001 /*==========================================================================
00002  *
00003  *  Original source copyright (c) 2003, Carnegie Mellon University.
00004  *  See copyright.cmu for details.
00005  *  Modifications copyright (c) 2003, University of Massachusetts.
00006  *  See copyright.umass for details.
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

Generated on Tue Jun 15 11:02:55 2010 for Lemur by doxygen 1.3.4