#include <iostream>
#include <cassert>
template<class T, char STEP = 1>
class simple_container
{
class simple_iterator;
public:
simple_container(const T &val) : _value(val)
{
if (std::abs(STEP) != 1 && std::abs(STEP) != 2)
{
assert(STEP % 4 == 0);
assert(STEP != 0);
}
}
simple_iterator begin()
{
return (STEP > 0 ? simple_iterator(_value, STEP, 0) : simple_iterator(_value, STEP, static_cast<long>(sizeof (T) * 8) + STEP));
}
simple_iterator end()
{
return (STEP > 0 ? simple_iterator(_value, STEP, sizeof (T) * 8) : simple_iterator(_value, STEP, STEP));
}
private:
class simple_iterator
{
public:
bool operator!=(const simple_iterator&l)
{
return (_info.pos != l._info.pos) ||
(_info.step != l._info.step) ||
(_val != l._val);
}
unsigned char operator*()
{
return static_cast<unsigned char>((_val >> _info.pos) & (~(0xFF << (_info.step > 0 ? _info.step : -_info.step))));
}
simple_iterator& operator++()
{
_info.pos += _info.step;
return *this;
}
private:
friend class simple_container;
simple_iterator(const T &val, char step, long pos)
: _info{pos, step}, _val(val) {}
struct _info_data
{
long pos;
char step;
};
_info_data _info;
const T &_val;
};
const T &_value;
};
int main() {
unsigned char val = 0b11111001;
simple_container<unsigned char, 1> v(val);
for(auto el : v)
std::cout << std::hex<< static_cast<int>(el);
std::cout << std::endl;
simple_container<unsigned char, -1> rv(val);
for(auto el : rv)
std::cout << std::hex<< static_cast<int>(el);
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KCnRlbXBsYXRlPGNsYXNzIFQsIGNoYXIgU1RFUCA9IDE+CmNsYXNzIHNpbXBsZV9jb250YWluZXIKewoJY2xhc3Mgc2ltcGxlX2l0ZXJhdG9yOwpwdWJsaWM6CglzaW1wbGVfY29udGFpbmVyKGNvbnN0IFQgJnZhbCkgOiBfdmFsdWUodmFsKQoJewoJCWlmIChzdGQ6OmFicyhTVEVQKSAhPSAxICYmIHN0ZDo6YWJzKFNURVApICE9IDIpCgkJewoJCQlhc3NlcnQoU1RFUCAlIDQgPT0gMCk7CgkJCWFzc2VydChTVEVQICE9IDApOwoJCX0KCgl9CgoJc2ltcGxlX2l0ZXJhdG9yIGJlZ2luKCkKCXsKCQlyZXR1cm4gKFNURVAgPiAwID8gc2ltcGxlX2l0ZXJhdG9yKF92YWx1ZSwgU1RFUCwgMCkgOiBzaW1wbGVfaXRlcmF0b3IoX3ZhbHVlLCBTVEVQLCBzdGF0aWNfY2FzdDxsb25nPihzaXplb2YgKFQpICogOCkgKyBTVEVQKSk7CgoJfQoJc2ltcGxlX2l0ZXJhdG9yIGVuZCgpCgl7CgkJcmV0dXJuIChTVEVQID4gMCA/IHNpbXBsZV9pdGVyYXRvcihfdmFsdWUsIFNURVAsIHNpemVvZiAoVCkgKiA4KSA6IHNpbXBsZV9pdGVyYXRvcihfdmFsdWUsIFNURVAsIFNURVApKTsKCX0KcHJpdmF0ZToKCWNsYXNzIHNpbXBsZV9pdGVyYXRvcgoJewoJcHVibGljOgoJCWJvb2wgb3BlcmF0b3IhPShjb25zdCBzaW1wbGVfaXRlcmF0b3ImbCkKCQl7CgkJCXJldHVybiAoX2luZm8ucG9zICE9IGwuX2luZm8ucG9zKSB8fAoJCQkJCShfaW5mby5zdGVwICE9IGwuX2luZm8uc3RlcCkgfHwKCQkJCQkoX3ZhbCAhPSBsLl92YWwpOwoJCX0KCQl1bnNpZ25lZCBjaGFyIG9wZXJhdG9yKigpCgkJewoJCQlyZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKF92YWwgPj4gX2luZm8ucG9zKSAmICh+KDB4RkYgPDwgKF9pbmZvLnN0ZXAgPiAwID8gX2luZm8uc3RlcCA6IC1faW5mby5zdGVwKSkpKTsKCQl9CgoJCXNpbXBsZV9pdGVyYXRvciYgb3BlcmF0b3IrKygpCgkJewoJCQlfaW5mby5wb3MgKz0gX2luZm8uc3RlcDsKCQkJcmV0dXJuICp0aGlzOwoJCX0KCXByaXZhdGU6CgkJZnJpZW5kIGNsYXNzIHNpbXBsZV9jb250YWluZXI7CgoJCXNpbXBsZV9pdGVyYXRvcihjb25zdCBUICZ2YWwsIGNoYXIgc3RlcCwgbG9uZyBwb3MpCgkJCTogX2luZm97cG9zLCBzdGVwfSwgX3ZhbCh2YWwpIHt9CgoJCXN0cnVjdCBfaW5mb19kYXRhCgkJewoJCQlsb25nIHBvczsKCQkJY2hhciBzdGVwOwoJCX07CgkJX2luZm9fZGF0YSBfaW5mbzsKCQljb25zdCBUICZfdmFsOwoKCX07Cgljb25zdCBUICZfdmFsdWU7Cn07CgppbnQgbWFpbigpIHsKCXVuc2lnbmVkIGNoYXIgdmFsID0gMGIxMTExMTAwMTsKCXNpbXBsZV9jb250YWluZXI8dW5zaWduZWQgY2hhciwgMT4gdih2YWwpOwoJZm9yKGF1dG8gZWwgOiB2KQoJCXN0ZDo6Y291dCA8PCBzdGQ6OmhleDw8IHN0YXRpY19jYXN0PGludD4oZWwpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCgoJc2ltcGxlX2NvbnRhaW5lcjx1bnNpZ25lZCBjaGFyLCAtMT4gcnYodmFsKTsKCWZvcihhdXRvIGVsIDogcnYpCgkJc3RkOjpjb3V0IDw8IHN0ZDo6aGV4PDwgc3RhdGljX2Nhc3Q8aW50PihlbCk7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCXJldHVybiAwOwp9Cg==