#include <iostream>
#include <tuple>
#include <cstddef>
using namespace std;
template <class T, class Tuple>
struct Index;
template <class T, class... Types>
struct Index<T, std::tuple<T, Types...>> {
static const std::size_t value = 0;
};
template <class T, class U, class... Types>
struct Index<T, std::tuple<U, Types...>> {
static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value;
};
template<class EnumType, template<class T, T> class Element, EnumType... enumValues>
class Map
{
public:
using Type = std::tuple<Element<EnumType, enumValues>...>;
template<EnumType enumValue>
using index = Index<Element<EnumType, enumValue>, Type>;
template<EnumType enumValue>
Element<EnumType, enumValue>& get();
Type storage_;
};
template<class EnumType, template<class T, T> class StorageElement, EnumType... enumValues>
template<EnumType enumValue>
StorageElement<EnumType, enumValue>& Map<EnumType, StorageElement, enumValues...>::get()
{
return std::get<index<enumValue>::value>(storage_);
}
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxjc3RkZGVmPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCiAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFR1cGxlPgogIHN0cnVjdCBJbmRleDsKCiAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIFR5cGVzPgogIHN0cnVjdCBJbmRleDxULCBzdGQ6OnR1cGxlPFQsIFR5cGVzLi4uPj4gewogICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgdmFsdWUgPSAwOwogIH07CgogIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcy4uLiBUeXBlcz4KICBzdHJ1Y3QgSW5kZXg8VCwgc3RkOjp0dXBsZTxVLCBUeXBlcy4uLj4+IHsKICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IHZhbHVlID0gMSArIEluZGV4PFQsIHN0ZDo6dHVwbGU8VHlwZXMuLi4+Pjo6dmFsdWU7CiAgfTsKCnRlbXBsYXRlPGNsYXNzIEVudW1UeXBlLCB0ZW1wbGF0ZTxjbGFzcyBULCBUPiBjbGFzcyBFbGVtZW50LCBFbnVtVHlwZS4uLiBlbnVtVmFsdWVzPgpjbGFzcyBNYXAKICB7CiAgcHVibGljOgogICAgdXNpbmcgVHlwZSA9IHN0ZDo6dHVwbGU8RWxlbWVudDxFbnVtVHlwZSwgZW51bVZhbHVlcz4uLi4+OwoKICAgIHRlbXBsYXRlPEVudW1UeXBlIGVudW1WYWx1ZT4KICAgICAgdXNpbmcgaW5kZXggPSBJbmRleDxFbGVtZW50PEVudW1UeXBlLCBlbnVtVmFsdWU+LCBUeXBlPjsKCiAgICB0ZW1wbGF0ZTxFbnVtVHlwZSBlbnVtVmFsdWU+CiAgICBFbGVtZW50PEVudW1UeXBlLCBlbnVtVmFsdWU+JiBnZXQoKTsKCiAgICBUeXBlIHN0b3JhZ2VfOwogIH07Cgp0ZW1wbGF0ZTxjbGFzcyBFbnVtVHlwZSwgdGVtcGxhdGU8Y2xhc3MgVCwgVD4gY2xhc3MgU3RvcmFnZUVsZW1lbnQsIEVudW1UeXBlLi4uIGVudW1WYWx1ZXM+CnRlbXBsYXRlPEVudW1UeXBlIGVudW1WYWx1ZT4KU3RvcmFnZUVsZW1lbnQ8RW51bVR5cGUsIGVudW1WYWx1ZT4mIE1hcDxFbnVtVHlwZSwgU3RvcmFnZUVsZW1lbnQsIGVudW1WYWx1ZXMuLi4+OjpnZXQoKQogIHsKICByZXR1cm4gc3RkOjpnZXQ8aW5kZXg8ZW51bVZhbHVlPjo6dmFsdWU+KHN0b3JhZ2VfKTsKICB9CmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=