#include <iostream>
namespace live_without_statements
{
template <typename Action> void exec(Action action)
{
action();
}
template <typename Action> void skip(Action action) {
(void)action;
}
template <typename Then>
void if_op(bool cond, Then thenAction)
{
void (*fns[])(Then) = {&skip, &exec};
fns[cond](thenAction);
}
template <typename Then, typename Else>
void if_op(bool cond, Then t, Else e)
{
if_op(cond, t);
if_op(!cond, e);
}
template <typename Cond, typename Body, size_t level>
struct looper
{
static bool loop(Cond cond, Body body)
{
bool c = looper<Cond, Body, level-1>::loop(cond, body);
if_op(c, [&c, &cond, &body](){c = looper<Cond, Body, level-1>::loop(cond, body);});
return c;
}
};
template <typename Cond, typename Body>
struct looper<Cond, Body, 0>
{
static bool loop(Cond cond, Body body)
{
bool c = cond();
if_op(c, body);
return c;
}
};
// don't worry, thermal death of the universe will happen earlier...
const int level_limit = 128;
template <typename Cond, typename Body>
void while_op(Cond cond, Body body)
{
looper<Cond, Body, level_limit>::loop(cond, body);
}
}
int main()
{
using namespace live_without_statements;
int a[] {1, 7, 3, 2, 8, 4, 2, 5, 9, 0};
size_t len = sizeof(a) / sizeof(a[0]);
size_t i = 0;
while_op([&](){return i < len - 1;}, [&](){
size_t j = 0;
while_op([&](){return j < len - i - 1;}, [&](){
if_op(a[j] > a[j+1], [&](){std::swap(a[j], a[j+1]);});
++j;
});
++i;
});
i = 0;
while_op([&](){return i < 10;}, [&](){
std::cout << "a[" << i << "] = " << a[i] << std::endl;
++i;
});
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIGxpdmVfd2l0aG91dF9zdGF0ZW1lbnRzCnsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uPiB2b2lkIGV4ZWMoQWN0aW9uIGFjdGlvbikKICAgIHsKICAgICAgICBhY3Rpb24oKTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uPiB2b2lkIHNraXAoQWN0aW9uIGFjdGlvbikgewogICAgICAgICh2b2lkKWFjdGlvbjsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhlbj4KICAgIHZvaWQgaWZfb3AoYm9vbCBjb25kLCBUaGVuIHRoZW5BY3Rpb24pCiAgICB7CiAgICAgICAgdm9pZCAoKmZuc1tdKShUaGVuKSA9IHsmc2tpcCwgJmV4ZWN9OwogICAgICAgIGZuc1tjb25kXSh0aGVuQWN0aW9uKTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhlbiwgdHlwZW5hbWUgRWxzZT4KICAgIHZvaWQgaWZfb3AoYm9vbCBjb25kLCBUaGVuIHQsIEVsc2UgZSkKICAgIHsKICAgICAgICBpZl9vcChjb25kLCB0KTsKICAgICAgICBpZl9vcCghY29uZCwgZSk7CiAgICB9CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbmQsIHR5cGVuYW1lIEJvZHksIHNpemVfdCBsZXZlbD4KICAgIHN0cnVjdCBsb29wZXIKICAgIHsKICAgICAgICBzdGF0aWMgYm9vbCBsb29wKENvbmQgY29uZCwgQm9keSBib2R5KQogICAgICAgIHsKICAgICAgICAgICAgYm9vbCBjID0gbG9vcGVyPENvbmQsIEJvZHksIGxldmVsLTE+Ojpsb29wKGNvbmQsIGJvZHkpOwogICAgICAgICAgICBpZl9vcChjLCBbJmMsICZjb25kLCAmYm9keV0oKXtjID0gbG9vcGVyPENvbmQsIEJvZHksIGxldmVsLTE+Ojpsb29wKGNvbmQsIGJvZHkpO30pOwogICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICB9CiAgICB9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25kLCB0eXBlbmFtZSBCb2R5PgogICAgc3RydWN0IGxvb3BlcjxDb25kLCBCb2R5LCAwPgogICAgewogICAgICAgIHN0YXRpYyBib29sIGxvb3AoQ29uZCBjb25kLCBCb2R5IGJvZHkpCiAgICAgICAgewogICAgICAgICAgICBib29sIGMgPSBjb25kKCk7CiAgICAgICAgICAgIGlmX29wKGMsIGJvZHkpOwogICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIGRvbid0IHdvcnJ5LCB0aGVybWFsIGRlYXRoIG9mIHRoZSB1bml2ZXJzZSB3aWxsIGhhcHBlbiBlYXJsaWVyLi4uCiAgICBjb25zdCBpbnQgbGV2ZWxfbGltaXQgPSAxMjg7IAoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25kLCB0eXBlbmFtZSBCb2R5PgogICAgdm9pZCB3aGlsZV9vcChDb25kIGNvbmQsIEJvZHkgYm9keSkKICAgIHsKICAgICAgICBsb29wZXI8Q29uZCwgQm9keSwgbGV2ZWxfbGltaXQ+Ojpsb29wKGNvbmQsIGJvZHkpOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBsaXZlX3dpdGhvdXRfc3RhdGVtZW50czsKCiAgICBpbnQgYVtdIHsxLCA3LCAzLCAyLCA4LCA0LCAyLCA1LCA5LCAwfTsKCiAgICBzaXplX3QgbGVuID0gc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pOwoKICAgIHNpemVfdCBpID0gMDsKICAgIHdoaWxlX29wKFsmXSgpe3JldHVybiBpIDwgbGVuIC0gMTt9LCBbJl0oKXsKICAgICAgICBzaXplX3QgaiA9IDA7CiAgICAgICAgd2hpbGVfb3AoWyZdKCl7cmV0dXJuIGogPCBsZW4gLSBpIC0gMTt9LCBbJl0oKXsKICAgICAgICAgICAgaWZfb3AoYVtqXSA+IGFbaisxXSwgWyZdKCl7c3RkOjpzd2FwKGFbal0sIGFbaisxXSk7fSk7CiAgICAgICAgICAgICsrajsKICAgICAgICB9KTsKICAgICAgICArK2k7CiAgICB9KTsKCiAgICBpID0gMDsKICAgIHdoaWxlX29wKFsmXSgpe3JldHVybiBpIDwgMTA7fSwgWyZdKCl7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJhWyIgPDwgaSA8PCAiXSA9ICIgPDwgYVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgKytpOwogICAgfSk7CgogICAgcmV0dXJuIDA7Cn0=