配列構築ポリシーの実装が満たすべき要件について述べる。
ポリシーは、2相テンプレートと状態を持ち得るポリシークラスで構成される。フロントエンドのクラス名をpolicy_sample、バックエンド導出のために与えられた操作対象の型をT、型Tの連続領域の大きさを表す型をSとすると、バックエンドのクラスは
typenamepolicy_sample::templatebind<T,S>::type
という記述で得られる。以降、バックエンドのクラス名をbackendと表記する。
backendは次のpublicなメンバ型を持つ。
pointer
型Tのオブジェクトを指すポインタの型。通常はT*。
const_pointer
型Tのconstオブジェクトを指すポインタの型。通常はconst T*。
reference
型Tのオブジェクトへの参照の型。通常はT&。
const_reference
型Tのconstオブジェクトへの参照の型。通常はconst T&。
array_marker_t
多重定義メンバ関数constructの多重定義解決のために使用される型。空クラスなど、型const_referenceと区別可能な任意の型定義を与えてよい。
backendは次のprotectedなメンバ関数を持つ。
backend()
引数なしでオブジェクトを構築する。
backend(const backend& rhs)
同型のオブジェクトrhsを用いてオブジェクトを構築する。
~backend()
オブジェクトを破壊する。
backend& operator=(const backend&)
存在しない。
void swap(backend& rhs)
自身とrhsの状態を入れ換える。
void construct(void* p)
型Tのオブジェクト1つを格納するのに充分な大きさを持つ記憶領域p上に型Tのオブジェクトを1つ構築する。構築時に引数を与えない。pが構築済みのオブジェクトを指しているとき、pのアラインメントに問題があるときの動作は未定義。
void construct(void* p, const_reference v)
型Tのオブジェクト1つを格納するのに充分な大きさを持つ記憶領域p上に型Tのオブジェクトを1つ構築する。構築時に引数vを与える。pが構築済みのオブジェクトを指しているとき、pのアラインメントに問題があるときの動作は未定義。
void destruct(pointer p)
引数pで示される記憶領域上の1つのオブジェクトを破壊する。pがconstructで構築したオブジェクトを指していないときの動作は未定義。
pointer construct(void* p, S n, array_marker_t)
型Tのオブジェクトn個を連続して格納するのに充分な大きさを持つ記憶領域p上に、型Tのオブジェクトをn個構築する。構築時に引数を与えない。static_cast<pointer>(を返す。範囲[p) + np, p + n)の一部または全体が使用可能記憶領域でないとき、同範囲上に何らかの構築済みオブジェクトが存在するとき、pのアラインメントに問題があるときの動作は未定義。
pointer construct(void* p, S n, const_reference v)
型Tのオブジェクトn個を連続して格納するのに充分な大きさを持つ記憶領域p上に、型Tのオブジェクトをn個構築する。構築時に引数vを与える。static_cast<pointer>(を返す。範囲[p) + np, p + n)の一部または全体が使用可能記憶領域でないとき、同範囲上に何らかの構築済みオブジェクトが存在するとき、pのアラインメントに問題があるときの動作は未定義。
template <typename In> pointer construct(void* p, In first, In last)
型Tのオブジェクトn個を連続して格納するのに充分な大きさを持つ記憶領域p上に、型Tのオブジェクトをn個構築する。ただし、nはに等しいものとする。構築時に、std::distance(first, last)static_cast<pointer>(に位置する要素にp) + 0*を、firststatic_cast<pointer>(に位置する要素にp) + 1*の次の要素を与える。これをfirstの直前まで同様に行う。laststatic_cast<pointer>(を返す。範囲[p) + np, p + n)の一部または全体が使用可能記憶領域でないとき、同範囲上に何らかの構築済みオブジェクトが存在するとき、pのアラインメントに問題があるときの動作は未定義。
void destruct(pointer first, pointer last)
範囲[first, last)で示される記憶領域上のすべてのオブジェクトを破壊する。対象範囲がconstructで構築したオブジェクトで満たされていないときの動作は未定義。
ポリシークラスが通常満たすべき例外安全性と計算量の条件は次の通り。
表 6.4. 配列構築ポリシーの例外安全性と計算量
| 操作 | 例外安全性 | 計算量 |
|---|---|---|
| すべてのコンストラクタ | strong | 定数 |
| デストラクタ | nothrow | 定数 |
swap | nothrow | 定数 |
construct(p), construct(p, t) | strong | 定数 |
destruct(p) | nothrow | 定数 |
construct(p, n, marker), construct(p, n, t) | strong | nに対して線形 |
construct(p, i, j) | strong | に対して線形 |
destruct(q1, q2) | nothrow | に対して線形 |