00001 #ifndef X3DFIELD_H 00002 #define X3DFIELD_H 00003 00004 #include "SFString.h" 00005 #include <typeinfo> 00006 00007 namespace X3DTK { 00008 00009 class X3DField 00010 { 00011 friend bool operator== (const X3DField &f1, const X3DField &f2); 00012 friend bool operator!= (const X3DField &f1, const X3DField &f2); 00013 00014 public: 00015 X3DField(const std::type_info &type, unsigned char *data); 00016 inline const std::type_info &getType() const {return _type;}; 00017 inline unsigned char *data() const {return _data;}; 00018 00019 private: 00020 const std::type_info &_type; 00021 unsigned char *_data; 00022 00023 public: 00024 static const X3DField null; 00025 }; 00026 00027 inline bool operator== (const X3DField &f1, const X3DField &f2) 00028 { 00029 return ((f1._type == f2._type) && (f1._data == f2._data)); 00030 } 00031 00032 inline bool operator!= (const X3DField &f1, const X3DField &f2) 00033 { 00034 return ((f1._type != f2._type) || (f1._data != f2._data)); 00035 } 00036 00037 class X3DFieldLoader 00038 { 00039 public: 00040 virtual void load(X3DField &field, const SFString &value) = 0; 00041 }; 00042 00043 template<class V> 00044 class FieldLoader : public X3DFieldLoader 00045 { 00046 public: 00047 void load(X3DField &field, const SFString &value); 00048 }; 00049 00050 00051 class X3DFieldWriter 00052 { 00053 public: 00054 virtual SFString write(const X3DField &field) = 0; 00055 virtual void writeToFile(SFString &output, const SFString &name, const X3DField &field, const SFString &init) = 0; 00056 }; 00057 00058 template<class V> 00059 class FieldWriter : public X3DFieldWriter 00060 { 00061 public: 00062 SFString write(const X3DField &field); 00063 void writeToFile(SFString &output, const SFString &name, const X3DField &field, const SFString &init); 00064 void write(SFString &output, const V &value); 00065 }; 00066 00067 00068 template<> 00069 class FieldLoader<bool> : public X3DFieldLoader 00070 { 00071 public: 00072 void load(X3DField &field, const SFString &value); 00073 }; 00074 00075 template<> 00076 class FieldLoader<int> : public X3DFieldLoader 00077 { 00078 public: 00079 void load(X3DField &field, const SFString &value); 00080 }; 00081 00082 template<> 00083 class FieldLoader<float> : public X3DFieldLoader 00084 { 00085 public: 00086 void load(X3DField &field, const SFString &value); 00087 }; 00088 00089 template<> 00090 class FieldWriter<bool> : public X3DFieldWriter 00091 { 00092 public: 00093 SFString write(const X3DField &field); 00094 void writeToFile(SFString &output, const SFString &name, const X3DField &field, const SFString &init); 00095 void write(SFString &output, const bool &value); 00096 }; 00097 00098 template<> 00099 class FieldWriter<int> : public X3DFieldWriter 00100 { 00101 public: 00102 SFString write(const X3DField &field); 00103 void writeToFile(SFString &output, const SFString &name, const X3DField &field, const SFString &init); 00104 void write(SFString &output, const int &value); 00105 }; 00106 00107 template<> 00108 class FieldWriter<float> : public X3DFieldWriter 00109 { 00110 public: 00111 SFString write(const X3DField &field); 00112 void writeToFile(SFString &output, const SFString &name, const X3DField &field, const SFString &init); 00113 void write(SFString &output, const float &value); 00114 }; 00115 00116 } 00117 00118 #include "X3DField.inl" 00119 00120 #endif