|  |  | 赤紫蘇２．リファレンス
|  | aka:sequence メンバ定義(単純型)
| akaxiso2.0-beta1 |
| 目次 はじめに 1. 概要 2. ライブラリAPI 3.単純型 4. 組み込み型 5. 配列 6. ポインタ 7. データモデル 8. aka:sequence 8.1 メンバ定義(単純型) 8.2 メンバ定義(複雑型) 8.3 出現頻度定義 9. aka:all 10 aka:choice 10.1 要素の定義 10.2 固定値の定義 10.3 mocクラス 10.4 itemの扱い 11 aka:simplecontent 12 属性 13 XML Schema機能対応表 |  | 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);
    };
固定値の配列の場合には、固定値として現れる子要素の数を収めるために、コンテナを使用します。コンテナ内部に保持されるインスタンスの個数が、固定値配列の要素数となります。 また、シリアライズ時には、配列中のインスタンスの値は、どのような値であっても、固定値で指定した値となります。デシリアライズ時には、固定値として指定された値を持つインスタンスが、子要素の出現個数分、格納されます。

リファレンストップに戻る 赤紫蘇ホームページへ sourceforgeプロジェクトページへ