#include <type_traits>
#include <cstdint>
#include <cstddef>
#include <typeinfo>
#include <iostream>
template<typename T>
struct identity {
typedef T type;
};
template<typename T, typename Head, typename... Tail>
struct best_type {
typedef typename std::conditional<
sizeof(Head) >= sizeof(T),
identity<Head>,
best_type<T, Tail...>
>::type::type type;
};
template<typename T>
struct type_to_integral {
typedef typename best_type<T, uint8_t, uint16_t, uint32_t, uint64_t, uint_least64_t>::type type;
static_assert(std::is_integral<type>::value, "Type is too large");
};
int main() {
static_assert(std::is_same<type_to_integral<uint8_t>::type, uint8_t>::value, "Fail");
static_assert(std::is_same<type_to_integral<uint16_t>::type, uint16_t>::value, "Fail");
static_assert(std::is_same<type_to_integral<uint32_t>::type, uint32_t>::value, "Fail");
static_assert(std::is_same<type_to_integral<uint64_t>::type, uint64_t>::value, "Fail");
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGNzdGRkZWY+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGlkZW50aXR5IHsKICAgIHR5cGVkZWYgVCB0eXBlOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUuLi4gVGFpbD4Kc3RydWN0IGJlc3RfdHlwZSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CiAgICAgICAgc2l6ZW9mKEhlYWQpID49IHNpemVvZihUKSwgCiAgICAgICAgaWRlbnRpdHk8SGVhZD4sCiAgICAgICAgYmVzdF90eXBlPFQsIFRhaWwuLi4+CiAgICA+Ojp0eXBlOjp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgdHlwZV90b19pbnRlZ3JhbCB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIGJlc3RfdHlwZTxULCB1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3QsIHVpbnQ2NF90LCB1aW50X2xlYXN0NjRfdD46OnR5cGUgdHlwZTsKICAgIAogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPHR5cGU+Ojp2YWx1ZSwgIlR5cGUgaXMgdG9vIGxhcmdlIik7Cn07CgppbnQgbWFpbigpIHsKICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHR5cGVfdG9faW50ZWdyYWw8dWludDhfdD46OnR5cGUsIHVpbnQ4X3Q+Ojp2YWx1ZSwgIkZhaWwiKTsKICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHR5cGVfdG9faW50ZWdyYWw8dWludDE2X3Q+Ojp0eXBlLCB1aW50MTZfdD46OnZhbHVlLCAiRmFpbCIpOwogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8dHlwZV90b19pbnRlZ3JhbDx1aW50MzJfdD46OnR5cGUsIHVpbnQzMl90Pjo6dmFsdWUsICJGYWlsIik7CiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTx0eXBlX3RvX2ludGVncmFsPHVpbnQ2NF90Pjo6dHlwZSwgdWludDY0X3Q+Ojp2YWx1ZSwgIkZhaWwiKTsKfQo=