#include <iostream>
#include <iomanip>
#include <memory>
#include <map>
using namespace std;
template < typename T >
struct MyAllocator : std::allocator< T > {
// ctors
MyAllocator() = default;
MyAllocator( MyAllocator const & ) = default;
template < typename U >
MyAllocator( MyAllocator<U> const & ) { }
// member function
typename std::allocator< T >::pointer
allocate( typename std::allocator< T >::size_type n,
std::allocator<void>::const_pointer hint = 0 ) {
typename std::allocator< T >::pointer result = std::allocator< T >::allocate( n, hint );
cout << "allocate(" << n << ", " << hint << ") -> " << result << " "
<< "size = " << sizeof( T ) * n << endl;;
return result;
}
// member type
template < typename U >
struct rebind {
typedef MyAllocator<U> other;
};
};
int main() {
typedef int iIndex;
typedef std::string Data;
typedef map<
iIndex,
Data,
std::less< iIndex >,
MyAllocator< std::pair<const iIndex, Data> >
> mapData;
typedef int iType;
typedef map<
iType,
mapData,
std::less< iType >,
MyAllocator< std::pair<const iType, mapData> >
> Foo;
Foo foo;
foo[ 1 ].insert( make_pair(1, "aaa") );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPG1hcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgpzdHJ1Y3QgTXlBbGxvY2F0b3IgOiBzdGQ6OmFsbG9jYXRvcjwgVCA+IHsKCiAgICAvLyBjdG9ycwogICAgTXlBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CiAgICBNeUFsbG9jYXRvciggTXlBbGxvY2F0b3IgY29uc3QgJiApID0gZGVmYXVsdDsKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVSA+CiAgICBNeUFsbG9jYXRvciggTXlBbGxvY2F0b3I8VT4gY29uc3QgJiApIHsgfQoKICAgIC8vIG1lbWJlciBmdW5jdGlvbgogICAgdHlwZW5hbWUgc3RkOjphbGxvY2F0b3I8IFQgPjo6cG9pbnRlcgogICAgYWxsb2NhdGUoIHR5cGVuYW1lIHN0ZDo6YWxsb2NhdG9yPCBUID46OnNpemVfdHlwZSBuLAogICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyIGhpbnQgPSAwICkgewoKICAgICAgICB0eXBlbmFtZSBzdGQ6OmFsbG9jYXRvcjwgVCA+Ojpwb2ludGVyIHJlc3VsdCA9IHN0ZDo6YWxsb2NhdG9yPCBUID46OmFsbG9jYXRlKCBuLCBoaW50ICk7CgogICAgICAgIGNvdXQgPDwgImFsbG9jYXRlKCIgPDwgbiA8PCAiLCAiIDw8IGhpbnQgPDwgIikgLT4gIiA8PCByZXN1bHQgPDwgIiAiCiAgICAgICAgICAgICA8PCAic2l6ZSA9ICIgPDwgc2l6ZW9mKCBUICkgKiBuIDw8IGVuZGw7OwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8vIG1lbWJlciB0eXBlCiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFUgPgogICAgc3RydWN0IHJlYmluZCB7CiAgICAgICAgdHlwZWRlZiBNeUFsbG9jYXRvcjxVPiBvdGhlcjsKICAgIH07Cgp9OwoKaW50IG1haW4oKSB7CgogICAgdHlwZWRlZiBpbnQgaUluZGV4OwogICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBEYXRhOwoKICAgIHR5cGVkZWYgbWFwPAogICAgICAgICAgICAgICAgaUluZGV4LAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIHN0ZDo6bGVzczwgaUluZGV4ID4sCiAgICAgICAgICAgICAgICBNeUFsbG9jYXRvcjwgc3RkOjpwYWlyPGNvbnN0IGlJbmRleCwgRGF0YT4gPgogICAgICAgICAgICAgICA+IG1hcERhdGE7CgogICAgdHlwZWRlZiBpbnQgaVR5cGU7CiAgICB0eXBlZGVmIG1hcDwKICAgICAgICAgICAgICAgIGlUeXBlLAogICAgICAgICAgICAgICAgbWFwRGF0YSwKICAgICAgICAgICAgICAgIHN0ZDo6bGVzczwgaVR5cGUgPiwKICAgICAgICAgICAgICAgIE15QWxsb2NhdG9yPCBzdGQ6OnBhaXI8Y29uc3QgaVR5cGUsIG1hcERhdGE+ID4KICAgICAgICAgICAgICAgPiBGb287CiAgICBGb28gZm9vOwoKICAgIGZvb1sgMSBdLmluc2VydCggbWFrZV9wYWlyKDEsICJhYWEiKSApOwoKfQo=