- #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==