スカラー割り当てポリシーの実装が満たすべき要件について述べる。
ポリシーは、2相テンプレートと状態を持ち得るポリシークラスで構成される。フロントエンドのクラス名をpolicy_sample、バックエンド導出のために与えられた操作対象の型をT、そのサイズをN(= sizeof()とすると、バックエンドのクラスは
T)
typenamepolicy_sample::templatebind<N>::type
という記述で得られる。以降、バックエンドのクラス名をbackendと表記する。
backendは次のpublicなメンバ型を持つ。
number_type
割り当てる領域の個数を表現可能な符号なし整数型。
initializer
backendに対する初期化オブジェクトの型。backendのオブジェクトは初期化オブジェクトを用いて構築できる。ポリシークラス実装者は、backendのオブジェクトを動的な値で初期化する手段としてinitializerに任意の実装を与えてよい。
backendは次のprotectedなメンバ関数を持つ。以下の記述では非静的メンバ関数での実装を仮定しているが、可能であれば静的メンバ関数で実装しても構わない。
backend()
引数なしでオブジェクトを構築する。
backend(U init)
初期化オブジェクトinitを用いてオブジェクトを構築する。引数の型Uはinitializerもしくはconst initializer&のどちらかである。
backend(const backend& rhs)
同型のオブジェクトrhsを用いてオブジェクトを構築する。
~backend()
オブジェクトを破壊する。
backend& operator=(const backend&)
存在しない。
void swap(backend& rhs)
自身とrhsの状態を入れ換える。
initializer get_initializer() const
初期化オブジェクトを返す。
number_type max_number() const
割り当て可能な記憶領域の個数の最大値を返す。swapで全状態を交換したときを除いて、ポリシーオブジェクトの生存期間全体を通じて戻り値は一定であること。
void* allocate()
型Tのオブジェクト1つを格納するのに充分な大きさを持つ記憶領域を割り当て、その先頭へのポインタを返す。ポリシー実装者は、記憶領域のアラインメントに配慮すること。既に割り当て済みの記憶領域の個数がmax_numberの戻り値に等しいまたはより多いときの動作は未定義。
void deallocate(void* p)
引数pで示される記憶領域を開放する。pがallocateで割り当てられた記憶領域でないときの動作は未定義。
backendは次のprotectedなメンバ関数を任意で持っ
てよい。
void move(U& from)
型Uのオブジェクトfromが割り当てたすべての記憶領域を開放する責任を、自身に委譲する。例えば自身と同一のクラスのすべてのオブジェクトからの委譲を手続きなしに許可するなら、void と定義する。複数のクラスからの委譲を許可するならmove(backend&) {}moveを多重定義してもよいし、可能ならば関数テンプレートにしてもよい。何らかの手続きが必要であれば関数本体に記述する。また逆に、一切の委譲を許可しないときは、この関数を定義しない(より正確には、派生クラスから呼び出せないようにする)こと。
void move(U& from, void* p)
型Uのオブジェクトfromが割り当てた記憶領域pを開放する責任を、自身に委譲する。
template <typename In, typename Op> void move(U& from, In first, In last, Op op)
型Uのオブジェクトfromが割り当てた記憶領域群[, op(first))を開放する責任を、自身に委譲する。op(last)firstとlastは入力反復子、opはfirstの元の記憶領域をなどとして得るための関数または関数オブジェクトである。
op(first)
ポリシークラスが通常満たすべき例外安全性 [7] と計算量 [8] の条件は次の通り。
表 6.1. スカラー割り当てポリシーの例外安全性と計算量
| 操作 | 例外安全性 | 計算量 |
|---|---|---|
| すべてのコンストラクタ | strong | 定数 |
| デストラクタ | nothrow | 定数 |
swap | nothrow | 定数 |
get_initializer | strong | 定数 |
allocate | strong | 償却定数 |
deallocate | nothrow | 償却定数 |
max_number | nothrow | 定数 |
move(from) | nothrow | 定数 |
move(from, p) | nothrow | 定数 |
move(from, b, e) | nothrow | 定数 |