#include <cstring>
#include <iostream>
#include <type_traits>
constexpr const char* name[] = {
"uint1", "uint2", "uint4", "uint8", "uint16",
"int1", "int2", "int4", "int8", "int16"
};
constexpr size_t log2(size_t n) {
return (n<2) ? 0 : 1+log2(n/2);
}
template <class T>
constexpr std::enable_if_t<std::is_arithmetic<T>::value, const char *> make_type_name() {
return name[std::is_signed<T>::value * 5 + log2(sizeof(T))];
}
static_assert(std::strcmp(make_type_name<int>(), make_type_name<int32_t>()) == 0);
int main() {
std::cout << log2(sizeof(int)) << ' ' << make_type_name<int>();
return 0;
}
I2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKY29uc3RleHByIGNvbnN0IGNoYXIqIG5hbWVbXSA9IHsKICAidWludDEiLCAidWludDIiLCAidWludDQiLCAidWludDgiLCAidWludDE2IiwKICAiaW50MSIsICAiaW50MiIsICAiaW50NCIsICAiaW50OCIsICAiaW50MTYiCn07Cgpjb25zdGV4cHIgc2l6ZV90IGxvZzIoc2l6ZV90IG4pIHsKICByZXR1cm4gKG48MikgPyAwIDogMStsb2cyKG4vMik7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpjb25zdGV4cHIgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX2FyaXRobWV0aWM8VD46OnZhbHVlLCBjb25zdCBjaGFyICo+IG1ha2VfdHlwZV9uYW1lKCkgewogIHJldHVybiBuYW1lW3N0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSAqIDUgKyBsb2cyKHNpemVvZihUKSldOwp9CgpzdGF0aWNfYXNzZXJ0KHN0ZDo6c3RyY21wKG1ha2VfdHlwZV9uYW1lPGludD4oKSwgbWFrZV90eXBlX25hbWU8aW50MzJfdD4oKSkgPT0gMCk7CgppbnQgbWFpbigpIHsKICBzdGQ6OmNvdXQgPDwgbG9nMihzaXplb2YoaW50KSkgPDwgJyAnIDw8IG1ha2VfdHlwZV9uYW1lPGludD4oKTsKICByZXR1cm4gMDsKfQo=