template <typename T, typename U>
constexpr inline bool CanTypeRepresentValue(const U value) {
return ((value > U()) == (static_cast<T>(value) > T())) &&
(value == static_cast<U>(static_cast<T>(value)));
}
#include <cmath>
#include <iostream>
#include <limits>
template <typename T>
class Number {
T rep;
public:
constexpr Number(T t = T()) : rep(t) {}
constexpr operator T () const { return rep; }
};
int main(int argc, char **argv) {
#define TEST(type, value) static_assert(CanTypeRepresentValue<type>(value), #type " can't represent " #value)
#define FAIL(type, value) static_assert(!CanTypeRepresentValue<type>(value), #type " can represent " #value)
TEST(int, std::numeric_limits<int>::max());
FAIL(int, unsigned(std::numeric_limits<int>::max()) + 1);
TEST(unsigned, std::numeric_limits<int>::max());
FAIL(unsigned, -3);
TEST(char,122ULL);
FAIL(char,256ULL);
TEST(int,2.0f);
FAIL(char,3.1415926535);
TEST(Number<int>,250LL);
TEST(Number<long>,-3.0);
FAIL(Number<int>,2.1);
FAIL(Number<char>,3.1415926535);
#undef TEST
#undef FAIL
#define CanTypeFitValue CanTypeRepresentValue
long long value;
while(std::cin >> value) {
std::cout << value << ": ";
std::cout << CanTypeFitValue<int8_t>(value) << " ";
std::cout << CanTypeFitValue<uint8_t>(value) << " ";
std::cout << CanTypeFitValue<int16_t>(value) << " ";
std::cout << CanTypeFitValue<uint16_t>(value) << " ";
std::cout << CanTypeFitValue<int32_t>(value) << " ";
std::cout << CanTypeFitValue<uint32_t>(value) << " ";
std::cout << CanTypeFitValue<int64_t>(value) << " ";
std::cout << CanTypeFitValue<uint64_t>(value) << std::endl;
}
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmNvbnN0ZXhwciBpbmxpbmUgYm9vbCBDYW5UeXBlUmVwcmVzZW50VmFsdWUoY29uc3QgVSB2YWx1ZSkgewogICAgcmV0dXJuICgodmFsdWUgPiBVKCkpID09IChzdGF0aWNfY2FzdDxUPih2YWx1ZSkgPiBUKCkpKSAmJgogICAgICAgICAgICh2YWx1ZSA9PSBzdGF0aWNfY2FzdDxVPihzdGF0aWNfY2FzdDxUPih2YWx1ZSkpKTsKfQoKI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxsaW1pdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgTnVtYmVyIHsKICAgIFQgcmVwOwpwdWJsaWM6CiAgICBjb25zdGV4cHIgTnVtYmVyKFQgdCA9IFQoKSkgOiByZXAodCkge30KICAgIGNvbnN0ZXhwciBvcGVyYXRvciBUICgpIGNvbnN0IHsgcmV0dXJuIHJlcDsgfQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiNkZWZpbmUgVEVTVCh0eXBlLCB2YWx1ZSkgc3RhdGljX2Fzc2VydChDYW5UeXBlUmVwcmVzZW50VmFsdWU8dHlwZT4odmFsdWUpLCAjdHlwZSAiIGNhbid0IHJlcHJlc2VudCAiICN2YWx1ZSkKI2RlZmluZSBGQUlMKHR5cGUsIHZhbHVlKSBzdGF0aWNfYXNzZXJ0KCFDYW5UeXBlUmVwcmVzZW50VmFsdWU8dHlwZT4odmFsdWUpLCAjdHlwZSAiIGNhbiByZXByZXNlbnQgIiAjdmFsdWUpCiAgICBURVNUKGludCwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSk7CiAgICBGQUlMKGludCwgdW5zaWduZWQoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkgKyAxKTsKICAgIFRFU1QodW5zaWduZWQsIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOwogICAgRkFJTCh1bnNpZ25lZCwgLTMpOwogICAgVEVTVChjaGFyLDEyMlVMTCk7CiAgICBGQUlMKGNoYXIsMjU2VUxMKTsKICAgIFRFU1QoaW50LDIuMGYpOwogICAgRkFJTChjaGFyLDMuMTQxNTkyNjUzNSk7CiAgICBURVNUKE51bWJlcjxpbnQ+LDI1MExMKTsKICAgIFRFU1QoTnVtYmVyPGxvbmc+LC0zLjApOwogICAgRkFJTChOdW1iZXI8aW50PiwyLjEpOwogICAgRkFJTChOdW1iZXI8Y2hhcj4sMy4xNDE1OTI2NTM1KTsKI3VuZGVmIFRFU1QKI3VuZGVmIEZBSUwKCiNkZWZpbmUgQ2FuVHlwZUZpdFZhbHVlIENhblR5cGVSZXByZXNlbnRWYWx1ZQoKICAgIGxvbmcgbG9uZyB2YWx1ZTsKICAgIHdoaWxlKHN0ZDo6Y2luID4+IHZhbHVlKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHZhbHVlIDw8ICI6ICI7CiAgICAgICAgc3RkOjpjb3V0IDw8IENhblR5cGVGaXRWYWx1ZTxpbnQ4X3Q+KHZhbHVlKSA8PCAiICI7CiAgICAgICAgc3RkOjpjb3V0IDw8IENhblR5cGVGaXRWYWx1ZTx1aW50OF90Pih2YWx1ZSkgPDwgIiAiOwogICAgICAgIHN0ZDo6Y291dCA8PCBDYW5UeXBlRml0VmFsdWU8aW50MTZfdD4odmFsdWUpIDw8ICIgIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgQ2FuVHlwZUZpdFZhbHVlPHVpbnQxNl90Pih2YWx1ZSkgPDwgIiAiOwogICAgICAgIHN0ZDo6Y291dCA8PCBDYW5UeXBlRml0VmFsdWU8aW50MzJfdD4odmFsdWUpIDw8ICIgIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgQ2FuVHlwZUZpdFZhbHVlPHVpbnQzMl90Pih2YWx1ZSkgPDwgIiAiOwogICAgICAgIHN0ZDo6Y291dCA8PCBDYW5UeXBlRml0VmFsdWU8aW50NjRfdD4odmFsdWUpIDw8ICIgIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgQ2FuVHlwZUZpdFZhbHVlPHVpbnQ2NF90Pih2YWx1ZSkgPDwgc3RkOjplbmRsOwogICAgfQoKfQo=