#include <iostream>
#include <bitset>
class State{
public:
//Observer
std::string ToString() const { return state_.to_string();};
//Getters
bool MoveUp() const{ return state_[0];};
bool MoveDown() const{ return state_[1];};
bool MoveLeft() const{ return state_[2];};
bool MoveRight() const{ return state_[3];};
bool Still() const{ return state_[4];};
bool Jump() const{ return state_[5];};
//Setters
void MoveUp(bool on) {state_[0] = on;}
void MoveDown(bool on) {state_[1] = on;}
void MoveLeft(bool on) {state_[2] = on;}
void MoveRight(bool on) {state_[3] = on;}
void Still(bool on) {state_[4] = on;}
void Jump(bool on) {state_[5] = on;}
private:
std::bitset<6> state_;
};
int main() {
State s;
auto report = [&s](std::string const& msg){
std::cout<<msg<<" "<<s.ToString()<<std::endl;
};
report("initial value");
s.MoveUp(true);
report("move up set");
s.MoveDown(true);
report("move down set");
s.MoveLeft(true);
report("move left set");
s.MoveRight(true);
report("move right set");
s.Still(true);
report("still set");
s.Jump(true);
report("jump set");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0c2V0PgoKY2xhc3MgU3RhdGV7CnB1YmxpYzoKICAgIC8vT2JzZXJ2ZXIKCXN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfLnRvX3N0cmluZygpO307CiAgICAvL0dldHRlcnMKCWJvb2wgTW92ZVVwKCkgICAgY29uc3R7IHJldHVybiBzdGF0ZV9bMF07fTsJCglib29sIE1vdmVEb3duKCkgIGNvbnN0eyByZXR1cm4gc3RhdGVfWzFdO307CQoJYm9vbCBNb3ZlTGVmdCgpICBjb25zdHsgcmV0dXJuIHN0YXRlX1syXTt9OwkKCWJvb2wgTW92ZVJpZ2h0KCkgY29uc3R7IHJldHVybiBzdGF0ZV9bM107fTsJCglib29sIFN0aWxsKCkgICAgIGNvbnN0eyByZXR1cm4gc3RhdGVfWzRdO307CQoJYm9vbCBKdW1wKCkgICAgICBjb25zdHsgcmV0dXJuIHN0YXRlX1s1XTt9OwkKICAgIC8vU2V0dGVycwoJdm9pZCBNb3ZlVXAoYm9vbCBvbikgICAge3N0YXRlX1swXSA9IG9uO30KCXZvaWQgTW92ZURvd24oYm9vbCBvbikgIHtzdGF0ZV9bMV0gPSBvbjt9Cgl2b2lkIE1vdmVMZWZ0KGJvb2wgb24pICB7c3RhdGVfWzJdID0gb247fQoJdm9pZCBNb3ZlUmlnaHQoYm9vbCBvbikge3N0YXRlX1szXSA9IG9uO30KCXZvaWQgU3RpbGwoYm9vbCBvbikgICAgIHtzdGF0ZV9bNF0gPSBvbjt9Cgl2b2lkIEp1bXAoYm9vbCBvbikgICAgICB7c3RhdGVfWzVdID0gb247fQpwcml2YXRlOgoJc3RkOjpiaXRzZXQ8Nj4gc3RhdGVfOwp9OwoKCmludCBtYWluKCkgewoJU3RhdGUgczsKICAgIGF1dG8gcmVwb3J0ID0gWyZzXShzdGQ6OnN0cmluZyBjb25zdCYgbXNnKXsKIAkgICAgc3RkOjpjb3V0PDxtc2c8PCIgIjw8cy5Ub1N0cmluZygpPDxzdGQ6OmVuZGw7CiAgICB9OwoJcmVwb3J0KCJpbml0aWFsIHZhbHVlIik7CglzLk1vdmVVcCh0cnVlKTsKICAgIHJlcG9ydCgibW92ZSB1cCBzZXQiKTsKCXMuTW92ZURvd24odHJ1ZSk7CiAgICByZXBvcnQoIm1vdmUgZG93biBzZXQiKTsKCXMuTW92ZUxlZnQodHJ1ZSk7CiAgICByZXBvcnQoIm1vdmUgbGVmdCBzZXQiKTsKCXMuTW92ZVJpZ2h0KHRydWUpOwogICAgcmVwb3J0KCJtb3ZlIHJpZ2h0IHNldCIpOwoJcy5TdGlsbCh0cnVlKTsKICAgIHJlcG9ydCgic3RpbGwgc2V0Iik7CglzLkp1bXAodHJ1ZSk7CiAgICByZXBvcnQoImp1bXAgc2V0Iik7CglyZXR1cm4gMDsKfQo=