![]() |
赤紫蘇2.リファレンス |
||
単純型 |
|||
akaxiso2.0-beta2 | |||
|
|||
単純型 単純型に対するleafクラスは、aka::simpletype<>クラスを用いて定義します。 template<class V, class L=xiso::leaf<V> > struct simpletype { static void read_text(void *elm, const std::string &entity, aka::entity_complements &ecomp); static void write_text(const void *elm, std::ostream &ostm, aka::entity_complements &ecomp); }; ユーザは、read_text()、write_text()メソッドを用いて、単純型のテキストへの書き出し、テキストの読み込みを実装します。 赤紫蘇2の組み込み型については、あらかじめleafクラスの実装が提供されています。5. 組み込み型をご参照ください。 read_text()メソッドの第一引数は、void*で渡される値クラスのインスタンスへのポインタです。これを、V型にキャストして用います。istmには、読み込むべき文字列が設定されています。 また、write_text()メソッドの第一引数は、void *で渡される値クラスインスタンスへのポインタです。これも同様に、V型にキャストし、ostmで渡される出力ストリームにテキストとして書き出します。 aka::entity_complementsクラスは、単純型のテキストの読み込み、テキストへの書き出しを行う際の補足情報を提供します。現在のところ、名前空間とそのプレフィックスの対応が参照可能です。また、xs:ID型のテキスト値に対する値チェック機能が使用可能です。必要に応じ、ユーザ定義の補足情報を定義することが可能です。 値の読み込み、書き出しに失敗した場合には、例外として、aka::error()クラスをthrowしてください。 簡単な例として、long型のleafクラスの定義を以下にしめします。 namespace xiso { template<> struct leaf<long> : aka::simpletype<long> { static void read_text(void *elm, const std::string &entity, aka::entity_complements &ecomp) { V &v = *static_cast<V*>(elm); aka::isstream(entity); istm >> v; if (istm.fail()) throw aka::error("Failed to parse long value.", __FILE__, __LINE__); } static void write_text(const void *elm, std::ostream &ostm, aka::entity_complements &ecomps) { const V &v = *static_cast<const V*>(elm); ostm << v; } }; read_text()、write_text()内部の実装により、値の範囲チェックや形式チェックなどを行うことで、妥当性検証を行うことができます。 |