00001 #ifndef FIITERATOR_H
00002 #define FIITERATOR_H
00003 #include <Base/BaseDebug.h>
00004 #include <string>
00005 #include <vector>
00006
00007 namespace Spr{;
00008
00009
00010 typedef std::string FIString;
00011 class FIDocNodeBase;
00012
00013 class FIIteratorImpBase{
00014 public:
00015
00016 virtual FIIteratorImpBase* Clone() const=0;
00017
00018 virtual void Next()=0;
00019
00020 virtual bool Equal(const FIIteratorImpBase* imp) const =0;
00021
00022
00023
00024 virtual FIString GetId() const = 0;
00025
00026 virtual FIString GetType() const =0;
00027
00028 virtual size_t GetElementSize() const =0;
00029
00030 virtual size_t GetNElement() const =0;
00031
00032 virtual bool SetDataImp(const void* data, size_t& sz, size_t esz, FIString id, FIString type)=0;
00033
00034 virtual bool GetDataImp(void* data, size_t& sz)=0;
00035
00036 virtual bool SetNode(FIDocNodeBase* node)=0;
00037
00038 virtual FIDocNodeBase* GetNode()=0;
00039
00040 };
00041
00042
00043
00044
00045
00046
00047 class FIIterator{
00048 public:
00049
00050 FIIteratorImpBase* imp;
00051
00052 FIIterator(FIIteratorImpBase* i){ imp=i; }
00053 FIIterator(){ imp=NULL; }
00054 ~FIIterator(){ delete imp; }
00055 FIIterator(const FIIterator& i){ imp=i.imp->Clone(); }
00056 FIIterator& operator =(const FIIterator& i){
00057 delete imp;
00058 imp=i.imp->Clone();
00059 return *this;
00060 }
00061
00062
00063
00064 FIIterator operator ++(){
00065 FIIterator rv(imp->Clone());
00066 imp->Next();
00067 return rv;
00068 }
00069
00070 FIIterator& operator ++(int){
00071 imp->Next();
00072 return *this;
00073 }
00074
00075 FIIterator operator +(int n){
00076 assert(n >= 0);
00077 FIIterator rv(imp->Clone());
00078 for(int i=0; i<n; ++i) imp->Next();
00079 return rv;
00080 }
00081
00082 bool operator == (const FIIterator& it) const {
00083 return imp->Equal(it.imp);
00084 }
00085
00086 bool operator != (const FIIterator& it) const {
00087 return !imp->Equal(it.imp);
00088 }
00089
00090
00091
00092
00093 FIString GetId() const { return imp->GetId(); }
00094
00095 FIString GetType() const { return imp->GetType(); }
00096
00097 size_t GetElementSize() const { return imp->GetElementSize(); }
00098
00099 size_t GetNElement() const { return imp->GetNElement(); }
00100
00101 bool SetDataImp(const void* data, size_t& sz, size_t esz, FIString id, FIString type){ return imp->SetDataImp(data, sz, esz, id, type); }
00102 bool SetDataImp(const void* data, size_t& sz){ return imp->SetDataImp(data, sz, 0, "", ""); }
00103 template <class T>
00104 bool SetData(const T& t, size_t esz, FIString id, FIString type){ return imp->SetDataImp(&t, sizeof(T), esz, id, type); }
00105 template <class T>
00106 bool SetData(const T& t){ return imp->SetDataImp(&t, sizeof(T), 0, "", ""); }
00107
00108 bool GetDataImp(void* data, size_t& sz) const { return imp->GetDataImp(data, sz); }
00109 template <class T>
00110 bool GetData(T& t){
00111 unsigned sz = sizeof(T);
00112 bool rv = imp->GetDataImp(&t, sz);
00113 assert(sz == sizeof(T));
00114 return rv;
00115 }
00116
00117 bool SetNode(FIDocNodeBase* node){ return imp->SetNode(node); }
00118
00119 FIDocNodeBase* GetNode(){ return imp->GetNode(); }
00120 const FIDocNodeBase* GetNode() const{ return ((FIIteratorImpBase*)imp)->GetNode(); }
00121 };
00122
00123
00124 #if 0
00125
00126
00127 struct FIRefIterator: public FIIterator{
00128 FIRefIterator(FIIteratorImpBase* i){ imp=i; }
00129 ~FIRefIterator(){ imp=NULL; }
00130 FIRefIterator(const FIIterator& i){ imp=i.imp; }
00131 FIRefIterator& operator =(const FIIterator& i){
00132 imp=i.imp;
00133 return *this;
00134 }
00135 };
00136
00137
00138 template <class NODE>
00139 class FIAttrIteratorImp:public FIIteratorImpBase{
00140 public:
00141 typedef NODE::FIAttrIterator pos;
00142 void Next(){ ++pos; }
00143 };
00144
00145
00146 template <class NODE>
00147 class FIValueIteratorImp:public FIIteratorImpBase{
00148 public:
00149 struct FIStackFrame{
00150 NODE* node;
00151 NODE::FIAttrIterator pos;
00152 FIStackFrame(NODE* n):node(n){ pos = node->Begin(); }
00153 };
00154 typedef std::vector<FIStackFrame> FINodeStack;
00155 protected:
00156 FINodeStack nodeStack;
00157 public:
00158 virtual void Next(){
00159 ++ nodeStack.back().pos;
00160 while(1){
00161 if (nodeStack.back().pos == nodeStack.back().node->End()){
00162 if (nodeStack->size()==0) return;
00163 nodeStack->pop_back();
00164 ++ nodeStack.back().pos;
00165 }
00166 NODE* attrNode = nodeStack.back().node->GetAttrNode(FIRefIterator(this));
00167 if (attrNode){
00168 nodeStack.push_back(FIStackFrame(attrNode));
00169 }else{
00170 return;
00171 }
00172 }
00173 }
00174 };
00175 #endif
00176
00177 }
00178 #endif