#include <stdio.h>
#include <memory>
#include <vector>
#include <list>
namespace mmap_allocator_namespace {
template <typename T>
class mmap_allocator: public std::allocator <T> {
public: typedef size_t size_type;
typedef T * pointer;
typedef
const T * const_pointer;
template <typename _Tp1>
struct rebind {
typedef mmap_allocator <_Tp1> other;
};
pointer allocate(size_type n,
const void * hint = 0) {
fprintf(stdout, "Alloc %d bytes.\n", n * sizeof(T));
return std::allocator <T> ::allocate(n, hint);
}
void deallocate(pointer p, size_type n) {
fprintf(stdout, "Dealloc %d bytes (%p).\n", n * sizeof(T), p);
return std::allocator <T> ::deallocate(p, n);
}
mmap_allocator() throw (): std::allocator <T> () {
fprintf(stdout, "Hello allocator!\n");
}
mmap_allocator(const mmap_allocator & a) throw (): std::allocator <T> (a) {}
template <class U>
mmap_allocator(const mmap_allocator <U> & a) throw (): std::allocator <T> (a) {}~mmap_allocator() throw () {}
};
}
using namespace std;
using namespace mmap_allocator_namespace;
int main() {
// раскомментируем нужное:
// vector<int, mmap_allocator<int>> int_vec(32, 0, mmap_allocator<int>());
// list<int, mmap_allocator<int>> int_lst(32, 0, mmap_allocator<int>());
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxsaXN0PgoKbmFtZXNwYWNlIG1tYXBfYWxsb2NhdG9yX25hbWVzcGFjZSB7CiAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBjbGFzcyBtbWFwX2FsbG9jYXRvcjogcHVibGljIHN0ZDo6YWxsb2NhdG9yIDxUPiB7CiAgICAgIHB1YmxpYzogdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogICAgICB0eXBlZGVmIFQgKiBwb2ludGVyOwogICAgICB0eXBlZGVmCiAgICAgIGNvbnN0IFQgKiBjb25zdF9wb2ludGVyOwoKICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcDE+CiAgICAgIHN0cnVjdCByZWJpbmQgewogICAgICAgIHR5cGVkZWYgbW1hcF9hbGxvY2F0b3IgPF9UcDE+IG90aGVyOwogICAgICB9OwoKICAgICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgbiwKICAgICAgICBjb25zdCB2b2lkICogaGludCA9IDApIHsKICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkFsbG9jICVkIGJ5dGVzLlxuIiwgbiAqIHNpemVvZihUKSk7CiAgICAgICAgcmV0dXJuIHN0ZDo6YWxsb2NhdG9yIDxUPiA6OmFsbG9jYXRlKG4sIGhpbnQpOwogICAgICB9CgogICAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUgbikgewogICAgICAgIGZwcmludGYoc3Rkb3V0LCAiRGVhbGxvYyAlZCBieXRlcyAoJXApLlxuIiwgbiAqIHNpemVvZihUKSwgcCk7CiAgICAgICAgcmV0dXJuIHN0ZDo6YWxsb2NhdG9yIDxUPiA6OmRlYWxsb2NhdGUocCwgbik7CiAgICAgIH0KCiAgICAgIG1tYXBfYWxsb2NhdG9yKCkgdGhyb3cgKCk6IHN0ZDo6YWxsb2NhdG9yIDxUPiAoKSB7CiAgICAgICAgZnByaW50ZihzdGRvdXQsICJIZWxsbyBhbGxvY2F0b3IhXG4iKTsKICAgICAgfQogICAgICBtbWFwX2FsbG9jYXRvcihjb25zdCBtbWFwX2FsbG9jYXRvciAmIGEpIHRocm93ICgpOiBzdGQ6OmFsbG9jYXRvciA8VD4gKGEpIHt9CiAgICAgIHRlbXBsYXRlIDxjbGFzcyBVPgogICAgICBtbWFwX2FsbG9jYXRvcihjb25zdCBtbWFwX2FsbG9jYXRvciA8VT4gJiBhKSB0aHJvdyAoKTogc3RkOjphbGxvY2F0b3IgPFQ+IChhKSB7fX5tbWFwX2FsbG9jYXRvcigpIHRocm93ICgpIHt9CiAgICB9Owp9Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgbW1hcF9hbGxvY2F0b3JfbmFtZXNwYWNlOwoKaW50IG1haW4oKSB7CiAgLy8g0YDQsNGB0LrQvtC80LzQtdC90YLQuNGA0YPQtdC8INC90YPQttC90L7QtToJCiAgLy8gdmVjdG9yPGludCwgbW1hcF9hbGxvY2F0b3I8aW50Pj4gaW50X3ZlYygzMiwgMCwgbW1hcF9hbGxvY2F0b3I8aW50PigpKTsKICAvLyBsaXN0PGludCwgbW1hcF9hbGxvY2F0b3I8aW50Pj4gaW50X2xzdCgzMiwgMCwgbW1hcF9hbGxvY2F0b3I8aW50PigpKTsKICByZXR1cm4gMDsKfQ==