メインページ | ネームスペース一覧 | クラス階層 | 構成 | Directories | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ | 関連ページ

FIIterator.h

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 /// FileIOで使う文字列型
00010 typedef std::string FIString;
00011 class FIDocNodeBase;
00012 /** 抽象ツリー(FIDocNodeBase)のためのイタレータの実装の基本クラス   */
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     /// idを取得
00024     virtual FIString GetId() const = 0;
00025     /// データ属性の型を取得
00026     virtual FIString GetType() const =0;
00027     /// データ属性の1要素のサイズを取得
00028     virtual size_t GetElementSize() const =0;
00029     /// データ属性の要素数を取得
00030     virtual size_t GetNElement() const =0;
00031     /// データ属性を設定する.szには,実際にセットしたサイズが返る.
00032     virtual bool SetDataImp(const void* data, size_t& sz, size_t esz, FIString id, FIString type)=0;
00033     /// データ属性を取得する.szには,実際に読み出したサイズが返る.
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 /** 抽象ツリー(FIDocNodeBase)のためのイタレータ
00043     ノードは,複数の属性を持つ.属性はキーと値からなる.
00044     値はデータかノードの配列を持つ.
00045     イタレータは配列を1要素ずつ進む.
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     ///@name ポインタ演算
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     /// 属性のidを取得
00093     FIString GetId() const { return imp->GetId(); }
00094     /// データ属性の型を取得
00095     FIString GetType() const { return imp->GetType(); }
00096     /// データ属性の1要素のサイズを取得
00097     size_t GetElementSize() const { return imp->GetElementSize(); }
00098     /// データ属性の要素数を取得
00099     size_t GetNElement() const { return imp->GetNElement(); }
00100     /// データ属性を設定する.szには,実際にセットしたサイズが返る.
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     /// データ属性を取得する.szには,実際に読み出したサイズが返る.
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;   //  End() を指す.
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 }   //  namespace Spr
00178 #endif

Springheadに対してSun Apr 16 01:57:51 2006に生成されました。  doxygen 1.4.1