#include <iostream>
#include <vector>
#include <string>
template<typename T>
class CAllocator
{
private:
std::size_t size;
T* data = nullptr;
public:
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef T value_type;
CAllocator() {}
CAllocator(pointer data_ptr, size_type max_size) noexcept : size(max_size), data(data_ptr) {};
template<typename U>
CAllocator(const CAllocator<U>& other) noexcept {};
CAllocator(const CAllocator &other) : size(other.size), data(other.data) {}
template<typename U>
struct rebind {typedef CAllocator<U> other;};
pointer allocate(size_type n, const void* hint = 0) {return &data[0];}
void deallocate(void* ptr, size_type n) {}
size_type max_size() const {return size;}
};
template <typename T, typename U>
inline bool operator == (const CAllocator<T>&, const CAllocator<U>&) {return true;}
template <typename T, typename U>
inline bool operator != (const CAllocator<T>& a, const CAllocator<U>& b) {return !(a == b);}
struct RepBase
{
std::size_t length;
std::size_t capacity;
std::int16_t refcount;
};
int main()
{
typedef std::basic_string<char, std::char_traits<char>, CAllocator<char>> CAString;
const int size = 1024;
char ptr[size] = {0};
CAString str(CAllocator<char>(&ptr[0], size));
str.append("hello");
std::cout<<&ptr[sizeof(RepBase)];
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgQ0FsbG9jYXRvcgp7CiAgICBwcml2YXRlOgogICAgICAgIHN0ZDo6c2l6ZV90IHNpemU7CiAgICAgICAgVCogZGF0YSA9IG51bGxwdHI7CgogICAgcHVibGljOgogICAgICAgIHR5cGVkZWYgVCogcG9pbnRlcjsKICAgICAgICB0eXBlZGVmIGNvbnN0IFQqIGNvbnN0X3BvaW50ZXI7CgogICAgICAgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOwogICAgICAgIHR5cGVkZWYgY29uc3QgVCYgY29uc3RfcmVmZXJlbmNlOwoKICAgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKICAgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKCiAgICAgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CgoKICAgICAgICBDQWxsb2NhdG9yKCkge30KICAgICAgICBDQWxsb2NhdG9yKHBvaW50ZXIgZGF0YV9wdHIsIHNpemVfdHlwZSBtYXhfc2l6ZSkgbm9leGNlcHQgOiBzaXplKG1heF9zaXplKSwgZGF0YShkYXRhX3B0cikge307CgogICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CiAgICAgICAgQ0FsbG9jYXRvcihjb25zdCBDQWxsb2NhdG9yPFU+JiBvdGhlcikgbm9leGNlcHQge307CgogICAgICAgIENBbGxvY2F0b3IoY29uc3QgQ0FsbG9jYXRvciAmb3RoZXIpIDogc2l6ZShvdGhlci5zaXplKSwgZGF0YShvdGhlci5kYXRhKSB7fQoKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgogICAgICAgIHN0cnVjdCByZWJpbmQge3R5cGVkZWYgQ0FsbG9jYXRvcjxVPiBvdGhlcjt9OwoKICAgICAgICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBuLCBjb25zdCB2b2lkKiBoaW50ID0gMCkge3JldHVybiAmZGF0YVswXTt9CiAgICAgICAgdm9pZCBkZWFsbG9jYXRlKHZvaWQqIHB0ciwgc2l6ZV90eXBlIG4pIHt9CiAgICAgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qge3JldHVybiBzaXplO30KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgppbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ0FsbG9jYXRvcjxUPiYsIGNvbnN0IENBbGxvY2F0b3I8VT4mKSB7cmV0dXJuIHRydWU7fQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBDQWxsb2NhdG9yPFQ+JiBhLCBjb25zdCBDQWxsb2NhdG9yPFU+JiBiKSB7cmV0dXJuICEoYSA9PSBiKTt9CgpzdHJ1Y3QgUmVwQmFzZQp7CiAgICBzdGQ6OnNpemVfdAkJbGVuZ3RoOwogICAgc3RkOjpzaXplX3QJCWNhcGFjaXR5OwogICAgc3RkOjppbnQxNl90ICAJcmVmY291bnQ7Cn07CgppbnQgbWFpbigpCnsKCXR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgQ0FsbG9jYXRvcjxjaGFyPj4gQ0FTdHJpbmc7CgogICAgY29uc3QgaW50IHNpemUgPSAxMDI0OwoJY2hhciBwdHJbc2l6ZV0gPSB7MH07CgoJQ0FTdHJpbmcgc3RyKENBbGxvY2F0b3I8Y2hhcj4oJnB0clswXSwgc2l6ZSkpOwoJc3RyLmFwcGVuZCgiaGVsbG8iKTsKCiAgICBzdGQ6OmNvdXQ8PCZwdHJbc2l6ZW9mKFJlcEJhc2UpXTsKfQo=