#include <exception>
#include <stdexcept>
template <class T, T lower, T upper>
class bounded {
T val;
public:
bounded(bounded const &o) : val(o.val) {}
bounded &operator=(T v) {
if ( lower < v && v < upper)
val = v;
else
throw(std::range_error("Value out of range"));
return *this;
}
bounded(T const &v=T()) {
if ( lower <= v && v < upper)
val = v;
else
throw(std::range_error("Value out of range"));
val = v;
}
operator T() { return val; }
};
//#ifdef TEST
#include <iostream>
int main() {
bounded<int, 0, 512> x;
try {
x = 256;
std::cout << x << std::endl;
x = 1024;
std::cout << x << std::endl;
}
catch(std::exception &e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
// #endif
I2luY2x1ZGUgPGV4Y2VwdGlvbj4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KCnRlbXBsYXRlIDxjbGFzcyBULCBUIGxvd2VyLCBUIHVwcGVyPgpjbGFzcyBib3VuZGVkIHsgCiAgICBUIHZhbDsKcHVibGljOgogICAgYm91bmRlZChib3VuZGVkIGNvbnN0ICZvKSA6IHZhbChvLnZhbCkge30KCiAgICBib3VuZGVkICZvcGVyYXRvcj0oVCB2KSB7IAogICAgICAgIGlmICggbG93ZXIgPCB2ICYmIHYgPCB1cHBlcikKICAgICAgICAgICAgdmFsID0gdjsKICAgICAgICBlbHNlIAogICAgICAgICAgICB0aHJvdyhzdGQ6OnJhbmdlX2Vycm9yKCJWYWx1ZSBvdXQgb2YgcmFuZ2UiKSk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKCWJvdW5kZWQoVCBjb25zdCAmdj1UKCkpIHsKCQlpZiAoIGxvd2VyIDw9IHYgJiYgdiA8IHVwcGVyKQoJCQl2YWwgPSB2OwoJCWVsc2UgCgkJCXRocm93KHN0ZDo6cmFuZ2VfZXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSIpKTsKCQl2YWwgPSB2OwoJfQogICAgb3BlcmF0b3IgVCgpIHsgcmV0dXJuIHZhbDsgfQp9OwoKLy8jaWZkZWYgVEVTVAojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpIHsgCglib3VuZGVkPGludCwgMCwgNTEyPiB4OwoKCXRyeSB7IAoJCXggPSAyNTY7CgkJc3RkOjpjb3V0IDw8IHggPDwgc3RkOjplbmRsOwoKCQl4ID0gMTAyNDsKCQlzdGQ6OmNvdXQgPDwgeCA8PCBzdGQ6OmVuZGw7Cgl9CgljYXRjaChzdGQ6OmV4Y2VwdGlvbiAmZSkgewoJCXN0ZDo6Y2VyciA8PCAiRXJyb3I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwoJfQoJcmV0dXJuIDA7Cn0KCi8vICNlbmRpZgo=