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

FIDocument.h

00001 #ifndef FIDOCUMENT_H
00002 #define FIDOCUMENT_H
00003 
00004 #include "FITypeDesc.h"
00005 #include <Base/BaseUtility.h>
00006 #include <set>
00007 #include <map>
00008 #include <algorithm>
00009 
00010 namespace Spr {;
00011 
00012 /// 文字列の型
00013 typedef std::string FIString;
00014 /// 長さ0の文字列
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 class FIDocNodePos{
00028 public:
00029     virtual ~FIDocNodePos(){}
00030 };
00031 /** ファイル入出力ノード.
00032     シーングラフをファイルからロードしたり,ファイルにセーブする際に,
00033     ファイルを直接扱わずに,ドキュメントオブジェクトを介してセーブ・
00034     ロードすると,ファイルの扱いをドキュメントオブジェクトに任せる
00035     ことができるので,セーブ・ロードのコードを減らすことができる.
00036     このクラスは,ドキュメントオブジェクトを構成するノードの基本クラス.
00037 */
00038 class SPR_DLL FIDocNodeBase:public UTRefCount{
00039 public:
00040     friend class FISaveScene;
00041     /// 仮想デストラクタを用意
00042     virtual ~FIDocNodeBase(){}
00043     //@name ノードの属性
00044     //@{
00045     /// このノードの名前の取得
00046     virtual UTString GetName()=0;
00047     /// このノードの名前の設定
00048     virtual void SetName(UTString s)=0;
00049     /// このノードの型名の取得
00050     virtual UTString GetType()=0;
00051     /// このノードの型名の設定
00052     virtual void SetType(UTString t){}
00053     /// このノードの型データの取得
00054     virtual FITypeDesc* GetTypeDesc()=0;
00055     /// このノードがシーングラフ内の他のノードへの参照かどうか
00056     virtual bool IsReference() = 0;
00057     //@}
00058     
00059     //@name 木構造の操作
00060     //@{
00061     /// 親ノード
00062     virtual FIDocNodeBase* GetParent()=0;
00063     /// 子ノードの数
00064     virtual int NChildren() const =0;
00065     /// 子ノード
00066     virtual FIDocNodeBase* GetChild(int i){ return Child(i); }
00067     /// 子ノード(Const版)
00068     virtual const FIDocNodeBase* GetChild(int i) const { return ((FIDocNodeBase*)this)->Child(i); }
00069     /// 子ノードの追加
00070     virtual void AddChild(FIDocNodeBase* n){ n->SetParent(this); }
00071     /// 親ノードの設定
00072     virtual void SetParent(FIDocNodeBase*)=0;
00073     /// 子ノードをすべて削除
00074     virtual void ClearChildren()=0;
00075     /// 子ノードを型名で検索
00076     virtual FIDocNodeBase* FindChild(UTString type)=0;
00077     //@}
00078 
00079     /// データを設定
00080     virtual void SetDataImp(const void* data, size_t sz);
00081     /// データを取得
00082     virtual void GetDataImp(void* data, int sz, FIString id);
00083     virtual void GetDataImp(void* data, int sz){ GetDataImp(data, sz,""); }
00084     /// データを設定(テンプレート版)
00085     template <class T> void SetData(const T& t){ SetDataImp(&t, sizeof(t)); }
00086     /// データを取得(テンプレート版)
00087     template <class T> void GetData(T& t){ GetDataImp(&t, sizeof(t), ""); }
00088     template <class T> void GetData(T& t, UTString id){ GetDataImp(&t, sizeof(t), id); }
00089     /// 読み出しコンテキストの作成
00090 protected:
00091     virtual FIDocNodePos* ReadContextImp(FIString id)=0;
00092 public:
00093     FIDocNodePos* ReadContext(){ return ReadContextImp(""); }
00094     FIDocNodePos* ReadContext(FIString id){ return ReadContextImp(id); }
00095     /// 書き込みコンテキストの作成
00096 protected:
00097     virtual FIDocNodePos* WriteContextImp(FIString id){ return ReadContext(id); }
00098 public:
00099     FIDocNodePos* WriteContext(FIString id){ return WriteContextImp(id); }
00100     FIDocNodePos* WriteContext(){ return WriteContextImp(""); }
00101     /// コンテキストの開放
00102     virtual void ReleaseContext(FIDocNodePos* c){ delete c; }
00103     /// 次のフィールドを読み出す関数
00104     virtual bool Read(FIDocNodePos* ctx, char* ptr, int sz)=0;
00105     /// 次のフィールドのデータを書き込む    
00106     virtual void Write(FIDocNodePos* ctx, const char* ptr, int sz, FIString fn, FIString type)=0;
00107     /// フィールドのグループに入る      
00108     virtual void EnterGroup(FIString fn){}
00109     /// グループから抜ける.                
00110     virtual void ExitGroup(){}
00111     
00112     /// ノードのツリーを表示
00113     virtual void Print(std::ostream& os, int indent=0) const;
00114     /// 子ノードのツリーを表示
00115     virtual void PrintChildren(std::ostream& os, int indent=0) const;
00116 protected:
00117     /// 子ノードを返す関数の実装
00118     virtual FIDocNodeBase* Child(int i) = 0;
00119 };
00120 
00121 /// ドキュメントノードの基本クラスのvector
00122 class SPR_DLL FIDocNodes:public UTStack< UTRef<FIDocNodeBase> >{
00123 public:
00124     virtual void Print(std::ostream& os, int indent=0) const;
00125 };
00126 
00127 /// ドキュメントノード
00128 class SPR_DLL FIDocNode:public FIDocNodeBase, public UTTreeNode<FIDocNode>{
00129     UTString name;
00130     UTRef<FITypeDesc> typeDesc;
00131     bool bReference;
00132     std::vector<char> data;
00133 public:
00134     typedef UTTreeNode<FIDocNode> Tree;
00135     ///
00136     FIDocNode(): bReference(false){}
00137     ///
00138     ~FIDocNode(){}
00139     /// 型の設定
00140     void SetType(FITypeDesc* t);
00141     void SetType(FIString s){ FIDocNodeBase::SetType(s); }
00142     //@name ノードの属性
00143     //@{
00144     /// このノードの名前の取得
00145     virtual UTString GetName(){ return name; }
00146     /// このノードの名前の設定
00147     virtual void SetName(UTString s){ name = s; }
00148     /// このノードの型名の取得
00149     virtual UTString GetType();
00150     /// このノードの型データの取得
00151     virtual FITypeDesc* GetTypeDesc(){ return typeDesc; }
00152     /// このノードがシーングラフ内の他のノードへの参照かどうか
00153     virtual bool IsReference(){ return bReference; }
00154     //@}
00155     
00156     //@name 木構造の操作
00157     //@{
00158     /// 親ノード
00159     virtual FIDocNodeBase* GetParent(){ return Tree::GetParent(); }
00160     /// 子ノードの数
00161     virtual int NChildren() const { return (int)Tree::Children().size(); }
00162     /// 親ノードの設定
00163     virtual void SetParent(FIDocNodeBase* n){ Tree::SetParent((FIDocNode*)n); }
00164     /// 子ノードをすべて削除
00165     virtual void ClearChildren(){ Tree::ClearChildren(); }
00166     /// 子ノードを型名で検索
00167     virtual FIDocNodeBase* FindChild(UTString type);
00168     //@}
00169 
00170     /// 読み出しコンテキストの作成
00171     virtual FIDocNodePos* ReadContextImp(FIString id);
00172     /// 次のフィールドを読み出す関数
00173     virtual bool Read(FIDocNodePos* ctx, char* ptr, int sz);
00174     /// 次のフィールドのデータを書き込む    
00175     virtual void Write(FIDocNodePos* ctxBase, const char* ptr, int sz, FIString fn, FIString type);
00176 
00177 protected:
00178     /// 子ノードを返す関数の実装
00179     virtual FIDocNodeBase* Child(int i){ return Tree::Children()[i]; }
00180 };
00181 
00182 /** ドキュメントとファイルの変換のためのコンテキスト.  */
00183 class SPR_DLL FIFileDoc:public UTRefCount{
00184 protected:
00185     /// ファイル名
00186     UTString fileName;
00187     /// ドキュメントノードのスタック
00188     FIDocNodes docs;
00189 public:
00190     /// ファイルからドキュメントオブジェクトを作成
00191     virtual bool Load(UTString filename)=0;
00192     /// ドキュメントオブジェクトに保存
00193     virtual bool Save(UTString filename, FIDocNodeBase* doc)=0;
00194     /// ドキュメントのルートノード
00195     virtual FIDocNodes& GetRoots(){ return docs; }
00196     /// ファイル名
00197     UTString GetFileName(){ return fileName; }
00198 };
00199 
00200 }
00201 #endif

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