#include <cstdint>
#include <new>
template <typename T>
struct buffer_allocator
{
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using const_pointer = const T*;
using reference = T&;
using const_reference = const T&;
using value_type = T;
buffer_allocator(T* buffer, std::size_t max_size) :
buffer(buffer), max_size(max_size)
{}
template<typename... Args>
void construct(T* p, Args&&... args)
{ /*::new((void *)p) T(std::forward<Args>(args)...);*/ }
void destroy(T* p) { /*p->~T();*/ }
T* allocate(std::size_t n)
{
if (max_size != n) { throw std::bad_alloc{}; }
return buffer;
}
void deallocate(T*, std::size_t) {}
std::size_t get_max_size() const { return max_size; }
private:
T* buffer;
std::size_t max_size;
};
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{0, 1, 2, 3, 4};
buffer_allocator<int> b1(v.data(), 3);
buffer_allocator<int> b2(v.data() + 3, v.size() - 3);
std::vector<int, buffer_allocator<int>> v1(b1.get_max_size(), b1);
std::vector<int, buffer_allocator<int>> v2(b2.get_max_size(), b2);
std::cout << "v1 =";
for (auto e : v1) {
std::cout << " " << e;
}
std::cout << std::endl << "v2 =";
for (auto e : v2) {
std::cout << " " << e;
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxuZXc+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGJ1ZmZlcl9hbGxvY2F0b3IKewogICAgdXNpbmcgc2l6ZV90eXBlID0gc3RkOjpzaXplX3Q7CiAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKICAgIHVzaW5nIHBvaW50ZXIgPSBUKjsKICAgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSBjb25zdCBUKjsKICAgIHVzaW5nIHJlZmVyZW5jZSA9IFQmOwogICAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVCY7CiAgICB1c2luZyB2YWx1ZV90eXBlID0gVDsKCiAgICBidWZmZXJfYWxsb2NhdG9yKFQqIGJ1ZmZlciwgc3RkOjpzaXplX3QgbWF4X3NpemUpIDoKICAgICAgICBidWZmZXIoYnVmZmVyKSwgbWF4X3NpemUobWF4X3NpemUpCiAgICB7fQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CiAgICB2b2lkIGNvbnN0cnVjdChUKiBwLCBBcmdzJiYuLi4gYXJncykKICAgIHsgLyo6Om5ldygodm9pZCAqKXApIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsqLyB9CgogICAgdm9pZCBkZXN0cm95KFQqIHApIHsgLypwLT5+VCgpOyovIH0KCiAgICBUKiBhbGxvY2F0ZShzdGQ6OnNpemVfdCBuKQogICAgewogICAgICAgIGlmIChtYXhfc2l6ZSAhPSBuKSB7IHRocm93IHN0ZDo6YmFkX2FsbG9je307IH0KICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgfQoKICAgIHZvaWQgZGVhbGxvY2F0ZShUKiwgc3RkOjpzaXplX3QpIHt9CgogICAgc3RkOjpzaXplX3QgZ2V0X21heF9zaXplKCkgY29uc3QgeyByZXR1cm4gbWF4X3NpemU7IH0KCnByaXZhdGU6CiAgICBUKiBidWZmZXI7CiAgICBzdGQ6OnNpemVfdCBtYXhfc2l6ZTsKfTsKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8aW50PiB2ezAsIDEsIDIsIDMsIDR9OwogICAgYnVmZmVyX2FsbG9jYXRvcjxpbnQ+IGIxKHYuZGF0YSgpLCAzKTsKICAgIGJ1ZmZlcl9hbGxvY2F0b3I8aW50PiBiMih2LmRhdGEoKSArIDMsIHYuc2l6ZSgpIC0gMyk7CiAgICBzdGQ6OnZlY3RvcjxpbnQsIGJ1ZmZlcl9hbGxvY2F0b3I8aW50Pj4gdjEoYjEuZ2V0X21heF9zaXplKCksIGIxKTsKICAgIHN0ZDo6dmVjdG9yPGludCwgYnVmZmVyX2FsbG9jYXRvcjxpbnQ+PiB2MihiMi5nZXRfbWF4X3NpemUoKSwgYjIpOwoKICAgIHN0ZDo6Y291dCA8PCAidjEgPSI7CiAgICBmb3IgKGF1dG8gZSA6IHYxKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCBlOwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbCA8PCAidjIgPSI7CiAgICBmb3IgKGF1dG8gZSA6IHYyKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCBlOwogICAgfQogICAgcmV0dXJuIDA7Cn0K