#include <iostream>
#include <map>
#include <stack>
#include <string>
#define _USE_MATH_DEFINES
#include <cmath>
#define NUMBERS(X) \
X(Zero, 0.0) X(One, 1.0) X(Two, 2.0) X(Three, 3.0) \
X(Four, 4.0) X(Five, 5.0) X(Six, 6.0) X(Seven, 7.0) \
X(Eight, 8.0) X(Nine, 9.0) X(Ten, 10.0) X(Eleven, 11) \
X(Pi, M_PI)
#define OPERATIONS(X) X(Add, +) X(Sub, -) X(Mul, *) X(Div, /)
#define VARIABLES(X) X(x) X(y) X(z)
std::map<std::string, double> variables;
std::stack<double> stack;
struct Top {
Top(double& x) {
x = stack.top();
}
};
struct Pop {
Pop(double& x) {
delete new Top(x);
stack.pop();
}
};
struct Push {
Push (double x){
stack.push(x);
}
};
struct Number {
Number (double v) {
delete new Push(v);
}
};
#define NUMBER_CLASS(Name, value) \
struct Name { \
Name () { \
delete new Number(value); \
} \
};
NUMBERS(NUMBER_CLASS)
#define OPERATION_CLASS(Name, X) \
struct Name { \
Name () { \
double x, y; \
delete new Pop(y); \
delete new Pop(x); \
delete new Push(x X y); \
} \
};
OPERATIONS(OPERATION_CLASS)
struct VarSet {
VarSet(const std::string& name) {
double x;
delete new Pop(x);
variables[name] = x;
}
};
struct VarGet {
VarGet(const std::string& name) {
delete new Push(variables[name]);
}
};
#define VARIABLE_DEFINE_CLASS(Name) \
struct set ## Name { \
set ## Name () { \
delete new VarSet(#Name); \
} \
};
#define VARIABLE_GET_CLASS(Name) \
struct Name { \
Name () { \
delete new VarGet(#Name); \
} \
};
VARIABLES(VARIABLE_DEFINE_CLASS)
VARIABLES(VARIABLE_GET_CLASS)
struct Print {
template<typename n> Print (n x) {
std::cout << x << std::endl;
}
Print () {
double x;
delete new Top(x);
std::cout << x << std::endl;
}
};
int main() {
delete new Pi;
delete new One;
delete new Two;
delete new Add;
delete new Div;
delete new Print("PI/3:");
delete new Print;
delete new setx;
delete new One;
delete new One;
delete new One;
delete new Add;
delete new Add;
delete new x;
delete new Mul;
delete new Print("PI:");
delete new Print;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxzdHJpbmc+CgojZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiNpbmNsdWRlIDxjbWF0aD4KCiNkZWZpbmUgTlVNQkVSUyhYKSBcCglYKFplcm8sIDAuMCkJWChPbmUsIDEuMCkJCVgoVHdvLCAyLjApCQlYKFRocmVlLCAzLjApCVwKCVgoRm91ciwgNC4wKQlYKEZpdmUsIDUuMCkJWChTaXgsIDYuMCkJCVgoU2V2ZW4sIDcuMCkJXAoJWChFaWdodCwgOC4wKQlYKE5pbmUsIDkuMCkJWChUZW4sIDEwLjApCVgoRWxldmVuLCAxMSkJXAoJWChQaSwgTV9QSSkKCiNkZWZpbmUgT1BFUkFUSU9OUyhYKSBYKEFkZCwgKykgWChTdWIsIC0pIFgoTXVsLCAqKSBYKERpdiwgLykKCiNkZWZpbmUgVkFSSUFCTEVTKFgpIFgoeCkgWCh5KSBYKHopCgpzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiB2YXJpYWJsZXM7CnN0ZDo6c3RhY2s8ZG91YmxlPiBzdGFjazsKCnN0cnVjdCBUb3AgewoJVG9wKGRvdWJsZSYgeCkgewoJCXggPSBzdGFjay50b3AoKTsKCX0KfTsKCnN0cnVjdCBQb3AgewoJUG9wKGRvdWJsZSYgeCkgewoJCWRlbGV0ZSBuZXcgVG9wKHgpOwoJCXN0YWNrLnBvcCgpOwoJfQp9OwoKc3RydWN0IFB1c2ggewoJUHVzaCAoZG91YmxlIHgpewoJCXN0YWNrLnB1c2goeCk7Cgl9Cn07CgpzdHJ1Y3QgTnVtYmVyIHsKCU51bWJlciAoZG91YmxlIHYpIHsKCQlkZWxldGUgbmV3IFB1c2godik7Cgl9Cn07CgojZGVmaW5lIE5VTUJFUl9DTEFTUyhOYW1lLCB2YWx1ZSkgXApzdHJ1Y3QgTmFtZSB7ICAgICAgICAgICAgICAgICAgICAgXAoJTmFtZSAoKSB7ICAgICAgICAgICAgICAgICAgICAgXAoJCWRlbGV0ZSBuZXcgTnVtYmVyKHZhbHVlKTsgXAoJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAp9OwoKTlVNQkVSUyhOVU1CRVJfQ0xBU1MpCgojZGVmaW5lIE9QRVJBVElPTl9DTEFTUyhOYW1lLCBYKSBcCnN0cnVjdCBOYW1lIHsgICAgICAgICAgICAgICAgICAgIFwKCU5hbWUgKCkgeyAgICAgICAgICAgICAgICAgICAgXAoJCWRvdWJsZSB4LCB5OyAgICAgICAgICAgICBcCgkJZGVsZXRlIG5ldyBQb3AoeSk7ICAgICAgIFwKCQlkZWxldGUgbmV3IFBvcCh4KTsgICAgICAgXAoJCWRlbGV0ZSBuZXcgUHVzaCh4IFggeSk7ICBcCgl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfTsKCk9QRVJBVElPTlMoT1BFUkFUSU9OX0NMQVNTKQoKc3RydWN0IFZhclNldCB7CglWYXJTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKCQlkb3VibGUgeDsKCQlkZWxldGUgbmV3IFBvcCh4KTsKCQl2YXJpYWJsZXNbbmFtZV0gPSB4OwoJfQp9OwoKc3RydWN0IFZhckdldCB7CglWYXJHZXQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKCQlkZWxldGUgbmV3IFB1c2godmFyaWFibGVzW25hbWVdKTsKCX0KfTsKCiNkZWZpbmUgVkFSSUFCTEVfREVGSU5FX0NMQVNTKE5hbWUpIFwKc3RydWN0IHNldCAjIyBOYW1lIHsgICAgICAgICAgICAgICAgXAoJc2V0ICMjIE5hbWUgKCkgeyAgICAgICAgICAgICAgICBcCgkJZGVsZXRlIG5ldyBWYXJTZXQoI05hbWUpOyAgIFwKCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAp9OwoKI2RlZmluZSBWQVJJQUJMRV9HRVRfQ0xBU1MoTmFtZSkgICBcCnN0cnVjdCBOYW1lIHsgICAgICAgICAgICAgICAgICAgICAgXAoJTmFtZSAoKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKCQlkZWxldGUgbmV3IFZhckdldCgjTmFtZSk7ICBcCgl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAp9OwoKVkFSSUFCTEVTKFZBUklBQkxFX0RFRklORV9DTEFTUykKVkFSSUFCTEVTKFZBUklBQkxFX0dFVF9DTEFTUykKCnN0cnVjdCBQcmludCB7Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBuPiBQcmludCAobiB4KSB7CgkJc3RkOjpjb3V0IDw8IHggPDwgc3RkOjplbmRsOwoJfQoJUHJpbnQgKCkgewoJCWRvdWJsZSB4OwoJCWRlbGV0ZSBuZXcgVG9wKHgpOwoJCXN0ZDo6Y291dCA8PCB4IDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmludCBtYWluKCkgewoJCglkZWxldGUgbmV3IFBpOwoJZGVsZXRlIG5ldyBPbmU7CglkZWxldGUgbmV3IFR3bzsKCWRlbGV0ZSBuZXcgQWRkOwoJZGVsZXRlIG5ldyBEaXY7CglkZWxldGUgbmV3IFByaW50KCJQSS8zOiIpOwoJZGVsZXRlIG5ldyBQcmludDsKCWRlbGV0ZSBuZXcgc2V0eDsKCQoJZGVsZXRlIG5ldyBPbmU7CglkZWxldGUgbmV3IE9uZTsKCWRlbGV0ZSBuZXcgT25lOwoJZGVsZXRlIG5ldyBBZGQ7CglkZWxldGUgbmV3IEFkZDsKCWRlbGV0ZSBuZXcgeDsKCWRlbGV0ZSBuZXcgTXVsOwoJZGVsZXRlIG5ldyBQcmludCgiUEk6Iik7CglkZWxldGUgbmV3IFByaW50OwoJCglyZXR1cm4gMDsKfQ==