00001 #ifndef FIDOCNODE_H
00002 #define FIDOCNODE_H
00003
00004 #include "FIIterator.h"
00005 #include "FITypeDesc.h"
00006 #include <Base/BaseUtility.h>
00007 #include <list>
00008 #include <algorithm>
00009
00010 namespace Spr {;
00011
00012
00013 typedef std::string FIString;
00014
00015 extern FIString zeroLengthString;
00016
00017 struct FIStringLess{
00018 bool operator() (const FIString& s1, const FIString& s2) const { return s1.compare(s2) < 0;}
00019 };
00020
00021 inline std::ostream& operator << (std::ostream& os, FIString s){
00022 os << s.c_str();
00023 return os;
00024 }
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 class FITypeDesc;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 class SPR_DLL FIDocNodeBase:public UTRefCount{
00077 public:
00078 friend class FISaveScene;
00079
00080 virtual ~FIDocNodeBase(){}
00081
00082
00083
00084
00085 virtual UTString GetName() const =0;
00086
00087 virtual void SetName(UTString s)=0;
00088
00089
00090
00091
00092 virtual UTString GetType() const =0;
00093
00094
00095 virtual void SetType(UTString t){ assert(0); }
00096
00097 virtual void SetTypeDesc(FITypeDesc* desc){ assert(0); }
00098 bool IsReference() const { return GetType().compare("REF") == 0; }
00099
00100
00101
00102
00103
00104 virtual FIDocNodeBase* GetParent()=0;
00105
00106 virtual int NChildren() const =0;
00107
00108 virtual FIDocNodeBase* GetChild(int i){ return Child(i); }
00109
00110 virtual const FIDocNodeBase* GetChild(int i) const { return ((FIDocNodeBase*)this)->Child(i); }
00111
00112 virtual void AddChild(FIDocNodeBase* n){ n->SetParent(this); }
00113
00114 virtual void SetParent(FIDocNodeBase*)=0;
00115
00116 virtual void ClearChildren()=0;
00117
00118
00119
00120
00121
00122 template <class T> bool SetWholeData(const T& t){ return SetWholeData(&t, sizeof(t)); }
00123 virtual bool SetWholeData(const void* data, size_t sz);
00124
00125 template <class T> bool GetWholeData(T& t){ return GetWholeData(&t, sizeof(t)); }
00126 virtual bool GetWholeData(void* data, size_t sz);
00127
00128
00129 template <class T> bool SetData(const T& t, FIString id, FIString type){ return FindAttr(id).SetData(t, type); }
00130
00131 bool SetData(const void* data, size_t& dataSize, size_t elementSize, FIString id, FIString type){ return FindAttr(id).SetDataImp(data, dataSize, elementSize, id, type); }
00132
00133 template <class T> bool GetData(T& t, FIString id){ return FindAttr(id).GetData(t); }
00134
00135 bool GetData(void* data, size_t sz, FIString id){ return FindAttr(id).GetDataImp(data, sz); }
00136
00137
00138
00139
00140
00141 virtual FIDocNodeBase* SetNewNode(FIString id, FIString type)=0;
00142
00143
00144 virtual FIIterator FirstAttr() const =0;
00145
00146 virtual FIIterator LastAttr() const =0;
00147
00148 virtual bool IsLast(const FIIterator& it) const { return it == LastAttr(); }
00149
00150 virtual FIIterator FindAttr(FIString id, size_t pos=0) const =0;
00151
00152
00153
00154 virtual void Print(std::ostream& os, int indent=0) const;
00155
00156 virtual void PrintAttr(std::ostream& os, int indent=0) const;
00157
00158 virtual void PrintChildren(std::ostream& os, int indent=0) const;
00159 protected:
00160
00161 virtual FIDocNodeBase* Child(int i) = 0;
00162 };
00163
00164
00165 class SPR_DLL FIDocNodes:public UTStack< UTRef<FIDocNodeBase> >{
00166 public:
00167 virtual void Print(std::ostream& os, int indent=0) const;
00168 };
00169
00170
00171 class SPR_DLL FIDocNode:public FIDocNodeBase, public UTTreeNode<FIDocNode>{
00172 public:
00173 struct TData{
00174 typedef std::vector<char> container;
00175 FIString type;
00176 size_t elementSize;
00177 container data;
00178 TData(){ elementSize=0; }
00179
00180 void PushBack(const void* d){
00181 data.resize(data.size()+elementSize);
00182 container::iterator it = data.end()-elementSize;
00183 memcpy(&*it, d, elementSize);
00184 }
00185
00186 void PopBack(){
00187 data.resize(data.size() - elementSize);
00188 }
00189
00190 size_t ElementSize() const { return elementSize; }
00191 void ElementSize(size_t s){ elementSize = s; }
00192
00193 void Size(size_t n){ data.resize(n*elementSize); }
00194 size_t Size() const { return elementSize ? data.size()/elementSize : 0; }
00195
00196 size_t DataSize(){ return data.size(); }
00197
00198 char* Data(size_t i){ return &*data.begin() + i*elementSize; }
00199
00200 char* Begin(){ return &*data.begin(); }
00201
00202 const char* Begin() const { return &*data.begin(); }
00203
00204 char* End(){ return &*data.end(); }
00205
00206 const char* End() const { return &*data.end(); }
00207
00208 void Resize(size_t s){ data.resize(s*elementSize); }
00209 };
00210
00211 struct TValue{
00212
00213 std::vector< UTRef<FIDocNode> > nodes;
00214
00215 TData data;
00216
00217 size_t Size() const {
00218 return nodes.size() ? nodes.size() : data.Size();
00219 }
00220 };
00221 struct TAttr: public TValue{
00222 UTString id;
00223 TAttr(){}
00224 TAttr(FIString i):id(i){}
00225 bool operator < (const TAttr& b) const { return id.compare(b.id) < 0; }
00226 bool operator == (const TAttr& b) const { return id.compare(b.id)==0; }
00227 };
00228 class TAttrs:public std::vector<TAttr>{
00229 public:
00230 typedef std::vector<TAttr> base;
00231 TAttrs(){}
00232 TAttrs(size_t sz, const TAttr a):base(sz,a){}
00233 iterator Find(FIString id) const;
00234 };
00235 class TIteratorImp:public FIIteratorImpBase{
00236 public:
00237 TAttrs::iterator it;
00238 size_t pos;
00239 FIDocNode* node;
00240
00241 TIteratorImp(FIDocNode* n, TAttrs::const_iterator i, size_t p):node(n), it((TAttrs::iterator&)i), pos(p){}
00242 virtual FIIteratorImpBase* Clone() const { return new TIteratorImp(*this); }
00243 virtual void Next(){
00244 if (pos < it->Size()) { ++pos; }
00245 else {
00246 if (Validate()) ++pos;
00247 }
00248 }
00249 bool Equal(const FIIteratorImpBase* bBase) const {
00250 const TIteratorImp* a = this;
00251 const TIteratorImp* b = (TIteratorImp*) bBase;
00252 return a->it == b->it && a->node == b->node && a->pos == b->pos;
00253 }
00254 bool Validate() const;
00255
00256
00257
00258
00259 virtual FIString GetId() const;
00260
00261 virtual FIString GetType() const;
00262
00263 virtual size_t GetElementSize() const;
00264
00265 virtual size_t GetNElement() const;
00266
00267 virtual bool SetDataImp(const void* data, size_t& sz, size_t esz, FIString id, FIString type);
00268
00269 virtual bool GetDataImp(void* data, size_t& sz);
00270
00271 virtual bool SetNode(FIDocNodeBase* node);
00272
00273 virtual FIDocNodeBase* GetNode();
00274
00275 };
00276
00277
00278 typedef UTTreeNode<FIDocNode> FITree;
00279
00280 public:
00281 TAttrs attrs;
00282 FIString name;
00283 FIString type;
00284 public:
00285
00286 FIDocNode(){}
00287
00288 ~FIDocNode(){}
00289
00290
00291
00292 virtual UTString GetName() const { return name; }
00293
00294 virtual void SetName(UTString s){ name = s; }
00295
00296 virtual void SetType(FIString t);
00297
00298 virtual FIString GetType() const;
00299
00300
00301
00302
00303
00304 virtual FIDocNodeBase* GetParent(){ return FITree::GetParent(); }
00305
00306 virtual int NChildren() const { return (int)FITree::Children().size(); }
00307
00308 virtual void SetParent(FIDocNodeBase* n){ FITree::SetParent((FIDocNode*)n); }
00309
00310 virtual void ClearChildren(){ FITree::ClearChildren(); }
00311
00312 virtual FIDocNodeBase* Child(int i){ return FITree::Children()[i]; }
00313
00314
00315
00316
00317 virtual FIDocNodeBase* SetNewNode(FIString id, FIString type);
00318 virtual FIIterator FirstAttr() const;
00319 virtual FIIterator LastAttr() const;
00320 virtual FIIterator FindAttr(FIString id, size_t pos=0) const;
00321 virtual bool IsLast(const FIIterator& it) const;
00322
00323 };
00324 }
00325 #endif