#include <iostream>
#include <vector>
using namespace std;
class Object {
public:
virtual ~Object() {}
};
struct Integer : public Object {
int value;
Integer(int value) : value(value) {}
};
struct MyVector : public std::vector<Object*>, public Object {
MyVector(std::initializer_list<int> list) {
for (const auto& elem : list) {
this->push_back(new Integer(elem));
}
}
MyVector(std::initializer_list<MyVector> list) {
for (const auto& elem : list) {
this->push_back(new MyVector(elem));
}
}
};
bool getSum_internal(Object &o, int &sum) {
Integer* box = dynamic_cast<Integer*>(&o);
if (box == nullptr) {
MyVector* container = dynamic_cast<MyVector*>(&o);
if (container == nullptr) {
// no idea what type this is so return with error
return false;
}
for (const auto& elem : *container) {
if (getSum_internal(*elem, sum) == false) {
return false;
}
}
return true;
} else {
sum += box->value;
return true;
}
}
int getSum(Object &o) {
int sum = 0;
getSum_internal(o, sum);
return sum;
}
int main() {
// to construct somth like that: [1,2, [3, [4,5], 6], 7]
MyVector o1({ 1, 2 });
MyVector o2({ 3 });
MyVector o3({ 4, 5 });
MyVector o4({ 6 });
MyVector o5({ o2, o3, o4 });
MyVector o6({ 7 });
MyVector o({ o1, o5, o6 });
cout << getSum(o) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPHZlY3Rvcj4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBPYmplY3QgewpwdWJsaWM6CiAgICB2aXJ0dWFsIH5PYmplY3QoKSB7fQp9OwoKc3RydWN0IEludGVnZXIgOiBwdWJsaWMgT2JqZWN0IHsKICAgIGludCB2YWx1ZTsKCiAgICBJbnRlZ2VyKGludCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KfTsKCnN0cnVjdCBNeVZlY3RvciA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxPYmplY3QqPiwgcHVibGljIE9iamVjdCB7CiAgICBNeVZlY3RvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50PiBsaXN0KSB7CiAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlbGVtIDogbGlzdCkgewogICAgICAgICAgICB0aGlzLT5wdXNoX2JhY2sobmV3IEludGVnZXIoZWxlbSkpOwogICAgICAgIH0KICAgIH0KCiAgICBNeVZlY3RvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TXlWZWN0b3I+IGxpc3QpIHsKICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiBsaXN0KSB7CiAgICAgICAgICAgIHRoaXMtPnB1c2hfYmFjayhuZXcgTXlWZWN0b3IoZWxlbSkpOwogICAgICAgIH0KICAgIH0KfTsKCmJvb2wgZ2V0U3VtX2ludGVybmFsKE9iamVjdCAmbywgaW50ICZzdW0pIHsKICAgIEludGVnZXIqIGJveCA9IGR5bmFtaWNfY2FzdDxJbnRlZ2VyKj4oJm8pOwogICAgaWYgKGJveCA9PSBudWxscHRyKSB7CiAgICAgICAgTXlWZWN0b3IqIGNvbnRhaW5lciA9IGR5bmFtaWNfY2FzdDxNeVZlY3Rvcio+KCZvKTsKICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGxwdHIpIHsKICAgICAgICAgICAgLy8gbm8gaWRlYSB3aGF0IHR5cGUgdGhpcyBpcyBzbyByZXR1cm4gd2l0aCBlcnJvcgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgYXV0byYgZWxlbSA6ICpjb250YWluZXIpIHsKICAgICAgICAgICAgaWYgKGdldFN1bV9pbnRlcm5hbCgqZWxlbSwgc3VtKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgICBzdW0gKz0gYm94LT52YWx1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQoKaW50IGdldFN1bShPYmplY3QgJm8pIHsKICAgIGludCBzdW0gPSAwOwogICAgZ2V0U3VtX2ludGVybmFsKG8sIHN1bSk7CiAgICByZXR1cm4gc3VtOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIHRvIGNvbnN0cnVjdCBzb210aCBsaWtlIHRoYXQ6IFsxLDIsIFszLCBbNCw1XSwgNl0sIDddIAogICAgTXlWZWN0b3IgbzEoeyAxLCAyIH0pOwogICAgTXlWZWN0b3IgbzIoeyAzIH0pOwogICAgTXlWZWN0b3IgbzMoeyA0LCA1IH0pOwogICAgTXlWZWN0b3IgbzQoeyA2IH0pOwogICAgTXlWZWN0b3IgbzUoeyBvMiwgbzMsIG80IH0pOwogICAgTXlWZWN0b3IgbzYoeyA3IH0pOwogICAgTXlWZWN0b3Igbyh7IG8xLCBvNSwgbzYgfSk7CgogICAgY291dCA8PCBnZXRTdW0obykgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==