#include "boost/any.hpp" #include "boost/function.hpp" namespace alan { class obj { private: std::map members_map; std::map member_is_obj_or_func_map; // obj = true, func = false void exists_check(std::string); public: obj(); template void add_member_obj(std::string, T); template void add_member_func(std::string, T); template T get_member(std::string); alan::obj call(std::string); template alan::obj call(std::string name, std::string param_name, T param); bool member_exists(std::string); }; } alan::obj::obj() { member_is_obj_or_func_map["members_map"] = true; member_is_obj_or_func_map["member_is_obj_or_func_map"] = true; member_is_obj_or_func_map["exists_check"] = true; member_is_obj_or_func_map["obj"] = false; member_is_obj_or_func_map["add_member_obj"] = false; member_is_obj_or_func_map["add_member_func"] = false; member_is_obj_or_func_map["get_member"] = false; member_is_obj_or_func_map["call"] = false; member_is_obj_or_func_map["member_exists"] = false; } void alan::obj::exists_check(std::string name) { if (member_exists(name)) { alan::stuff::error("tried to add the member '" + name + "' to an alan::obj, a member with that name already exists"); } } template void alan::obj::add_member_obj(std::string name, T in) { exists_check(name); members_map[name] = in; member_is_obj_or_func_map[name] = true; } template void alan::obj::add_member_func(std::string name, T in) { exists_check(name); boost::function1 o1 = in; members_map[name] = o1; member_is_obj_or_func_map[name] = false; } template T alan::obj::get_member(std::string name) { T out; if (member_exists(name)) { out = boost::any_cast(members_map.find(name)->second); } else { alan::stuff::error("tried to access the non-existant member '" + name + "' in an alan::obj"); } return out; } alan::obj alan::obj::call(std::string name) { boost::function1 c = get_member>(name); alan::obj o1; o1.add_member_obj("owner", *this); return c(o1); } template alan::obj alan::obj::call(std::string name, std::string param_name, T param) { boost::function1 c = get_member>(name); alan::obj o1; o1.add_member_obj("owner", *this); o1.add_member_obj(param_name, param); return c(o1); } bool alan::obj::member_exists(std::string name) { bool out = true; if (member_is_obj_or_func_map.find(name) == member_is_obj_or_func_map.end()) { out = false; } return out; }