// intIO.hpp
#ifndef INTIO_H
#define INTIO_H
#include <istream>
#include <ostream>
#include <type_traits>
#include <limits>
template
<class T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
class integer_IO
{
T &val;
public:
integer_IO(T &arg) : val(arg) {}
integer_IO(T &&arg) : val(arg) {}
friend std::istream &operator>> (std::istream &is, integer_IO<T> &&i)
{
using TT = decltype(+i.val);
TT hlp;
is >> hlp;
TT constexpr minval = static_cast<TT>(std::numeric_limits<T>::min());
TT constexpr maxval = static_cast<TT>(std::numeric_limits<T>::max());
i.val = static_cast<T>(hlp > maxval ? maxval : hlp < minval ? minval : hlp);
if(hlp > maxval || hlp < minval)
is.setstate(std::ios::failbit);
return is;
}
friend std::ostream &operator<< (std::ostream &os, integer_IO<T> const &&i)
{
os << +i.val;
return os;
}
};
template
<class T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
integer_IO<T> intIO(T &arg)
{
return integer_IO<T>(arg);
}
template
<class T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
integer_IO<T> intIO(T &&arg)
{
return integer_IO<T>(arg);
}
#endif
// main.cpp
#include <iostream>
#include <cstdint>
// #include "intIO.hpp"
using namespace std;
int dwaplusdwa()
{
return 2+2;
}
int main()
{
int_least8_t i;
cin >> intIO(i);
cout << intIO(i) << '\n';
cout << intIO(dwaplusdwa()) << '\n';
}
Ly8gaW50SU8uaHBwCgojaWZuZGVmIElOVElPX0gKI2RlZmluZSBJTlRJT19ICgojaW5jbHVkZSA8aXN0cmVhbT4KI2luY2x1ZGUgPG9zdHJlYW0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGxpbWl0cz4KCnRlbXBsYXRlCjxjbGFzcyBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlPjo6dHlwZT4KY2xhc3MgaW50ZWdlcl9JTwp7CiAgVCAmdmFsOwoKcHVibGljOgoKICBpbnRlZ2VyX0lPKFQgJmFyZykgOiB2YWwoYXJnKSB7fQogIGludGVnZXJfSU8oVCAmJmFyZykgOiB2YWwoYXJnKSB7fQogIAogIGZyaWVuZCBzdGQ6OmlzdHJlYW0gJm9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmaXMsIGludGVnZXJfSU88VD4gJiZpKQogIHsKICAgIHVzaW5nIFRUID0gZGVjbHR5cGUoK2kudmFsKTsKICAgIFRUIGhscDsKICAgIGlzID4+IGhscDsKICAgIFRUIGNvbnN0ZXhwciBtaW52YWwgPSBzdGF0aWNfY2FzdDxUVD4oc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkpOwogICAgVFQgY29uc3RleHByIG1heHZhbCA9IHN0YXRpY19jYXN0PFRUPihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSk7CiAgICBpLnZhbCA9IHN0YXRpY19jYXN0PFQ+KGhscCA+IG1heHZhbCA/IG1heHZhbCA6IGhscCA8IG1pbnZhbCA/IG1pbnZhbCA6IGhscCk7CiAgICBpZihobHAgPiBtYXh2YWwgfHwgaGxwIDwgbWludmFsKQogICAgICBpcy5zZXRzdGF0ZShzdGQ6Omlvczo6ZmFpbGJpdCk7CiAgICByZXR1cm4gaXM7CiAgfQogIAogIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSAmb3MsIGludGVnZXJfSU88VD4gY29uc3QgJiZpKQogIHsKICAgIG9zIDw8ICtpLnZhbDsKICAgIHJldHVybiBvczsKICB9Cn07Cgp0ZW1wbGF0ZQo8Y2xhc3MgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZT46OnR5cGU+CmludGVnZXJfSU88VD4gaW50SU8oVCAmYXJnKQp7CiAgcmV0dXJuIGludGVnZXJfSU88VD4oYXJnKTsKfQoKdGVtcGxhdGUKPGNsYXNzIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWU+Ojp0eXBlPgppbnRlZ2VyX0lPPFQ+IGludElPKFQgJiZhcmcpCnsKICByZXR1cm4gaW50ZWdlcl9JTzxUPihhcmcpOwp9CgojZW5kaWYKCi8vIG1haW4uY3BwCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjc3RkaW50PgovLyAjaW5jbHVkZSAiaW50SU8uaHBwIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGR3YXBsdXNkd2EoKQp7CiAgcmV0dXJuIDIrMjsKfQoKaW50IG1haW4oKQp7CiAgaW50X2xlYXN0OF90IGk7CiAgY2luID4+IGludElPKGkpOwogIGNvdXQgPDwgaW50SU8oaSkgPDwgJ1xuJzsKICBjb3V0IDw8IGludElPKGR3YXBsdXNkd2EoKSkgPDwgJ1xuJzsKfQ==