赤紫蘇2.リファレンス

aka:sequence メンバ定義(単純型)

akaxiso2.0-beta2


aka:sequenceは、値クラスとして、メンバを定義できるクラスを用います。メンバが、aka:sequenceの子要素となります。

aka:sequenceを定義するleafクラスは、aka::sequence<>クラスを継承する必要があります。aka::sequence<>クラスの宣言は、以下のとおりです。

namespace aka {
 template<class T, class L = xiso::leaf<T> > class sequence;
}

class Tは、値クラスの型です。Lは、leafクラスであり、デフォルトとして、xiso::leaf<T>が割り当てられています。

struct fooには、std::string型のmember_ メンバがあります。これを、タグ名"member"でシリアライズするための実装例を以下に示します。struct foo のleafクラスを、struct leaf<foo> として定義します。このクラスは、aka::sequence<>を継承します。また、void leaf<foo>::model()メソッド内にて、タグ名"member"と、foo::member_を対応付けます。

struct foo { // (デ)シリアライズされるクラス
 std::string member_;
};

namespace xiso {
 struct leaf<foo> : aka::sequence<foo> {
  void model() {
    member("member", &foo::member_,);
};

子要素の定義

model()メソッド内で、メンバ定義を行うために、以下に示す、struct memberを用います。このクラスのコンストラクタが、メンバ宣言に用いられます。

struct member {
  // コンストラクタ(1)
  template<class P, class V>
  member(const std::string &tagname, V P::* m);

 // コンストラクタ(2) 
  template<class P, class V, class VL>
  member(const std::string &tagname, V P::* m, const VL&); 

  // コンストラクタ(3)
  template<class P, class V>
  member(const std::string &tagname, V P::* m, int minOccurs, int maxOccurs); 

 // コンストラクタ(4) 
  template<class P, class V, class VL> 
  member(const std::string &tagname, V P::* m, const VL&, int minOccurs, int maxOccurs); 

// デフォルト値指定
  void set_default(const std::string &defval); 
};

コンストラクタ(1)は、一番基本的な書式です。tagnameでタグ名を指定し、mでメンバを定義します。
コンストラクタ(2)は、上記の書式に加え、leafクラスを明示的に、指定できます。
コンストラクタ(3)は、メンバが配列(コンテナ)の場合に用います。上記の書式に加え、minOccurs、maxOccursで出現頻度を指定します。minOccursに指定できる値は、0以上の整数です。また、maxOccursに指定できる値は、1以上の整数、もしくは、上限無しを意味するaka::unboundedです。コンストラクタ(4)は、コンストラクタ(3)に加え、leafクラスを明示的に指定できます。

memberの指定に後続して、デフォルト値を設定できます。以下の例では、foo::member_メンバのデフォルト値として、"default string"を指定しています。

namespace xiso {
 struct leaf<foo> { 
  void model() { 
   member("member", &foo::member_,).set_default("default string");
  };
}

ポインタ型の使用

ポインタ型のメンバは、aka::deep_ptr<>によって、定義されるスマートポインタを用いて実装できます。

出現頻度は、自動的に、minOccurs=0, maxOccurs=1と限定されます。

ポインタ型のメンバには、struct ptrmemberを用います。

struct ptrmember {
  // コンストラクタ(1)
  template<class P, class V>
  ptrmember(const std::string &tagname, V P::* m);
  // コンストラクタ(2)
  template<class P, class V, class VL>
  ptrmember(const std::string &tagname, V P::* m, const VL&);
};

コンストラクタ(1)では、第一引数は、タグ名、第二引数は、メンバへのポインタとなります。
コンストラクタ(2)また、追加して、第三引数として、leafクラスを指定することができます。第三引数として、deep_ptr<>が用いる値(deep_ptr<T>の場合、T型>)に対するleafクラスを指定します。

固定値(fixed)の使用

固定値は、単純型要素の値を定数とし、指定された値以外の値がXML文書中に存在した場合、パースエラーとします。

固定値に対して、struct fixed_member<>テンプレートを用います。

template<class V>
struct fixed_member {
  fixed_member(const std::string &tagname, const std::string &fixed_value);
  template<class VL>
  fixed_member(const std::string &tagname, const std::string &fixed_value, const VL &);
};

aka:sequenceの値クラスには、固定値を収めるためのメンバを、定義する必要がありません。

固定値の配列の場合には、struct fixed_array<>テンプレートを用います。

struct fixed_array {
  template<class P, class V>
  fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m,
               int minOccurs, int maxOccurs);
  template<class P, class V, class VL>
  fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m, const VL &,
                int minOccurs, int maxOccurs);
};

固定値の配列の場合には、固定値として現れる子要素の数を収めるために、コンテナを使用します。コンテナ内部に保持されるインスタンスの個数が、固定値配列の要素数となります。

また、シリアライズ時には、配列中のインスタンスの値は、どのような値であっても、固定値で指定した値となります。デシリアライズ時には、固定値として指定された値を持つインスタンスが、子要素の出現個数分、格納されます。


リファレンストップへ 赤紫蘇2トップへ sourceforgeプロジェクトページへ