開放ポリシーは、使用者から記憶領域を返却されたときに、どの程度記憶領域をまとめて開放するのかを決定するポリシーである。2相テンプレートと状態を持ち得るポリシークラスを用いて構成する。
フロントエンドのクラス名をpolicy_sample、バックエンド導出のために与えられた記憶領域の個数を表す型をSとすると、バックエンドのクラスは
typenamepolicy_sample::templatebind<S>::type
という記述で得られる。以降、バックエンドのクラス名をbackendと表記する。
backendは次のpublicなメンバ型を持つ。
initializer
backendに対する初期化オブジェクトの型。backendのオブジェクトは初期化オブジェクトを用いて構築できる。
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
初期化オブジェクトを返す。
S to_be_released(S x) const
使用者から1つの記憶領域が返却され、現在既に蓄積されている記憶領域数と返却された記憶領域数の合計がxであったとき、記憶領域をいくつ開放するべきかを返す。
定義済みの開放ポリシーは次の通り。すべて名前空間bezel::scalar_allocation_policy::pool_release_policyに定義されている。
pool_release_policy::immediate
蓄積をすべて開放する。
pool_release_policy::never
開放をまったく行わない。
pool_release_policy::static_constant
蓄積が一定数以上になったらまとめて開放する。割り当て済みの記憶領域数が以上であれば、n * 2n個の記憶領域を開放する。開放のための定数nは、フロントエンドの第1テンプレートパラメータに静的な定数として与える。
pool_release_policy::dynamic_constant
蓄積が一定数以上になったらまとめて開放する。割り当て済みの記憶領域数が以上であれば、n * 2n個の記憶領域を開放する。開放のための定数nは、メンバ関数set_release_sizeまたは初期化オブジェクトで指定する。
pool_release_policy::default_selected
pool_release_policy::immediateの別名。デフォルトで選択される。