3.7. ユーザ定義ポリシー

ここまでの説明ではコンテナに与えるポリシークラスとしてBezelが提供するものを用いたが、ユーザがポリシークラスを定義してもよい。コンテナは、与えられたポリシークラスがBezelが定義したものなのかユーザが定義したものなのかを区別しない。

各々のポリシーについて、ポリシークラスに対する要件が文書で定義されている。例えば配列割り当てポリシーであれば、要件は項6.2.2. 「要件」に記載の通りである。ユーザ自身の手でポリシークラスを実装するときは、すべての要件を満たすようにする必要がある。

例として、std::mallocおよびstd::freeに似たインタフェースを持つmyallocmyfreeを用いて記憶領域割り当てを行う配列割り当てポリシーmypolicyを定義し、vectorに与えて用いるコードを以下に示す。

例 3.16. ユーザ定義ポリシー

#include <cstddef>
#include <limits>
#include <bezel/vector.h>
#include "myalloc.h"

template <
  std::size_t sizeof_value
>
class mypolicy_backend;

struct mypolicy
{
  template <std::size_t N>
  struct bind { typedef mypolicy_backend<N> type; };
};

template <std::size_t N>
class mypolicy_backend
{
public:
  typedef std::size_t size_type;
  struct initializer {};
protected:
  explicit mypolicy_backend(initializer = initializer())
    {}
  ~mypolicy_backend() throw()
    {}
  static void swap(mypolicy_backend&) throw()
    {}
  static initializer get_initializer()
    { return initializer(); }
private:
  mypolicy_backend& operator=(const mypolicy_backend&);
protected:
  static size_type max_size()
    { return std::numeric_limits<size_type>::max() / N; }
  static void* allocate(size_type n)
    { return myalloc(n * N); }
  static void deallocate(void* p, size_type /* n */) throw()
    { myfree(p); }
};

void foo()
{
  using namespace bezel::vector;

  typedef vector<int, allocation_is<mypolicy> > C;

  ...
}