#define call_cb_combine(super, fun) virtual bool fun() {auto re = cb_##fun.first ? cb_##fun.first(this) : true; if (re && cb_##fun.second) re = super::fun(); return re;}
#define call_cb_return(super, type, fun) virtual type fun() {auto re = type(); if (cb_##fun.first) re = cb_##fun.first(this); if (cb_##fun.second) re = super::fun(); return re;}
#define call_cb_1_combine(super, fun, p) {auto re = cb_##fun.first ? cb_##fun.first(this, p) : true; if (re && cb_##fun.second) re = super::fun(p); return re;}
#define call_cb_1_return(super, type, fun, p) {auto re = type(); if (cb_##fun.first) re = cb_##fun.first(this, p); if (cb_##fun.second) re = super::fun(p); return re;}
#define call_cb_2_combine(super, fun, p1, p2) {auto re = cb_##fun.first ? cb_##fun.first(this, p1, p2) : true; if (re && cb_##fun.second) re = super::fun(p1, p2); return re;}
#define call_cb_combine(super, fun) virtual bool fun() {auto re = cb_##fun.first ? cb_##fun.first(this) : true; if (re && !cb_##fun.second) re = super::fun(); return re;}
#define call_cb_return(super, type, fun) virtual type fun() {auto re = type(); if (cb_##fun.first) re = cb_##fun.first(this); if (!cb_##fun.second) re = super::fun(); return re;}
#define call_cb_1_combine(super, fun, p) {auto re = cb_##fun.first ? cb_##fun.first(this, p) : true; if (re && !cb_##fun.second) re = super::fun(p); return re;}
#define call_cb_1_return(super, type, fun, p) {auto re = type(); if (cb_##fun.first) re = cb_##fun.first(this, p); if (!cb_##fun.second) re = super::fun(p); return re;}
#define call_cb_2_combine(super, fun, p1, p2) {auto re = cb_##fun.first ? cb_##fun.first(this, p1, p2) : true; if (re && !cb_##fun.second) re = super::fun(p1, p2); return re;}