#include <iostream>
#include <vector>
using namespace std;
enum class type {
vector_type,
integer_type
};
// Object can either be an Integer or Vector<Object>
class Object {
public:
type type_;
union U {
vector<Object> vec_;
int num_;
U() {}
U(const vector<int> &vec) : vec_() {
for (size_t i = 0; i < vec.size(); i++) {
vec_.push_back(Object(i));
}
}
U(int num) : num_(num) {}
U& operator=(const vector<Object>& vec) {
new(&vec_) vector<Object>(vec);
return *this;
}
~U() {}
}u_;
Object()
: type_(type::integer_type)
{
}
Object(const Object& other)
: type_(other.type_)
{
if(other.type_ == type::vector_type)
u_ = other.u_.vec_;
else
u_.num_ = other.u_.num_;
}
Object(const vector<int> &vec)
: type_(type::vector_type),
u_(vec)
{
}
Object(int num)
: type_(type::integer_type),
u_(num)
{
}
Object& operator=(const Object &other)
{
// Free old vector
if(type_ == type::vector_type)
u_.vec_.~vector();
type_ = other.type_;
if(other.type_ == type::vector_type)
u_ = other.u_.vec_;
else
u_.num_ = other.u_.num_;
return *this;
}
~Object() {
if(type_ == type::vector_type)
u_.vec_.~vector();
}
};
int main() {
// to construct somth like that: [1,2, [3, [4,5], 6], 7]
Object o(vector<int>({ 1,2 }));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPHZlY3Rvcj4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgplbnVtIGNsYXNzIHR5cGUgewogIHZlY3Rvcl90eXBlLAogIGludGVnZXJfdHlwZQp9OwoKLy8gT2JqZWN0IGNhbiBlaXRoZXIgYmUgYW4gSW50ZWdlciBvciBWZWN0b3I8T2JqZWN0PiAKY2xhc3MgT2JqZWN0IHsKcHVibGljOgogIHR5cGUgdHlwZV87CiAgdW5pb24gVSB7CiAgICB2ZWN0b3I8T2JqZWN0PiB2ZWNfOwogICAgaW50IG51bV87CgogICAgVSgpIHt9CgogICAgVShjb25zdCB2ZWN0b3I8aW50PiAmdmVjKSA6IHZlY18oKSB7CiAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjLnNpemUoKTsgaSsrKSB7CiAgICAgICAgdmVjXy5wdXNoX2JhY2soT2JqZWN0KGkpKTsKICAgICAgfQogICAgfQoKICAgIFUoaW50IG51bSkgOiBudW1fKG51bSkge30KCiAgICBVJiBvcGVyYXRvcj0oY29uc3QgdmVjdG9yPE9iamVjdD4mIHZlYykgewogICAgICBuZXcoJnZlY18pIHZlY3RvcjxPYmplY3Q+KHZlYyk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICB+VSgpIHt9CiAgfXVfOwoKICBPYmplY3QoKQogICAgOiB0eXBlXyh0eXBlOjppbnRlZ2VyX3R5cGUpCiAgewogIH0KCiAgT2JqZWN0KGNvbnN0IE9iamVjdCYgb3RoZXIpCiAgICA6IHR5cGVfKG90aGVyLnR5cGVfKQogIHsKICAgIGlmKG90aGVyLnR5cGVfID09IHR5cGU6OnZlY3Rvcl90eXBlKQogICAgICB1XyA9IG90aGVyLnVfLnZlY187CiAgICBlbHNlCiAgICAgIHVfLm51bV8gPSBvdGhlci51Xy5udW1fOwogIH0KCiAgT2JqZWN0KGNvbnN0IHZlY3RvcjxpbnQ+ICZ2ZWMpCiAgICA6IHR5cGVfKHR5cGU6OnZlY3Rvcl90eXBlKSwKICAgICAgdV8odmVjKQogIHsKICB9CgogIE9iamVjdChpbnQgbnVtKQogICAgOiB0eXBlXyh0eXBlOjppbnRlZ2VyX3R5cGUpLAogICAgICB1XyhudW0pCiAgewogIH0KCiAgT2JqZWN0JiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0ICZvdGhlcikKICB7CiAgICAvLyBGcmVlIG9sZCB2ZWN0b3IKICAgIGlmKHR5cGVfID09IHR5cGU6OnZlY3Rvcl90eXBlKQogICAgICB1Xy52ZWNfLn52ZWN0b3IoKTsKCiAgICB0eXBlXyA9IG90aGVyLnR5cGVfOwogICAgaWYob3RoZXIudHlwZV8gPT0gdHlwZTo6dmVjdG9yX3R5cGUpCiAgICAgIHVfID0gb3RoZXIudV8udmVjXzsKICAgIGVsc2UKICAgICAgdV8ubnVtXyA9IG90aGVyLnVfLm51bV87CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICB+T2JqZWN0KCkgewogICAgaWYodHlwZV8gPT0gdHlwZTo6dmVjdG9yX3R5cGUpCiAgICAgIHVfLnZlY18ufnZlY3RvcigpOwogIH0KfTsKCmludCBtYWluKCkgewogIC8vIHRvIGNvbnN0cnVjdCBzb210aCBsaWtlIHRoYXQ6IFsxLDIsIFszLCBbNCw1XSwgNl0sIDddIAogIE9iamVjdCBvKHZlY3RvcjxpbnQ+KHsgMSwyIH0pKTsKCiAgcmV0dXJuIDA7Cn0=