#include <iostream>
#include <algorithm>
#include <cstring>
struct A {
std::string data;
A(std::string v) :data(std::move(v)) {}
void foo() {std::cout << data;}
};
template<class T>
struct reloc_ptr {
template<class U>
reloc_ptr(char*& base, int offset, U&& v) :base(&base), offset(offset) {new(get())T(std::forward<U>(v));}
T* get() const {return (T*)(*base+offset);}
T* operator->() const {return get();}
void destroy() {get()->~T();}
private:
char** base;
int offset;
};
int main() {
char* base = new char[1000];
//construct
reloc_ptr<A> clsA(base,4, "HI");
//test
clsA->foo();
//move base
char* other = new char[1000];
memcpy(other, base, 1000);
std::swap(base, other);
delete[] other;
//test
clsA->foo();
//cleanup
clsA.destroy();
delete[] base;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnN0cnVjdCBBIHsKICAgIHN0ZDo6c3RyaW5nIGRhdGE7ICAgCiAgICBBKHN0ZDo6c3RyaW5nIHYpIDpkYXRhKHN0ZDo6bW92ZSh2KSkge30KICAgIHZvaWQgZm9vKCkge3N0ZDo6Y291dCA8PCBkYXRhO30KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCByZWxvY19wdHIgewogICAgdGVtcGxhdGU8Y2xhc3MgVT4KICAgIHJlbG9jX3B0cihjaGFyKiYgYmFzZSwgaW50IG9mZnNldCwgVSYmIHYpIDpiYXNlKCZiYXNlKSwgb2Zmc2V0KG9mZnNldCkge25ldyhnZXQoKSlUKHN0ZDo6Zm9yd2FyZDxVPih2KSk7fQogICAgVCogZ2V0KCkgY29uc3Qge3JldHVybiAoVCopKCpiYXNlK29mZnNldCk7fQogICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHtyZXR1cm4gZ2V0KCk7fQogICAgdm9pZCBkZXN0cm95KCkge2dldCgpLT5+VCgpO30KcHJpdmF0ZToKICAgIGNoYXIqKiBiYXNlOwogICAgaW50IG9mZnNldDsKfTsKCmludCBtYWluKCkgewogICAgY2hhciogYmFzZSA9IG5ldyBjaGFyWzEwMDBdOwogICAgLy9jb25zdHJ1Y3QKICAgIHJlbG9jX3B0cjxBPiBjbHNBKGJhc2UsNCwgIkhJIik7CiAgICAvL3Rlc3QKICAgIGNsc0EtPmZvbygpOwogICAgLy9tb3ZlIGJhc2UKICAgIGNoYXIqIG90aGVyID0gbmV3IGNoYXJbMTAwMF07CiAgICBtZW1jcHkob3RoZXIsIGJhc2UsIDEwMDApOwogICAgc3RkOjpzd2FwKGJhc2UsIG90aGVyKTsKICAgIGRlbGV0ZVtdIG90aGVyOwogICAgLy90ZXN0CiAgICBjbHNBLT5mb28oKTsKICAgIC8vY2xlYW51cAogICAgY2xzQS5kZXN0cm95KCk7CiAgICBkZWxldGVbXSBiYXNlOwp9Cg==