// cmdids_processor.cpp // over-engineered perchance #include #include #include #include #include #include const char *hpp_template = R"(// generated file #pragma once #include @DEFINES@ namespace cmdids { struct CmdIdDetail { const google::protobuf::Descriptor *descriptor; std::string name; unsigned short cmdid; int enet_channel_id; bool enet_is_reliable; bool is_allow_client; }; extern std::unordered_map cmd_name_to_detail; extern std::unordered_map cmd_id_to_detail; } )"; const char *cpp_template = R"(// generated file #include "cmdids.hpp" namespace cmdids { std::unordered_map cmd_name_to_detail; std::unordered_map cmd_id_to_detail; } @INCLUDES@ struct init { init() { @INIT_CODE@ } }; static init _init; )"; void string_replace(std::string *s, const std::string_view search, const std::string_view replace) { s->replace(s->find(search), search.length(), replace); } int main(int argc, char *argv[]) { assert(argc == 4); std::ifstream csvf(argv[1]); std::ofstream cppf(argv[2]); std::ofstream hppf(argv[3]); std::string headerline; std::getline(csvf, headerline, '\n'); std::ostringstream hpp_defines; std::ostringstream cpp_includes; std::ostringstream cpp_init_code; std::string cmdname, cmdid, channel_id, reliable, allow_client; while (true) { std::getline(csvf, cmdname, ','); std::getline(csvf, cmdid, ','); std::getline(csvf, channel_id, ','); std::getline(csvf, reliable, ','); std::getline(csvf, allow_client, '\n'); if (csvf.eof()) break; hpp_defines << "#define CMD_ID_" << cmdname << " " << cmdid << "\n"; cpp_includes << "#include \n"; cpp_init_code << "\t\tstatic const cmdids::CmdIdDetail detail_" << cmdname << " = (cmdids::CmdIdDetail){ " << cmdname << "::GetDescriptor(), \"" << cmdname << "\", " << cmdid << ", " << channel_id << ", " << reliable << ", " << allow_client << " };\n"; cpp_init_code << "\t\tcmdids::cmd_id_to_detail.insert({ (unsigned short)" << cmdid << ", &detail_" << cmdname << " });\n"; cpp_init_code << "\t\tcmdids::cmd_name_to_detail.insert({ \"" << cmdname << "\", &detail_" << cmdname << " });\n"; } std::string hpp_content(hpp_template); string_replace(&hpp_content, std::string_view("@DEFINES@"), hpp_defines.str()); hppf << hpp_content; std::string cpp_content(cpp_template); string_replace(&cpp_content, std::string_view("@INCLUDES@"), cpp_includes.str()); string_replace(&cpp_content, std::string_view("@INIT_CODE@"), cpp_init_code.str()); cppf << cpp_content; }