#include <iostream>
#include <set>
#include <string>
#include <type_traits>
template <typename T>
struct NoisyAlloc
{
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T *;
using const_pointer = const T *;
using reference = T &;
using const_reference = const T &;
template <typename U> struct rebind { using other = NoisyAlloc<U>; };
T * allocate(std::size_t n)
{
std::cout << "Allocating " << n << " units.\n";
return static_cast<T *>(::operator new(n * sizeof(T)));
}
void deallocate(T * p, std::size_t n)
{
std::cout << "Freeing " << n << " units.\n";
::operator delete(p);
}
using is_always_equal = std::true_type;
bool operator==(const NoisyAlloc&) const { return true; }
bool operator!=(const NoisyAlloc&) const { return false; }
};
int main()
{
std::set<unsigned char> s;
for (unsigned int c = 0; c < 0x100; ++c) s.insert(c);
std::basic_string<char, std::char_traits<char>, NoisyAlloc<char>> str(s.begin(), s.end());
//std::basic_string<char, std::char_traits<char>, NoisyAlloc<char>> str;
//str.reserve(500);
//str.append(s.begin(), s.end());
//str.assign(s.begin(), s.end());
//str.insert(str.end(), s.begin(), s.end());
//for (unsigned char c : s) str.push_back(c);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IE5vaXN5QWxsb2MKewogICAgdXNpbmcgc2l6ZV90eXBlID0gc3RkOjpzaXplX3Q7CiAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKCiAgICB1c2luZyB2YWx1ZV90eXBlID0gVDsKICAgIHVzaW5nIHBvaW50ZXIgPSBUICo7CiAgICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCAqOwogICAgdXNpbmcgcmVmZXJlbmNlID0gVCAmOwogICAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVCAmOwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBzdHJ1Y3QgcmViaW5kIHsgdXNpbmcgb3RoZXIgPSBOb2lzeUFsbG9jPFU+OyB9OwoKICAgIFQgKiBhbGxvY2F0ZShzdGQ6OnNpemVfdCBuKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQWxsb2NhdGluZyAiIDw8IG4gPDwgIiB1bml0cy5cbiI7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4oOjpvcGVyYXRvciBuZXcobiAqIHNpemVvZihUKSkpOwogICAgfQogICAgdm9pZCBkZWFsbG9jYXRlKFQgKiBwLCBzdGQ6OnNpemVfdCBuKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRnJlZWluZyAiIDw8IG4gPDwgIiB1bml0cy5cbiI7CiAgICAgICAgOjpvcGVyYXRvciBkZWxldGUocCk7CiAgICB9CgogICAgdXNpbmcgaXNfYWx3YXlzX2VxdWFsID0gc3RkOjp0cnVlX3R5cGU7CiAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTm9pc3lBbGxvYyYpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOb2lzeUFsbG9jJikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KfTsKCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c2V0PHVuc2lnbmVkIGNoYXI+IHM7CiAgICBmb3IgKHVuc2lnbmVkIGludCBjID0gMDsgYyA8IDB4MTAwOyArK2MpIHMuaW5zZXJ0KGMpOwoKICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIE5vaXN5QWxsb2M8Y2hhcj4+IHN0cihzLmJlZ2luKCksIHMuZW5kKCkpOwogICAgCiAgICAvL3N0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIE5vaXN5QWxsb2M8Y2hhcj4+IHN0cjsKICAgIC8vc3RyLnJlc2VydmUoNTAwKTsKICAgIC8vc3RyLmFwcGVuZChzLmJlZ2luKCksIHMuZW5kKCkpOwogICAgLy9zdHIuYXNzaWduKHMuYmVnaW4oKSwgcy5lbmQoKSk7CiAgICAvL3N0ci5pbnNlcnQoc3RyLmVuZCgpLCBzLmJlZ2luKCksIHMuZW5kKCkpOwogICAgLy9mb3IgKHVuc2lnbmVkIGNoYXIgYyA6IHMpIHN0ci5wdXNoX2JhY2soYyk7Cn0=