#include <iostream>
#include <vector>
#include <functional>
#include <unordered_map>
namespace app {
using model = std::vector<int>;
namespace controller {
void push(app::model &model, model::value_type val) {
model.emplace_back(val);
}
bool pop(app::model &model) {
if(model.size()) {
model.pop_back();
return true;
}
return false;
}
}
namespace view {
void all(app::model const &model) {
std::cout << "[ ";
for(auto el: model) {
std::cout << el << " ";
}
std::cout << "]" << std::endl;
}
void push(app::model &m) {
model::value_type val;
std::cin >> val;
controller::push(m, val);
}
void pop(model &m) {
if(!controller::pop(m)) {
std::cout << "cannot pop from empty collection." << std::endl;
}
}
}
}
namespace routes {
using route = std::string;
using handler = std::function<void()>;
using router = std::unordered_map<route, handler>;
}
int main() {
app::model model;
routes::router const router = {
{"all", [&]{ app::view::all(model); }},
{"push", [&]{ app::view::push(model); }},
{"pop", [&]{ app::view::pop(model); }}
};
routes::route route;
while(std::cin >> route) {
if(router.count(route)) {
router.at(route)();
}
else {
std::cout << "invalid route!" << std::endl;
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CgpuYW1lc3BhY2UgYXBwIHsKCXVzaW5nIG1vZGVsID0gc3RkOjp2ZWN0b3I8aW50PjsKCQoJbmFtZXNwYWNlIGNvbnRyb2xsZXIgewoJCXZvaWQgcHVzaChhcHA6Om1vZGVsICZtb2RlbCwgbW9kZWw6OnZhbHVlX3R5cGUgdmFsKSB7CgkJCW1vZGVsLmVtcGxhY2VfYmFjayh2YWwpOwoJCX0KCQkKCQlib29sIHBvcChhcHA6Om1vZGVsICZtb2RlbCkgewoJCQlpZihtb2RlbC5zaXplKCkpIHsKCQkJCW1vZGVsLnBvcF9iYWNrKCk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJCgluYW1lc3BhY2UgdmlldyB7CgkJdm9pZCBhbGwoYXBwOjptb2RlbCBjb25zdCAmbW9kZWwpIHsKCQkJc3RkOjpjb3V0IDw8ICJbICI7CgkJCWZvcihhdXRvIGVsOiBtb2RlbCkgewoJCQkJc3RkOjpjb3V0IDw8IGVsIDw8ICIgIjsKCQkJfQoJCQlzdGQ6OmNvdXQgPDwgIl0iIDw8IHN0ZDo6ZW5kbDsKCQl9CgkJCgkJdm9pZCBwdXNoKGFwcDo6bW9kZWwgJm0pIHsKCQkJbW9kZWw6OnZhbHVlX3R5cGUgdmFsOwoJCQlzdGQ6OmNpbiA+PiB2YWw7CgkJCWNvbnRyb2xsZXI6OnB1c2gobSwgdmFsKTsKCQl9CgkJCgkJdm9pZCBwb3AobW9kZWwgJm0pIHsKCQkJaWYoIWNvbnRyb2xsZXI6OnBvcChtKSkgewoJCQkJc3RkOjpjb3V0IDw8ICJjYW5ub3QgcG9wIGZyb20gZW1wdHkgY29sbGVjdGlvbi4iIDw8IHN0ZDo6ZW5kbDsKCQkJfQoJCX0KCX0KfQoKbmFtZXNwYWNlIHJvdXRlcyB7Cgl1c2luZyByb3V0ZSA9IHN0ZDo6c3RyaW5nOwoJdXNpbmcgaGFuZGxlciA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPjsKCXVzaW5nIHJvdXRlciA9IHN0ZDo6dW5vcmRlcmVkX21hcDxyb3V0ZSwgaGFuZGxlcj47Cn0KCmludCBtYWluKCkgewoJYXBwOjptb2RlbCBtb2RlbDsKCQoJcm91dGVzOjpyb3V0ZXIgY29uc3Qgcm91dGVyID0gewoJCXsiYWxsIiwgIFsmXXsgYXBwOjp2aWV3OjphbGwobW9kZWwpOyB9fSwKCQl7InB1c2giLCBbJl17IGFwcDo6dmlldzo6cHVzaChtb2RlbCk7IH19LAoJCXsicG9wIiwgIFsmXXsgYXBwOjp2aWV3Ojpwb3AobW9kZWwpOyB9fQoJfTsKCQoJcm91dGVzOjpyb3V0ZSByb3V0ZTsKCXdoaWxlKHN0ZDo6Y2luID4+IHJvdXRlKSB7CgkJaWYocm91dGVyLmNvdW50KHJvdXRlKSkgewoJCQlyb3V0ZXIuYXQocm91dGUpKCk7CgkJfQoJCWVsc2UgewoJCQlzdGQ6OmNvdXQgPDwgImludmFsaWQgcm91dGUhIiA8PCBzdGQ6OmVuZGw7CgkJfQoJfQoJcmV0dXJuIDA7Cn0=