00001 #ifndef _FIDOCONVERTER 00002 #define _FIDOCONVERTER 00003 #include "FIDocNode.h" 00004 #include "FITypeDesc.h" 00005 #include <set> 00006 00007 /** @file FIDocConverter.h ドキュメントを別のドキュメントに変換する */ 00008 namespace Spr{; 00009 00010 class FIDocConverter; 00011 00012 /** 変換のテンプレート */ 00013 class FIDocConvBase: public UTRefCount{ 00014 public: 00015 //@name ノード・フィールドのマッチング. 00016 //@{ 00017 /// ノードの型名 00018 virtual UTString GetType() const = 0; 00019 //@} 00020 00021 /// 前順序変換動作 00022 virtual void Pre(FIDocConverter* ctx){} 00023 /// 後順序変換動作 00024 virtual void Post(FIDocConverter* ctx){} 00025 }; 00026 inline bool operator < (const FIDocConvBase& d1, const FIDocConvBase& d2){ 00027 return d1.GetType().compare(d2.GetType()) < 0; 00028 } 00029 00030 /** 属性の移動 */ 00031 class FIDocConvMove: public FIDocConvBase{ 00032 public: 00033 /// 移動先のフィールド名 00034 FIString fieldTo; 00035 /// 前順序変換動作 00036 virtual void Pre(FIDocConverter* ctx); 00037 }; 00038 00039 /** ドキュメントのコンバータ */ 00040 class FIDocConverter{ 00041 protected: 00042 UTRef<FIDocNodeBase> from, to, root; 00043 typedef std::multiset< UTRef<FIDocConvBase> , UTContentsLess< UTRef<FIDocConvBase> > > Convs; 00044 Convs convs; 00045 UTRef<FITypeDescDb> typeDb; 00046 public: 00047 /// タイプDBの取得 00048 FITypeDescDb* GetTypeDb(){ return typeDb; } 00049 /// タイプDBの設定 00050 void SetTypeDb(FITypeDescDb* t) { typeDb = t; } 00051 /// 変換元のルートノードを渡し,変換を行う. 00052 void Convert(FIDocNodeBase* r); 00053 /// 変換フィルタの追加 00054 void Register(FIDocConvBase* f); 00055 public: 00056 FIDocNodeBase* GetRoot(){ return root; } 00057 /// 現在変換中の変換元ノード 00058 FIDocNodeBase* From(); 00059 /// 現在変換中の変換先ノード 00060 FIDocNodeBase* To(); 00061 /// 現在変換中の変換先ノードの移動 00062 void ChangeTo(FIString t); 00063 /// 現在変換中の変換先ノードの移動 00064 void UpTo(); 00065 /// ノードの作成 00066 virtual FIDocNodeBase* CreateNode(FIString t); 00067 }; 00068 00069 00070 00071 00072 00073 00074 } // namespace Spr 00075 #endif