#include <iostream>
#include <limits>
template<typename Desired, typename Given>
constexpr Desired narrow_cast(Given arg) {
static_assert(std::is_integral<Desired>::value, "Only integer types are supported");
static_assert(std::is_integral<Given>::value, "Only integer types are supported");
auto min = std::numeric_limits<Desired>::min();
auto max = std::numeric_limits<Desired>::max();
auto different_signs = std::is_signed<Given>::value xor std::is_signed<Desired>::value;
if(sizeof(Desired) == sizeof(Given) && different_signs && arg < 0) {
return 0;
}
return
min > arg? min:
max < arg? max:
arg;
}
int main() {
std::cout << narrow_cast<short>(100000) << std::endl;
std::cout << narrow_cast<unsigned short>(100000) << std::endl;
std::cout << narrow_cast<unsigned short>(-100000) << std::endl;
std::cout << narrow_cast<int>(-1) << std::endl;
std::cout << narrow_cast<unsigned int>(-1) << std::endl;
std::cout << narrow_cast<unsigned short>(-1) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgRGVzaXJlZCwgdHlwZW5hbWUgR2l2ZW4+CmNvbnN0ZXhwciBEZXNpcmVkIG5hcnJvd19jYXN0KEdpdmVuIGFyZykgewoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPERlc2lyZWQ+Ojp2YWx1ZSwgIk9ubHkgaW50ZWdlciB0eXBlcyBhcmUgc3VwcG9ydGVkIik7CglzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8R2l2ZW4+Ojp2YWx1ZSwgIk9ubHkgaW50ZWdlciB0eXBlcyBhcmUgc3VwcG9ydGVkIik7CgkKCWF1dG8gbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxEZXNpcmVkPjo6bWluKCk7CglhdXRvIG1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8RGVzaXJlZD46Om1heCgpOwoJCglhdXRvIGRpZmZlcmVudF9zaWducyA9IHN0ZDo6aXNfc2lnbmVkPEdpdmVuPjo6dmFsdWUgeG9yIHN0ZDo6aXNfc2lnbmVkPERlc2lyZWQ+Ojp2YWx1ZTsKCWlmKHNpemVvZihEZXNpcmVkKSA9PSBzaXplb2YoR2l2ZW4pICYmIGRpZmZlcmVudF9zaWducyAmJiBhcmcgPCAwKSB7CgkJcmV0dXJuIDA7Cgl9CgkKCXJldHVybiAKCQltaW4gPiBhcmc/IG1pbjoKCQltYXggPCBhcmc/IG1heDogCgkJYXJnOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6Y291dCA8PCBuYXJyb3dfY2FzdDxzaG9ydD4oMTAwMDAwKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgbmFycm93X2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KDEwMDAwMCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IG5hcnJvd19jYXN0PHVuc2lnbmVkIHNob3J0PigtMTAwMDAwKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgbmFycm93X2Nhc3Q8aW50PigtMSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IG5hcnJvd19jYXN0PHVuc2lnbmVkIGludD4oLTEpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBuYXJyb3dfY2FzdDx1bnNpZ25lZCBzaG9ydD4oLTEpIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9