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