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