曦光程式碼託管
阿新 • • 發佈:2021-06-17
曦光1.0 XDU_mzb #include <bits/stdc++.h> namespace xi_guang { using ll = long long int; using std::map; using std::string; using std::function; using std::cin; using std::cout; using std::endl; using std::make_shared; using pair_t = std::pair<string,string>; #define add_func(name) func[#name] = std::bind(name,this,std::placeholders::_1,std::placeholders::_2) template<typename T,typename U> std::pair<string,string> pair(T t,U u) { return std::make_pair<string,string>(t,u); } string next_string(string val) { return std::to_string(std::stoll(val) + 1); } string prev_string(string val) { return std::to_string(std::stoll(val) - 1); } struct base; using parameter = std::shared_ptr<base>; struct base { map<string,string> value; map<string,function<base*(base*,parameter)>> func; base* run(string name,parameter par = nullptr) { if (func.count(name) == 0) { cout << "base -> run -> unknow function :: " << name << endl; exit(2); } return func[name](this,par); } base(std::vector<std::pair<string,string>> v = {}) { for (auto it : v) value[it.first] = it.second; } virtual base* clone() { return new base(*this); } virtual ~base() {}; }; void help_make_ptr(std::vector<std::pair<string,string>> &ret) {} template<typename ...Args> void help_make_ptr(std::vector<std::pair<string,string>> &ret,std::pair<string,string> val,Args ... args) { ret.emplace_back(val); help_make_ptr(ret,args...); } template<typename ...Args> parameter make_par(Args ... args) { std::vector<std::pair<string,string>> ret; help_make_ptr(ret,args...); return std::make_shared<base>(ret); } struct vector : base { string type; vector(string type,string number = "0",string val = "") : type(type) { add_func(show); add_func(push_back); add_func(add); for (ll i = 0;i < std::stoll(number);i++) { value[std::to_string(i)] = val; } } base* push_back(base *raw,parameter par) { for (auto it : par -> value) { auto &value = raw -> value; value[it.first] = it.second; } return raw; } base* add(base *raw,parameter par) { std::vector<pair_t> v; for (auto it : raw -> value) { v.emplace_back(it); } std::sort(v.begin(),v.end(),[](pair_t a,pair_t b){return stoll(a.first) < stoll(b.first);}); for (auto &it : v) { it.second = it.second + par -> value["a"]; if (par -> func.size()) par -> run("next"); } raw -> value.clear(); for (auto it : v) raw -> value.insert(it); return raw; } base* show(base *raw,parameter par) { cout << "["; std::vector<pair_t> v; for (auto it : raw -> value) { v.emplace_back(it); } std::sort(v.begin(),v.end(),[](pair_t a,pair_t b){return stoll(a.first) < stoll(b.first);}); bool is_first = 0; for (auto it : v) { if (is_first == 0) cout << it.second, is_first = 1; else cout << "," << it.second; } cout << "]\n"; return raw; } virtual base* clone() { return new vector(*this); } }; struct inc : base { inc(string init) { add_func(next); value["a"] = init; } base* next(base *raw,parameter par) { raw -> value["a"] = next_string(raw -> value["a"]); return raw; } }; int main() { auto vec = std::make_shared<vector>("string","10","test"); vec -> run("show") -> run("push_back",make_par(pair("11","a"),pair("12","c"))) -> run("show"); vec -> run("add",std::make_shared<inc>("1")) -> run("show"); vec -> run("add",make_par(pair("a",".in"))) -> run("show"); return 0; } } int main() { xi_guang::main(); return 0; }