#include <iostream>
#include <memory>
#include <vector>
#include <cstdint>
using namespace std;
enum shape_kind {Cube, Sphere};
struct shape {
virtual ~shape() {}
virtual shape_kind kind() = 0;
};
struct cube : public shape {
shape_kind kind() { return Cube; }
};
struct sphere : public shape {
shape_kind kind() { return Sphere; }
};
shared_ptr<shape> parse(const vector<uint8_t> data) {
if (data.at(0) == 1) {
return shared_ptr<shape>(new sphere);
} else {
return shared_ptr<shape>(new cube);
}
}
int main() {
vector<uint8_t> x {1};
vector<uint8_t> y {2};
auto s = parse(x);
auto c = parse(y);
cout << (*s).kind() << endl;
cout << (*c).kind() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGludD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmVudW0gc2hhcGVfa2luZCB7Q3ViZSwgU3BoZXJlfTsKCnN0cnVjdCBzaGFwZSB7Cgl2aXJ0dWFsIH5zaGFwZSgpIHt9Cgl2aXJ0dWFsIHNoYXBlX2tpbmQga2luZCgpID0gMDsKfTsKCnN0cnVjdCBjdWJlIDogcHVibGljIHNoYXBlIHsKCXNoYXBlX2tpbmQga2luZCgpIHsgcmV0dXJuIEN1YmU7IH0KfTsKc3RydWN0IHNwaGVyZSA6IHB1YmxpYyBzaGFwZSB7CglzaGFwZV9raW5kIGtpbmQoKSB7IHJldHVybiBTcGhlcmU7IH0KfTsKCnNoYXJlZF9wdHI8c2hhcGU+IHBhcnNlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiBkYXRhKSB7CglpZiAoZGF0YS5hdCgwKSA9PSAxKSB7CgkJcmV0dXJuIHNoYXJlZF9wdHI8c2hhcGU+KG5ldyBzcGhlcmUpOwoJfSBlbHNlIHsKCQlyZXR1cm4gc2hhcmVkX3B0cjxzaGFwZT4obmV3IGN1YmUpOwoJfQp9CgppbnQgbWFpbigpIHsKCXZlY3Rvcjx1aW50OF90PiB4IHsxfTsKCXZlY3Rvcjx1aW50OF90PiB5IHsyfTsKCWF1dG8gcyA9IHBhcnNlKHgpOwoJYXV0byBjID0gcGFyc2UoeSk7Cgljb3V0IDw8ICgqcykua2luZCgpIDw8IGVuZGw7Cgljb3V0IDw8ICgqYykua2luZCgpIDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==