From a8220b317e217681b1115b6f610f12ca2752c12c Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Tue, 15 Jul 2025 20:10:52 +0800 Subject: [PATCH 01/12] cpp: use shared ptr instead of raw ptr for HubOptions & LoadOptions, add examples for singleton hubs with different HubOptions --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 65 ++++++++++--------- cmd/protoc-gen-cpp-tableau-loader/messager.go | 16 ++--- cmd/protoc-gen-cpp-tableau-loader/shard.go | 26 ++++---- test/cpp-tableau-loader/src/hub/hub.cpp | 21 +++++- test/cpp-tableau-loader/src/hub/hub.h | 23 ++++--- test/cpp-tableau-loader/src/main.cpp | 55 ++++++++-------- .../src/protoconf/hub.pc.cc | 15 +++-- .../cpp-tableau-loader/src/protoconf/hub.pc.h | 26 ++++---- .../src/protoconf/hub_shard0.pc.cc | 6 +- .../src/protoconf/hub_shard1.pc.cc | 14 ++-- 10 files changed, 146 insertions(+), 121 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index 00cd1b90..74dccf06 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -59,9 +59,9 @@ func generateHub(gen *protogen.Plugin) { helper.GenerateCommonHeader(gen, g1, version) g1.P() g1.P(hubHpp) - generateHubHppTplSpec(gen, g1, protofiles, fileMessagers) + generateHubHppTplSpec(g1, protofiles, fileMessagers) g1.P(msgContainerHpp) - generateHubHppMsgContainerMembers(gen, g1, protofiles, fileMessagers) + generateHubHppMsgContainerMembers(g1, protofiles, fileMessagers) g1.P(registryHpp) g1.P(bottomHpp) @@ -70,13 +70,13 @@ func generateHub(gen *protogen.Plugin) { helper.GenerateCommonHeader(gen, g2, version) g2.P() g2.P(hubCppHeader) - generateHubCppHeader(gen, g2, protofiles, fileMessagers) + generateHubCppHeader(g2, protofiles) g2.P(hubCpp) - generateHubCppTplSpec(gen, g2, protofiles, fileMessagers) + generateHubCppTplSpec(g2, protofiles, fileMessagers) g2.P(msgContainerCpp) - generateHubCppMsgContainerCtor(gen, g2, protofiles, fileMessagers) + generateHubCppMsgContainerCtor(g2, protofiles, fileMessagers) g2.P(registryCpp) - generateHubCppRegistry(gen, g2, protofiles, fileMessagers) + generateHubCppRegistry(g2, protofiles, fileMessagers) g2.P(bottomCpp) } else { // sharding @@ -84,7 +84,7 @@ func generateHub(gen *protogen.Plugin) { } } -func generateHubHppTplSpec(gen *protogen.Plugin, g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { +func generateHubHppTplSpec(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { g.P("class ", messager, ";") @@ -95,7 +95,7 @@ func generateHubHppTplSpec(gen *protogen.Plugin, g *protogen.GeneratedFile, prot } } -func generateHubHppMsgContainerMembers(gen *protogen.Plugin, g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { +func generateHubHppMsgContainerMembers(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { g.P(helper.Indent(1), "std::shared_ptr<", messager, "> ", strcase.ToSnake(messager), "_;") @@ -103,14 +103,14 @@ func generateHubHppMsgContainerMembers(gen *protogen.Plugin, g *protogen.Generat } } -func generateHubCppHeader(gen *protogen.Plugin, g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { +func generateHubCppHeader(g *protogen.GeneratedFile, protofiles []string) { for _, proto := range protofiles { g.P(`#include "`, proto, ".", pcExt, `.h"`) } g.P() } -func generateHubCppTplSpec(gen *protogen.Plugin, g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { +func generateHubCppTplSpec(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { g.P("template <>") @@ -122,7 +122,7 @@ func generateHubCppTplSpec(gen *protogen.Plugin, g *protogen.GeneratedFile, prot } } -func generateHubCppMsgContainerCtor(gen *protogen.Plugin, g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { +func generateHubCppMsgContainerCtor(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { g.P(helper.Indent(1), strcase.ToSnake(messager), "_ = std::dynamic_pointer_cast<", messager, `>((*msger_map_)["`, messager, `"]);`) @@ -130,7 +130,7 @@ func generateHubCppMsgContainerCtor(gen *protogen.Plugin, g *protogen.GeneratedF } } -func generateHubCppRegistry(gen *protogen.Plugin, g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { +func generateHubCppRegistry(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { g.P(helper.Indent(1), "Register<", messager, ">();") @@ -170,16 +170,17 @@ struct HubOptions { class Hub { public: - Hub(const HubOptions* options = nullptr) - : msger_container_(std::make_shared()), options_(options ? *options : HubOptions{}) {} + Hub(const std::shared_ptr options = nullptr) + : msger_container_(std::make_shared()), options_(options) {} /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. - bool Load(const std::string& dir, Format fmt = Format::kJSON, const LoadOptions* options = nullptr); + bool Load(const std::string& dir, Format fmt = Format::kJSON, const std::shared_ptr options = nullptr); /***** Asynchronous Loading *****/ // Load configs into temp MessagerContainer, and you should call LoopOnce() in you app's main loop, // in order to take the temp MessagerContainer into effect. - bool AsyncLoad(const std::string& dir, Format fmt = Format::kJSON, const LoadOptions* options = nullptr); + bool AsyncLoad(const std::string& dir, Format fmt = Format::kJSON, + const std::shared_ptr options = nullptr); int LoopOnce(); // You'd better initialize the scheduler in the main thread. void InitScheduler(); @@ -190,12 +191,7 @@ class Hub { /***** MessagerContainer *****/ // This function is exposed only for use in MessagerContainerProvider. - std::shared_ptr GetMessagerContainer() const { - if (options_.provider != nullptr) { - return options_.provider(); - } - return msger_container_; - } + std::shared_ptr GetMessagerContainer() const { return msger_container_; } /***** Access APIs *****/ template @@ -212,9 +208,15 @@ class Hub { private: std::shared_ptr InternalLoad(const std::string& dir, Format fmt = Format::kJSON, - const LoadOptions* options = nullptr) const; + const std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; const std::shared_ptr GetMessager(const std::string& name) const; + std::shared_ptr GetProvidedMessagerContainer() const { + if (options_ != nullptr && options_->provider != nullptr) { + return options_->provider(); + } + return msger_container_; + } bool Postprocess(std::shared_ptr msger_map); @@ -226,7 +228,7 @@ class Hub { // Loading scheduler. internal::Scheduler* sched_ = nullptr; // Hub options - const HubOptions options_; + const std::shared_ptr options_; }; template @@ -295,7 +297,8 @@ const hubCpp = ` namespace tableau { Registrar Registry::registrar = Registrar(); -bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, const LoadOptions* options /* = nullptr */) { +bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, + const std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -309,7 +312,7 @@ bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, const L } bool Hub::AsyncLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const LoadOptions* options /* = nullptr */) { + const std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -330,14 +333,14 @@ void Hub::InitScheduler() { } std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const LoadOptions* options /* = nullptr */) const { + const std::shared_ptr options /* = nullptr */) const { // intercept protobuf error logs auto old_handler = google::protobuf::SetLogHandler(util::ProtobufLogHandler); auto msger_map = NewMessagerMap(); for (auto iter : *msger_map) { auto&& name = iter.first; ATOM_DEBUG("loading %s", name.c_str()); - bool ok = iter.second->Load(dir, fmt, options); + bool ok = iter.second->Load(dir, fmt, options.get()); if (!ok) { ATOM_ERROR("load %s failed: %s", name.c_str(), GetErrMsg().c_str()); // restore to old protobuf log handler @@ -355,14 +358,14 @@ std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fm std::shared_ptr Hub::NewMessagerMap() const { std::shared_ptr msger_map = std::make_shared(); for (auto&& it : Registry::registrar) { - if (!options_.filter || options_.filter(it.first)) { + if (options_ == nullptr || options_->filter == nullptr || options_->filter(it.first)) { (*msger_map)[it.first] = it.second(); } } return msger_map; } -std::shared_ptr Hub::GetMessagerMap() const { return GetMessagerContainer()->msger_map_; } +std::shared_ptr Hub::GetMessagerMap() const { return GetProvidedMessagerContainer()->msger_map_; } void Hub::SetMessagerMap(std::shared_ptr msger_map) { // replace with thread-safe guarantee. @@ -398,7 +401,7 @@ bool Hub::Postprocess(std::shared_ptr msger_map) { return true; } -std::time_t Hub::GetLastLoadedTime() const { return GetMessagerContainer()->last_loaded_time_; }` +std::time_t Hub::GetLastLoadedTime() const { return GetProvidedMessagerContainer()->last_loaded_time_; }` const msgContainerCpp = ` MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = nullptr*/) diff --git a/cmd/protoc-gen-cpp-tableau-loader/messager.go b/cmd/protoc-gen-cpp-tableau-loader/messager.go index 9533901f..08b30ad5 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/messager.go +++ b/cmd/protoc-gen-cpp-tableau-loader/messager.go @@ -26,7 +26,7 @@ func generateHppFile(gen *protogen.Plugin, file *protogen.File) *protogen.Genera g := gen.NewGeneratedFile(filename, "") helper.GenerateFileHeader(gen, file, g, version) g.P() - generateHppFileContent(gen, file, g) + generateHppFileContent(file, g) return g } @@ -36,12 +36,12 @@ func generateCppFile(gen *protogen.Plugin, file *protogen.File) *protogen.Genera g := gen.NewGeneratedFile(filename, "") helper.GenerateFileHeader(gen, file, g, version) g.P() - generateCppFileContent(gen, file, g) + generateCppFileContent(file, g) return g } // generateHppFileContent generates type definitions. -func generateHppFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile) { +func generateHppFileContent(file *protogen.File, g *protogen.GeneratedFile) { g.P("#pragma once") g.P("#include ") g.P() @@ -56,7 +56,7 @@ func generateHppFileContent(gen *protogen.Plugin, file *protogen.File, g *protog opts := message.Desc.Options().(*descriptorpb.MessageOptions) worksheet := proto.GetExtension(opts, tableaupb.E_Worksheet).(*tableaupb.WorksheetOptions) if worksheet != nil { - genHppMessage(gen, file, g, message) + genHppMessage(file, g, message) messagerName := string(message.Desc.Name()) fileMessagers = append(fileMessagers, messagerName) } @@ -76,7 +76,7 @@ func generateHppFileContent(gen *protogen.Plugin, file *protogen.File, g *protog } // genHppMessage generates a message definition. -func genHppMessage(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, message *protogen.Message) { +func genHppMessage(file *protogen.File, g *protogen.GeneratedFile, message *protogen.Message) { pkg := string(file.Desc.Package()) cppFullName := strings.ReplaceAll(pkg, ".", "::") + "::" + string(message.Desc.Name()) messagerFullName := string(message.Desc.FullName()) @@ -132,7 +132,7 @@ func genHppMapGetters(depth int, keys []helper.MapKey, g *protogen.GeneratedFile } // generateCppFileContent generates type implementations. -func generateCppFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile) { +func generateCppFileContent(file *protogen.File, g *protogen.GeneratedFile) { g.P(`#include "`, file.GeneratedFilenamePrefix, ".", pcExt, `.h"`) g.P() g.P(`#include "hub.pc.h"`) @@ -144,14 +144,14 @@ func generateCppFileContent(gen *protogen.Plugin, file *protogen.File, g *protog opts := message.Desc.Options().(*descriptorpb.MessageOptions) worksheet := proto.GetExtension(opts, tableaupb.E_Worksheet).(*tableaupb.WorksheetOptions) if worksheet != nil { - genCppMessage(gen, g, message) + genCppMessage(g, message) } } g.P("} // namespace ", *namespace) } // genCppMessage generates a message implementation. -func genCppMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, message *protogen.Message) { +func genCppMessage(g *protogen.GeneratedFile, message *protogen.Message) { messagerName := string(message.Desc.Name()) messagerFullName := string(message.Desc.FullName()) indexDescriptor := index.ParseIndexDescriptor(message.Desc) diff --git a/cmd/protoc-gen-cpp-tableau-loader/shard.go b/cmd/protoc-gen-cpp-tableau-loader/shard.go index 1289490f..ef898364 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/shard.go +++ b/cmd/protoc-gen-cpp-tableau-loader/shard.go @@ -25,12 +25,12 @@ func generateShardedHub(gen *protogen.Plugin) { helper.GenerateCommonHeader(gen, g1, version) g1.P() g1.P(hubHpp) - generateHubHppTplSpec(gen, g1, protofiles, fileMessagers) + generateHubHppTplSpec(g1, protofiles, fileMessagers) g1.P(msgContainerHpp) - generateShardedHubHppMsgContainerShards(gen, g1, realShardNum) - generateHubHppMsgContainerMembers(gen, g1, protofiles, fileMessagers) + generateShardedHubHppMsgContainerShards(g1, realShardNum) + generateHubHppMsgContainerMembers(g1, protofiles, fileMessagers) g1.P(registryHpp) - generateShardedHubHppRegistryShards(gen, g1, realShardNum) + generateShardedHubHppRegistryShards(g1, realShardNum) g1.P(bottomHpp) cppFilename := "hub." + pcExt + ".cc" @@ -40,9 +40,9 @@ func generateShardedHub(gen *protogen.Plugin) { g2.P(hubCppHeader) g2.P(hubCpp) g2.P(msgContainerCpp) - generateShardedHubCppMsgContainerShards(gen, g2, realShardNum) + generateShardedHubCppMsgContainerShards(g2, realShardNum) g2.P(registryCpp) - generateShardedHubCppRegistryShards(gen, g2, realShardNum) + generateShardedHubCppRegistryShards(g2, realShardNum) g2.P(bottomCpp) for i := 0; i < realShardNum; i++ { @@ -55,11 +55,11 @@ func generateShardedHub(gen *protogen.Plugin) { helper.GenerateCommonHeader(gen, g, version) g.P() shardedProtofiles := protofiles[i*shardSize : cursor] - generateShardedHubCppFileContent(gen, g, i, shardedProtofiles, fileMessagers) + generateShardedHubCppFileContent(g, i, shardedProtofiles, fileMessagers) } } -func generateShardedHubHppMsgContainerShards(gen *protogen.Plugin, g *protogen.GeneratedFile, shardNum int) { +func generateShardedHubHppMsgContainerShards(g *protogen.GeneratedFile, shardNum int) { for i := 0; i < shardNum; i++ { g.P(helper.Indent(1), "void InitShard", i, "();") } @@ -67,7 +67,7 @@ func generateShardedHubHppMsgContainerShards(gen *protogen.Plugin, g *protogen.G g.P(" private:") } -func generateShardedHubHppRegistryShards(gen *protogen.Plugin, g *protogen.GeneratedFile, shardNum int) { +func generateShardedHubHppRegistryShards(g *protogen.GeneratedFile, shardNum int) { for i := 0; i < shardNum; i++ { g.P(helper.Indent(1), "static void InitShard", i, "();") } @@ -75,19 +75,19 @@ func generateShardedHubHppRegistryShards(gen *protogen.Plugin, g *protogen.Gener g.P(" private:") } -func generateShardedHubCppMsgContainerShards(gen *protogen.Plugin, g *protogen.GeneratedFile, shardNum int) { +func generateShardedHubCppMsgContainerShards(g *protogen.GeneratedFile, shardNum int) { for i := 0; i < shardNum; i++ { g.P(helper.Indent(1), "InitShard", i, "();") } } -func generateShardedHubCppRegistryShards(gen *protogen.Plugin, g *protogen.GeneratedFile, shardNum int) { +func generateShardedHubCppRegistryShards(g *protogen.GeneratedFile, shardNum int) { for i := 0; i < shardNum; i++ { g.P(helper.Indent(1), "InitShard", i, "();") } } -func generateShardedHubCppFileContent(gen *protogen.Plugin, g *protogen.GeneratedFile, shardIndex int, protofiles []string, fileMessagers map[string][]string) { +func generateShardedHubCppFileContent(g *protogen.GeneratedFile, shardIndex int, protofiles []string, fileMessagers map[string][]string) { g.P(`#include "`, "hub.", pcExt, `.h"`) g.P() for _, proto := range protofiles { @@ -100,7 +100,7 @@ func generateShardedHubCppFileContent(gen *protogen.Plugin, g *protogen.Generate for _, messager := range fileMessagers[proto] { g.P("template <>") g.P("const std::shared_ptr<" + messager + "> Hub::Get<" + messager + ">() const {") - g.P(helper.Indent(1), "return GetMessagerContainer()->", strcase.ToSnake(messager), "_;") + g.P(helper.Indent(1), "return GetProvidedMessagerContainer()->", strcase.ToSnake(messager), "_;") g.P("}") g.P() } diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index 4c973299..aac678bd 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -18,11 +18,28 @@ void LogWrite(std::ostream* os, const tableau::log::SourceLocation& loc, const t // clang-format on } -void Hub::Init() { +bool DefaultHubOptions::Filter(const std::string& name) { + // all messagers + return true; +} + +std::shared_ptr DefaultHubOptions::MessagerContainerProvider() { + // default messager container + return HubBase::Instance().GetMessagerContainer(); +} + +const std::shared_ptr DefaultHubOptions::GetOptions() { + auto options = std::make_shared(); + options->filter = DefaultHubOptions::Filter; + options->provider = DefaultHubOptions::MessagerContainerProvider; + return options; +} + +void DefaultHubOptions::Init() { // custom log tableau::log::DefaultLogger()->SetWriter(LogWrite); tableau::Registry::Init(); InitCustomMessager(); } -void Hub::InitCustomMessager() { tableau::Registry::Register(); } \ No newline at end of file +void DefaultHubOptions::InitCustomMessager() { tableau::Registry::Register(); } \ No newline at end of file diff --git a/test/cpp-tableau-loader/src/hub/hub.h b/test/cpp-tableau-loader/src/hub/hub.h index b6a79a58..bf9073a6 100644 --- a/test/cpp-tableau-loader/src/hub/hub.h +++ b/test/cpp-tableau-loader/src/hub/hub.h @@ -27,18 +27,21 @@ class Singleton { Singleton() = default; }; -class Hub : public tableau::Hub, public Singleton { +template +class HubBase : public tableau::Hub, public Singleton> { public: - Hub() : tableau::Hub(GetOptions()) {} - void Init(); + HubBase() : tableau::Hub(T::GetOptions()) { T::Init(); } +}; - private: - void InitCustomMessager(); - bool Filter(const std::string& name) { return true; } +class DefaultHubOptions { + public: + static const std::shared_ptr GetOptions(); + static void Init(); private: - const tableau::HubOptions* GetOptions() { - static const tableau::HubOptions options{std::bind(&Hub::Filter, this, std::placeholders::_1)}; - return &options; - } + static bool Filter(const std::string& name); + static std::shared_ptr MessagerContainerProvider(); + static void InitCustomMessager(); }; + +using Hub = HubBase; diff --git a/test/cpp-tableau-loader/src/main.cpp b/test/cpp-tableau-loader/src/main.cpp index 53fde80a..652facfe 100644 --- a/test/cpp-tableau-loader/src/main.cpp +++ b/test/cpp-tableau-loader/src/main.cpp @@ -13,8 +13,8 @@ #include "protoconf/patch_conf.pc.h" #include "protoconf/test_conf.pc.h" -bool LoadWithPatch(tableau::LoadOptions options) { - return Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); +bool LoadWithPatch(const std::shared_ptr options) { + return Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); } bool CustomReadFile(const std::string& filename, std::string& content) { @@ -30,13 +30,13 @@ bool CustomReadFile(const std::string& filename, std::string& content) { } bool TestPatch() { - tableau::LoadOptions options; - options.read_func = CustomReadFile; + auto options = std::make_shared(); + options->read_func = CustomReadFile; // patchconf std::cout << "-----TestPatch patchconf" << std::endl; - options.patch_dirs = {"../../testdata/patchconf/"}; - bool ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + options->patch_dirs = {"../../testdata/patchconf/"}; + bool ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "failed to load with patchconf" << std::endl; return false; @@ -63,8 +63,8 @@ bool TestPatch() { // patchconf2 std::cout << "-----TestPatch patchconf2" << std::endl; - options.patch_dirs = {"../../testdata/patchconf2/"}; - ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + options->patch_dirs = {"../../testdata/patchconf2/"}; + ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "failed to load with patchconf2" << std::endl; return false; @@ -72,9 +72,9 @@ bool TestPatch() { // patchconf2 different format std::cout << "-----TestPatch patchconf2 different format" << std::endl; - options.patch_dirs = {"../../testdata/patchconf2/"}; - options.patch_paths["PatchMergeConf"] = {"../../testdata/patchconf2/PatchMergeConf.txt"}; - ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + options->patch_dirs = {"../../testdata/patchconf2/"}; + options->patch_paths["PatchMergeConf"] = {"../../testdata/patchconf2/PatchMergeConf.txt"}; + ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "failed to load with patchconf2" << std::endl; return false; @@ -82,9 +82,9 @@ bool TestPatch() { // multiple patch files std::cout << "-----TestPatch multiple patch files" << std::endl; - options.patch_paths["PatchMergeConf"] = {"../../testdata/patchconf/PatchMergeConf.json", - "../../testdata/patchconf2/PatchMergeConf.json"}; - ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + options->patch_paths["PatchMergeConf"] = {"../../testdata/patchconf/PatchMergeConf.json", + "../../testdata/patchconf2/PatchMergeConf.json"}; + ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "failed to load with multiple patch files" << std::endl; return false; @@ -92,10 +92,10 @@ bool TestPatch() { // mode only main std::cout << "-----TestPatch ModeOnlyMain" << std::endl; - options.patch_paths["PatchMergeConf"] = {"../../testdata/patchconf/PatchMergeConf.json", - "../../testdata/patchconf2/PatchMergeConf.json"}; - options.mode = tableau::LoadMode::kModeOnlyMain; - ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + options->patch_paths["PatchMergeConf"] = {"../../testdata/patchconf/PatchMergeConf.json", + "../../testdata/patchconf2/PatchMergeConf.json"}; + options->mode = tableau::LoadMode::kModeOnlyMain; + ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "failed to load with mode only main" << std::endl; return false; @@ -109,10 +109,10 @@ bool TestPatch() { // mode only patch std::cout << "-----TestPatch ModeOnlyPatch" << std::endl; - options.patch_paths["PatchMergeConf"] = {"../../testdata/patchconf/PatchMergeConf.json", - "../../testdata/patchconf2/PatchMergeConf.json"}; - options.mode = tableau::LoadMode::kModeOnlyPatch; - ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + options->patch_paths["PatchMergeConf"] = {"../../testdata/patchconf/PatchMergeConf.json", + "../../testdata/patchconf2/PatchMergeConf.json"}; + options->mode = tableau::LoadMode::kModeOnlyPatch; + ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "failed to load with mode only patch" << std::endl; return false; @@ -121,13 +121,12 @@ bool TestPatch() { } int main() { - Hub::Instance().Init(); - tableau::LoadOptions options; - options.ignore_unknown_fields = true; - options.patch_dirs = {"../../testdata/patchconf/"}; - options.paths["ItemConf"] = "../../testdata/conf/ItemConf.json"; + auto options = std::make_shared(); + options->ignore_unknown_fields = true; + options->patch_dirs = {"../../testdata/patchconf/"}; + options->paths["ItemConf"] = "../../testdata/conf/ItemConf.json"; - bool ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, &options); + bool ok = Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); if (!ok) { std::cout << "protobuf hub load failed: " << tableau::GetErrMsg() << std::endl; return 1; diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index c4339b8a..e8b64070 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -12,7 +12,8 @@ namespace tableau { Registrar Registry::registrar = Registrar(); -bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, const LoadOptions* options /* = nullptr */) { +bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, + const std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -26,7 +27,7 @@ bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, const L } bool Hub::AsyncLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const LoadOptions* options /* = nullptr */) { + const std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -47,14 +48,14 @@ void Hub::InitScheduler() { } std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const LoadOptions* options /* = nullptr */) const { + const std::shared_ptr options /* = nullptr */) const { // intercept protobuf error logs auto old_handler = google::protobuf::SetLogHandler(util::ProtobufLogHandler); auto msger_map = NewMessagerMap(); for (auto iter : *msger_map) { auto&& name = iter.first; ATOM_DEBUG("loading %s", name.c_str()); - bool ok = iter.second->Load(dir, fmt, options); + bool ok = iter.second->Load(dir, fmt, options.get()); if (!ok) { ATOM_ERROR("load %s failed: %s", name.c_str(), GetErrMsg().c_str()); // restore to old protobuf log handler @@ -72,14 +73,14 @@ std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fm std::shared_ptr Hub::NewMessagerMap() const { std::shared_ptr msger_map = std::make_shared(); for (auto&& it : Registry::registrar) { - if (!options_.filter || options_.filter(it.first)) { + if (options_ == nullptr || options_->filter == nullptr || options_->filter(it.first)) { (*msger_map)[it.first] = it.second(); } } return msger_map; } -std::shared_ptr Hub::GetMessagerMap() const { return GetMessagerContainer()->msger_map_; } +std::shared_ptr Hub::GetMessagerMap() const { return GetProvidedMessagerContainer()->msger_map_; } void Hub::SetMessagerMap(std::shared_ptr msger_map) { // replace with thread-safe guarantee. @@ -115,7 +116,7 @@ bool Hub::Postprocess(std::shared_ptr msger_map) { return true; } -std::time_t Hub::GetLastLoadedTime() const { return GetMessagerContainer()->last_loaded_time_; } +std::time_t Hub::GetLastLoadedTime() const { return GetProvidedMessagerContainer()->last_loaded_time_; } MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = nullptr*/) : msger_map_(msger_map != nullptr ? msger_map : std::make_shared()), diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 9611d52f..a19d3559 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -35,16 +35,17 @@ struct HubOptions { class Hub { public: - Hub(const HubOptions* options = nullptr) - : msger_container_(std::make_shared()), options_(options ? *options : HubOptions{}) {} + Hub(const std::shared_ptr options = nullptr) + : msger_container_(std::make_shared()), options_(options) {} /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. - bool Load(const std::string& dir, Format fmt = Format::kJSON, const LoadOptions* options = nullptr); + bool Load(const std::string& dir, Format fmt = Format::kJSON, const std::shared_ptr options = nullptr); /***** Asynchronous Loading *****/ // Load configs into temp MessagerContainer, and you should call LoopOnce() in you app's main loop, // in order to take the temp MessagerContainer into effect. - bool AsyncLoad(const std::string& dir, Format fmt = Format::kJSON, const LoadOptions* options = nullptr); + bool AsyncLoad(const std::string& dir, Format fmt = Format::kJSON, + const std::shared_ptr options = nullptr); int LoopOnce(); // You'd better initialize the scheduler in the main thread. void InitScheduler(); @@ -55,12 +56,7 @@ class Hub { /***** MessagerContainer *****/ // This function is exposed only for use in MessagerContainerProvider. - std::shared_ptr GetMessagerContainer() const { - if (options_.provider != nullptr) { - return options_.provider(); - } - return msger_container_; - } + std::shared_ptr GetMessagerContainer() const { return msger_container_; } /***** Access APIs *****/ template @@ -77,9 +73,15 @@ class Hub { private: std::shared_ptr InternalLoad(const std::string& dir, Format fmt = Format::kJSON, - const LoadOptions* options = nullptr) const; + const std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; const std::shared_ptr GetMessager(const std::string& name) const; + std::shared_ptr GetProvidedMessagerContainer() const { + if (options_ != nullptr && options_->provider != nullptr) { + return options_->provider(); + } + return msger_container_; + } bool Postprocess(std::shared_ptr msger_map); @@ -91,7 +93,7 @@ class Hub { // Loading scheduler. internal::Scheduler* sched_ = nullptr; // Hub options - const HubOptions options_; + const std::shared_ptr options_; }; template diff --git a/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc index 157445b0..ba3651d9 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc @@ -11,17 +11,17 @@ namespace tableau { template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->hero_base_conf_; + return GetProvidedMessagerContainer()->hero_base_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->hero_conf_; + return GetProvidedMessagerContainer()->hero_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->item_conf_; + return GetProvidedMessagerContainer()->item_conf_; } void MessagerContainer::InitShard0() { diff --git a/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc index 5778079d..63dd0f4f 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc @@ -11,37 +11,37 @@ namespace tableau { template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->patch_merge_conf_; + return GetProvidedMessagerContainer()->patch_merge_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->patch_replace_conf_; + return GetProvidedMessagerContainer()->patch_replace_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->recursive_patch_conf_; + return GetProvidedMessagerContainer()->recursive_patch_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->activity_conf_; + return GetProvidedMessagerContainer()->activity_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->chapter_conf_; + return GetProvidedMessagerContainer()->chapter_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->task_conf_; + return GetProvidedMessagerContainer()->task_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetMessagerContainer()->theme_conf_; + return GetProvidedMessagerContainer()->theme_conf_; } void MessagerContainer::InitShard1() { From f51e0cf0d7a00e8fbbbc24facb41830ab61f99b8 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Tue, 15 Jul 2025 20:35:00 +0800 Subject: [PATCH 02/12] feat: call tableau::Registry::Init once --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 23 +++++++++++++------ cmd/protoc-gen-cpp-tableau-loader/shard.go | 2 +- test/cpp-tableau-loader/src/hub/hub.cpp | 1 - .../src/protoconf/hub.pc.cc | 14 ++++++++--- .../cpp-tableau-loader/src/protoconf/hub.pc.h | 5 ++-- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index 74dccf06..1cbf224c 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -133,7 +133,7 @@ func generateHubCppMsgContainerCtor(g *protogen.GeneratedFile, protofiles []stri func generateHubCppRegistry(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { - g.P(helper.Indent(1), "Register<", messager, ">();") + g.P(helper.Indent(2), "Register<", messager, ">();") } } } @@ -170,8 +170,8 @@ struct HubOptions { class Hub { public: - Hub(const std::shared_ptr options = nullptr) - : msger_container_(std::make_shared()), options_(options) {} + Hub(const std::shared_ptr options = nullptr); + /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. bool Load(const std::string& dir, Format fmt = Format::kJSON, const std::shared_ptr options = nullptr); @@ -278,7 +278,8 @@ class Registry { private:` -const bottomHpp = ` static Registrar registrar; +const bottomHpp = ` static std::once_flag once; + static Registrar registrar; }; template @@ -295,7 +296,13 @@ const hubCppHeader = `#include "hub.pc.h" const hubCpp = ` namespace tableau { -Registrar Registry::registrar = Registrar(); +std::once_flag Registry::once; +Registrar Registry::registrar; + +Hub::Hub(const std::shared_ptr options /* = nullptr */) + : msger_container_(std::make_shared()), options_(options) { + tableau::Registry::Init(); +} bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, const std::shared_ptr options /* = nullptr */) { @@ -410,7 +417,9 @@ MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = const registryCpp = `} -void Registry::Init() {` +void Registry::Init() { + std::call_once(once, []() {` -const bottomCpp = `} +const bottomCpp = ` }); +} } // namespace tableau` diff --git a/cmd/protoc-gen-cpp-tableau-loader/shard.go b/cmd/protoc-gen-cpp-tableau-loader/shard.go index ef898364..c89adf68 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/shard.go +++ b/cmd/protoc-gen-cpp-tableau-loader/shard.go @@ -83,7 +83,7 @@ func generateShardedHubCppMsgContainerShards(g *protogen.GeneratedFile, shardNum func generateShardedHubCppRegistryShards(g *protogen.GeneratedFile, shardNum int) { for i := 0; i < shardNum; i++ { - g.P(helper.Indent(1), "InitShard", i, "();") + g.P(helper.Indent(2), "InitShard", i, "();") } } diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index aac678bd..a0f5166c 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -38,7 +38,6 @@ const std::shared_ptr DefaultHubOptions::GetOptions() { void DefaultHubOptions::Init() { // custom log tableau::log::DefaultLogger()->SetWriter(LogWrite); - tableau::Registry::Init(); InitCustomMessager(); } diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index e8b64070..297473ae 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -10,7 +10,13 @@ #include "util.pc.h" namespace tableau { -Registrar Registry::registrar = Registrar(); +std::once_flag Registry::once; +Registrar Registry::registrar; + +Hub::Hub(const std::shared_ptr options /* = nullptr */) + : msger_container_(std::make_shared()), options_(options) { + tableau::Registry::Init(); +} bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, const std::shared_ptr options /* = nullptr */) { @@ -126,7 +132,9 @@ MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = } void Registry::Init() { - InitShard0(); - InitShard1(); + std::call_once(once, []() { + InitShard0(); + InitShard1(); + }); } } // namespace tableau diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index a19d3559..cd875c3e 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -35,8 +35,8 @@ struct HubOptions { class Hub { public: - Hub(const std::shared_ptr options = nullptr) - : msger_container_(std::make_shared()), options_(options) {} + Hub(const std::shared_ptr options = nullptr); + /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. bool Load(const std::string& dir, Format fmt = Format::kJSON, const std::shared_ptr options = nullptr); @@ -198,6 +198,7 @@ class Registry { static void InitShard1(); private: + static std::once_flag once; static Registrar registrar; }; From 47b12feb0c4ab59279d143f7bf92f3fd29d48cd2 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Tue, 15 Jul 2025 21:06:05 +0800 Subject: [PATCH 03/12] feat: remove logic out of .h file --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 14 ++++++++------ test/cpp-tableau-loader/src/protoconf/hub.pc.cc | 7 +++++++ test/cpp-tableau-loader/src/protoconf/hub.pc.h | 7 +------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index 1cbf224c..ff43a25b 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -211,12 +211,7 @@ class Hub { const std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; const std::shared_ptr GetMessager(const std::string& name) const; - std::shared_ptr GetProvidedMessagerContainer() const { - if (options_ != nullptr && options_->provider != nullptr) { - return options_->provider(); - } - return msger_container_; - } + std::shared_ptr GetProvidedMessagerContainer() const; bool Postprocess(std::shared_ptr msger_map); @@ -391,6 +386,13 @@ const std::shared_ptr Hub::GetMessager(const std::string& name) const return nullptr; } +std::shared_ptr Hub::GetProvidedMessagerContainer() const { + if (options_ != nullptr && options_->provider != nullptr) { + return options_->provider(); + } + return msger_container_; +} + bool Hub::Postprocess(std::shared_ptr msger_map) { // create a temporary hub with messager container for post process Hub tmp_hub; diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index 297473ae..d8f9bfa9 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -105,6 +105,13 @@ const std::shared_ptr Hub::GetMessager(const std::string& name) const return nullptr; } +std::shared_ptr Hub::GetProvidedMessagerContainer() const { + if (options_ != nullptr && options_->provider != nullptr) { + return options_->provider(); + } + return msger_container_; +} + bool Hub::Postprocess(std::shared_ptr msger_map) { // create a temporary hub with messager container for post process Hub tmp_hub; diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index cd875c3e..252c3e68 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -76,12 +76,7 @@ class Hub { const std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; const std::shared_ptr GetMessager(const std::string& name) const; - std::shared_ptr GetProvidedMessagerContainer() const { - if (options_ != nullptr && options_->provider != nullptr) { - return options_->provider(); - } - return msger_container_; - } + std::shared_ptr GetProvidedMessagerContainer() const; bool Postprocess(std::shared_ptr msger_map); From bcad763b8fa1ffb4fe2d76e1551e6722facf56a2 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Wed, 16 Jul 2025 14:24:52 +0800 Subject: [PATCH 04/12] feat: support Hub::Init to modify HubOptions --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 28 +++++++++++++------ test/cpp-tableau-loader/src/hub/hub.cpp | 2 +- test/cpp-tableau-loader/src/hub/hub.h | 2 +- test/cpp-tableau-loader/src/main.cpp | 2 +- .../src/protoconf/hub.pc.cc | 15 +++++++--- .../cpp-tableau-loader/src/protoconf/hub.pc.h | 13 +++++---- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index ff43a25b..c5dbde77 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -170,17 +170,20 @@ struct HubOptions { class Hub { public: - Hub(const std::shared_ptr options = nullptr); + Hub(std::shared_ptr options = nullptr); + + // Init resets the hub's options. + void Init(MessagerContainerProvider provider, Filter filter = nullptr); /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. - bool Load(const std::string& dir, Format fmt = Format::kJSON, const std::shared_ptr options = nullptr); + bool Load(const std::string& dir, Format fmt = Format::kJSON, std::shared_ptr options = nullptr); /***** Asynchronous Loading *****/ // Load configs into temp MessagerContainer, and you should call LoopOnce() in you app's main loop, // in order to take the temp MessagerContainer into effect. bool AsyncLoad(const std::string& dir, Format fmt = Format::kJSON, - const std::shared_ptr options = nullptr); + std::shared_ptr options = nullptr); int LoopOnce(); // You'd better initialize the scheduler in the main thread. void InitScheduler(); @@ -208,7 +211,7 @@ class Hub { private: std::shared_ptr InternalLoad(const std::string& dir, Format fmt = Format::kJSON, - const std::shared_ptr options = nullptr) const; + std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; const std::shared_ptr GetMessager(const std::string& name) const; std::shared_ptr GetProvidedMessagerContainer() const; @@ -223,7 +226,7 @@ class Hub { // Loading scheduler. internal::Scheduler* sched_ = nullptr; // Hub options - const std::shared_ptr options_; + std::shared_ptr options_; }; template @@ -294,13 +297,20 @@ namespace tableau { std::once_flag Registry::once; Registrar Registry::registrar; -Hub::Hub(const std::shared_ptr options /* = nullptr */) +Hub::Hub(std::shared_ptr options /* = nullptr */) : msger_container_(std::make_shared()), options_(options) { tableau::Registry::Init(); } +void Hub::Init(MessagerContainerProvider provider, Filter filter /* = nullptr */) { + auto options = std::make_shared(); + options->filter = filter; + options->provider = provider; + options_ = options; +} + bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, - const std::shared_ptr options /* = nullptr */) { + std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -314,7 +324,7 @@ bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, } bool Hub::AsyncLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const std::shared_ptr options /* = nullptr */) { + std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -335,7 +345,7 @@ void Hub::InitScheduler() { } std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const std::shared_ptr options /* = nullptr */) const { + std::shared_ptr options /* = nullptr */) const { // intercept protobuf error logs auto old_handler = google::protobuf::SetLogHandler(util::ProtobufLogHandler); auto msger_map = NewMessagerMap(); diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index a0f5166c..8c99ecfc 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -28,7 +28,7 @@ std::shared_ptr DefaultHubOptions::MessagerContainer return HubBase::Instance().GetMessagerContainer(); } -const std::shared_ptr DefaultHubOptions::GetOptions() { +std::shared_ptr DefaultHubOptions::GetOptions() { auto options = std::make_shared(); options->filter = DefaultHubOptions::Filter; options->provider = DefaultHubOptions::MessagerContainerProvider; diff --git a/test/cpp-tableau-loader/src/hub/hub.h b/test/cpp-tableau-loader/src/hub/hub.h index bf9073a6..44c92216 100644 --- a/test/cpp-tableau-loader/src/hub/hub.h +++ b/test/cpp-tableau-loader/src/hub/hub.h @@ -35,7 +35,7 @@ class HubBase : public tableau::Hub, public Singleton> { class DefaultHubOptions { public: - static const std::shared_ptr GetOptions(); + static std::shared_ptr GetOptions(); static void Init(); private: diff --git a/test/cpp-tableau-loader/src/main.cpp b/test/cpp-tableau-loader/src/main.cpp index 652facfe..efa38d6d 100644 --- a/test/cpp-tableau-loader/src/main.cpp +++ b/test/cpp-tableau-loader/src/main.cpp @@ -13,7 +13,7 @@ #include "protoconf/patch_conf.pc.h" #include "protoconf/test_conf.pc.h" -bool LoadWithPatch(const std::shared_ptr options) { +bool LoadWithPatch(std::shared_ptr options) { return Hub::Instance().Load("../../testdata/conf/", tableau::Format::kJSON, options); } diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index d8f9bfa9..8e64506e 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -13,13 +13,20 @@ namespace tableau { std::once_flag Registry::once; Registrar Registry::registrar; -Hub::Hub(const std::shared_ptr options /* = nullptr */) +Hub::Hub(std::shared_ptr options /* = nullptr */) : msger_container_(std::make_shared()), options_(options) { tableau::Registry::Init(); } +void Hub::Init(MessagerContainerProvider provider, Filter filter /* = nullptr */) { + auto options = std::make_shared(); + options->filter = filter; + options->provider = provider; + options_ = options; +} + bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, - const std::shared_ptr options /* = nullptr */) { + std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -33,7 +40,7 @@ bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, } bool Hub::AsyncLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const std::shared_ptr options /* = nullptr */) { + std::shared_ptr options /* = nullptr */) { auto msger_map = InternalLoad(dir, fmt, options); if (!msger_map) { return false; @@ -54,7 +61,7 @@ void Hub::InitScheduler() { } std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fmt /* = Format::kJSON */, - const std::shared_ptr options /* = nullptr */) const { + std::shared_ptr options /* = nullptr */) const { // intercept protobuf error logs auto old_handler = google::protobuf::SetLogHandler(util::ProtobufLogHandler); auto msger_map = NewMessagerMap(); diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 252c3e68..8df8b08a 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -35,17 +35,20 @@ struct HubOptions { class Hub { public: - Hub(const std::shared_ptr options = nullptr); + Hub(std::shared_ptr options = nullptr); + + // Init resets the hub's options. + void Init(MessagerContainerProvider provider, Filter filter = nullptr); /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. - bool Load(const std::string& dir, Format fmt = Format::kJSON, const std::shared_ptr options = nullptr); + bool Load(const std::string& dir, Format fmt = Format::kJSON, std::shared_ptr options = nullptr); /***** Asynchronous Loading *****/ // Load configs into temp MessagerContainer, and you should call LoopOnce() in you app's main loop, // in order to take the temp MessagerContainer into effect. bool AsyncLoad(const std::string& dir, Format fmt = Format::kJSON, - const std::shared_ptr options = nullptr); + std::shared_ptr options = nullptr); int LoopOnce(); // You'd better initialize the scheduler in the main thread. void InitScheduler(); @@ -73,7 +76,7 @@ class Hub { private: std::shared_ptr InternalLoad(const std::string& dir, Format fmt = Format::kJSON, - const std::shared_ptr options = nullptr) const; + std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; const std::shared_ptr GetMessager(const std::string& name) const; std::shared_ptr GetProvidedMessagerContainer() const; @@ -88,7 +91,7 @@ class Hub { // Loading scheduler. internal::Scheduler* sched_ = nullptr; // Hub options - const std::shared_ptr options_; + std::shared_ptr options_; }; template From bf8e23e298a9901705354f93cabc850c0dc8f68c Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Wed, 16 Jul 2025 14:31:45 +0800 Subject: [PATCH 05/12] feat: remove invalid imports --- test/cpp-tableau-loader/src/hub/hub.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index 8c99ecfc..32942466 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -1,6 +1,5 @@ #include "hub/hub.h" -#include "hub.h" #include "hub/custom/item/custom_item_conf.h" #include "protoconf/logger.pc.h" From 1309d5542093d71f96945aae3c0606ee18056a20 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Thu, 17 Jul 2025 10:32:03 +0800 Subject: [PATCH 06/12] feat: use GetMessagerContainerWithProvider --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 8 ++++---- cmd/protoc-gen-cpp-tableau-loader/shard.go | 2 +- test/cpp-tableau-loader/src/protoconf/hub.pc.cc | 6 +++--- test/cpp-tableau-loader/src/protoconf/hub.pc.h | 2 +- .../src/protoconf/hub_shard0.pc.cc | 6 +++--- .../src/protoconf/hub_shard1.pc.cc | 14 +++++++------- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index c5dbde77..a21ef71f 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -213,8 +213,8 @@ class Hub { std::shared_ptr InternalLoad(const std::string& dir, Format fmt = Format::kJSON, std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; + std::shared_ptr GetMessagerContainerWithProvider() const; const std::shared_ptr GetMessager(const std::string& name) const; - std::shared_ptr GetProvidedMessagerContainer() const; bool Postprocess(std::shared_ptr msger_map); @@ -377,7 +377,7 @@ std::shared_ptr Hub::NewMessagerMap() const { return msger_map; } -std::shared_ptr Hub::GetMessagerMap() const { return GetProvidedMessagerContainer()->msger_map_; } +std::shared_ptr Hub::GetMessagerMap() const { return GetMessagerContainerWithProvider()->msger_map_; } void Hub::SetMessagerMap(std::shared_ptr msger_map) { // replace with thread-safe guarantee. @@ -396,7 +396,7 @@ const std::shared_ptr Hub::GetMessager(const std::string& name) const return nullptr; } -std::shared_ptr Hub::GetProvidedMessagerContainer() const { +std::shared_ptr Hub::GetMessagerContainerWithProvider() const { if (options_ != nullptr && options_->provider != nullptr) { return options_->provider(); } @@ -420,7 +420,7 @@ bool Hub::Postprocess(std::shared_ptr msger_map) { return true; } -std::time_t Hub::GetLastLoadedTime() const { return GetProvidedMessagerContainer()->last_loaded_time_; }` +std::time_t Hub::GetLastLoadedTime() const { return GetMessagerContainerWithProvider()->last_loaded_time_; }` const msgContainerCpp = ` MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = nullptr*/) diff --git a/cmd/protoc-gen-cpp-tableau-loader/shard.go b/cmd/protoc-gen-cpp-tableau-loader/shard.go index c89adf68..14bc73c0 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/shard.go +++ b/cmd/protoc-gen-cpp-tableau-loader/shard.go @@ -100,7 +100,7 @@ func generateShardedHubCppFileContent(g *protogen.GeneratedFile, shardIndex int, for _, messager := range fileMessagers[proto] { g.P("template <>") g.P("const std::shared_ptr<" + messager + "> Hub::Get<" + messager + ">() const {") - g.P(helper.Indent(1), "return GetProvidedMessagerContainer()->", strcase.ToSnake(messager), "_;") + g.P(helper.Indent(1), "return GetMessagerContainerWithProvider()->", strcase.ToSnake(messager), "_;") g.P("}") g.P() } diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index 8e64506e..67699c8f 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -93,7 +93,7 @@ std::shared_ptr Hub::NewMessagerMap() const { return msger_map; } -std::shared_ptr Hub::GetMessagerMap() const { return GetProvidedMessagerContainer()->msger_map_; } +std::shared_ptr Hub::GetMessagerMap() const { return GetMessagerContainerWithProvider()->msger_map_; } void Hub::SetMessagerMap(std::shared_ptr msger_map) { // replace with thread-safe guarantee. @@ -112,7 +112,7 @@ const std::shared_ptr Hub::GetMessager(const std::string& name) const return nullptr; } -std::shared_ptr Hub::GetProvidedMessagerContainer() const { +std::shared_ptr Hub::GetMessagerContainerWithProvider() const { if (options_ != nullptr && options_->provider != nullptr) { return options_->provider(); } @@ -136,7 +136,7 @@ bool Hub::Postprocess(std::shared_ptr msger_map) { return true; } -std::time_t Hub::GetLastLoadedTime() const { return GetProvidedMessagerContainer()->last_loaded_time_; } +std::time_t Hub::GetLastLoadedTime() const { return GetMessagerContainerWithProvider()->last_loaded_time_; } MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = nullptr*/) : msger_map_(msger_map != nullptr ? msger_map : std::make_shared()), diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 8df8b08a..226e55d1 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -78,8 +78,8 @@ class Hub { std::shared_ptr InternalLoad(const std::string& dir, Format fmt = Format::kJSON, std::shared_ptr options = nullptr) const; std::shared_ptr NewMessagerMap() const; + std::shared_ptr GetMessagerContainerWithProvider() const; const std::shared_ptr GetMessager(const std::string& name) const; - std::shared_ptr GetProvidedMessagerContainer() const; bool Postprocess(std::shared_ptr msger_map); diff --git a/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc index ba3651d9..09b17922 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc @@ -11,17 +11,17 @@ namespace tableau { template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->hero_base_conf_; + return GetMessagerContainerWithProvider()->hero_base_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->hero_conf_; + return GetMessagerContainerWithProvider()->hero_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->item_conf_; + return GetMessagerContainerWithProvider()->item_conf_; } void MessagerContainer::InitShard0() { diff --git a/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc index 63dd0f4f..dcab9ee0 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc @@ -11,37 +11,37 @@ namespace tableau { template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->patch_merge_conf_; + return GetMessagerContainerWithProvider()->patch_merge_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->patch_replace_conf_; + return GetMessagerContainerWithProvider()->patch_replace_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->recursive_patch_conf_; + return GetMessagerContainerWithProvider()->recursive_patch_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->activity_conf_; + return GetMessagerContainerWithProvider()->activity_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->chapter_conf_; + return GetMessagerContainerWithProvider()->chapter_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->task_conf_; + return GetMessagerContainerWithProvider()->task_conf_; } template <> const std::shared_ptr Hub::Get() const { - return GetProvidedMessagerContainer()->theme_conf_; + return GetMessagerContainerWithProvider()->theme_conf_; } void MessagerContainer::InitShard1() { From e9d010b4be45984a4387c672963a8c107a9fc42f Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Thu, 17 Jul 2025 10:39:37 +0800 Subject: [PATCH 07/12] feat: use std::shared_ptr instead of raw ptr for load function --- cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.cc | 6 +++--- cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.h | 4 ++-- cmd/protoc-gen-cpp-tableau-loader/embed/messager.pc.h | 2 +- cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.cc | 3 ++- cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.h | 3 ++- cmd/protoc-gen-cpp-tableau-loader/hub.go | 2 +- cmd/protoc-gen-cpp-tableau-loader/messager.go | 4 ++-- .../src/hub/custom/item/custom_item_conf.h | 2 +- test/cpp-tableau-loader/src/protoconf/hero_conf.pc.cc | 4 ++-- test/cpp-tableau-loader/src/protoconf/hero_conf.pc.h | 4 ++-- test/cpp-tableau-loader/src/protoconf/hub.pc.cc | 2 +- test/cpp-tableau-loader/src/protoconf/item_conf.pc.cc | 2 +- test/cpp-tableau-loader/src/protoconf/item_conf.pc.h | 2 +- test/cpp-tableau-loader/src/protoconf/load.pc.cc | 6 +++--- test/cpp-tableau-loader/src/protoconf/load.pc.h | 4 ++-- test/cpp-tableau-loader/src/protoconf/messager.pc.h | 2 +- test/cpp-tableau-loader/src/protoconf/patch_conf.pc.cc | 6 +++--- test/cpp-tableau-loader/src/protoconf/patch_conf.pc.h | 6 +++--- test/cpp-tableau-loader/src/protoconf/test_conf.pc.cc | 8 ++++---- test/cpp-tableau-loader/src/protoconf/test_conf.pc.h | 8 ++++---- test/cpp-tableau-loader/src/protoconf/util.pc.cc | 3 ++- test/cpp-tableau-loader/src/protoconf/util.pc.h | 3 ++- 22 files changed, 45 insertions(+), 41 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.cc b/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.cc index 0454b53c..74467101 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.cc +++ b/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.cc @@ -163,7 +163,7 @@ bool PatchMessage(google::protobuf::Message& dst, const google::protobuf::Messag } bool LoadMessageWithPatch(google::protobuf::Message& msg, const std::string& path, Format fmt, tableau::Patch patch, - const LoadOptions* options /* = nullptr*/) { + std::shared_ptr options /* = nullptr*/) { if (options == nullptr) { return LoadMessageByPath(msg, path, fmt, nullptr); } @@ -244,7 +244,7 @@ bool LoadMessageWithPatch(google::protobuf::Message& msg, const std::string& pat } bool LoadMessageByPath(google::protobuf::Message& msg, const std::string& path, Format fmt, - const LoadOptions* options /* = nullptr*/) { + std::shared_ptr options /* = nullptr*/) { std::string content; ReadFunc read_func = util::ReadFile; if (options != nullptr && options->read_func) { @@ -272,7 +272,7 @@ bool LoadMessageByPath(google::protobuf::Message& msg, const std::string& path, } bool LoadMessage(google::protobuf::Message& msg, const std::string& dir, Format fmt, - const LoadOptions* options /* = nullptr*/) { + std::shared_ptr options /* = nullptr*/) { std::string name = util::GetProtoName(msg); std::string path; if (options) { diff --git a/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.h b/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.h index 8f725973..b64ca32b 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.h +++ b/cmd/protoc-gen-cpp-tableau-loader/embed/load.pc.h @@ -37,7 +37,7 @@ struct LoadOptions { }; bool LoadMessageByPath(google::protobuf::Message& msg, const std::string& path, Format fmt = Format::kJSON, - const LoadOptions* options = nullptr); + std::shared_ptr options = nullptr); bool LoadMessage(google::protobuf::Message& msg, const std::string& dir, Format fmt = Format::kJSON, - const LoadOptions* options = nullptr); + std::shared_ptr options = nullptr); } // namespace tableau \ No newline at end of file diff --git a/cmd/protoc-gen-cpp-tableau-loader/embed/messager.pc.h b/cmd/protoc-gen-cpp-tableau-loader/embed/messager.pc.h index 3949b256..7d5bda88 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/embed/messager.pc.h +++ b/cmd/protoc-gen-cpp-tableau-loader/embed/messager.pc.h @@ -22,7 +22,7 @@ class Messager { static const std::string& Name() { return kEmpty; } const Stats& GetStats() { return stats_; } // Load fills message from file in the specified directory and format. - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) = 0; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) = 0; // Message returns the inner message data. virtual const google::protobuf::Message* Message() const { return nullptr; } // callback after all messagers loaded. diff --git a/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.cc b/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.cc index e6ec6c69..5ecd56e3 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.cc +++ b/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.cc @@ -133,7 +133,8 @@ const std::string& Format2Ext(Format fmt) { } } -bool JSON2Message(const std::string& json, google::protobuf::Message& msg, const LoadOptions* options /* = nullptr */) { +bool JSON2Message(const std::string& json, google::protobuf::Message& msg, + std::shared_ptr options /* = nullptr */) { google::protobuf::util::Status status; if (options != nullptr) { google::protobuf::util::JsonParseOptions parse_options; diff --git a/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.h b/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.h index 7e21f23b..60debed4 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.h +++ b/cmd/protoc-gen-cpp-tableau-loader/embed/util.pc.h @@ -82,7 +82,8 @@ Format Ext2Format(const std::string& ext); // and the error message can be obtained by GetErrMsg(). const std::string& Format2Ext(Format fmt); -bool JSON2Message(const std::string& json, google::protobuf::Message& msg, const LoadOptions* options = nullptr); +bool JSON2Message(const std::string& json, google::protobuf::Message& msg, + std::shared_ptr options = nullptr); bool Text2Message(const std::string& text, google::protobuf::Message& msg); bool Bin2Message(const std::string& bin, google::protobuf::Message& msg); diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index a21ef71f..d534e669 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -352,7 +352,7 @@ std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fm for (auto iter : *msger_map) { auto&& name = iter.first; ATOM_DEBUG("loading %s", name.c_str()); - bool ok = iter.second->Load(dir, fmt, options.get()); + bool ok = iter.second->Load(dir, fmt, options); if (!ok) { ATOM_ERROR("load %s failed: %s", name.c_str(), GetErrMsg().c_str()); // restore to old protobuf log handler diff --git a/cmd/protoc-gen-cpp-tableau-loader/messager.go b/cmd/protoc-gen-cpp-tableau-loader/messager.go index 08b30ad5..fef3c3a3 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/messager.go +++ b/cmd/protoc-gen-cpp-tableau-loader/messager.go @@ -85,7 +85,7 @@ func genHppMessage(file *protogen.File, g *protogen.GeneratedFile, message *prot g.P("class ", message.Desc.Name(), " : public Messager {") g.P(" public:") g.P(helper.Indent(1), "static const std::string& Name() { return kProtoName; }") - g.P(helper.Indent(1), "virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override;") + g.P(helper.Indent(1), "virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override;") g.P(helper.Indent(1), "const ", cppFullName, "& Data() const { return data_; }") g.P(helper.Indent(1), "const google::protobuf::Message* Message() const override { return &data_; }") g.P() @@ -158,7 +158,7 @@ func genCppMessage(g *protogen.GeneratedFile, message *protogen.Message) { g.P("const std::string ", messagerName, "::kProtoName = ", `"`, messagerName, `";`) g.P() - g.P("bool ", messagerName, "::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) {") + g.P("bool ", messagerName, "::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) {") g.P(helper.Indent(1), "tableau::util::TimeProfiler profiler;") g.P(helper.Indent(1), "bool loaded = LoadMessage(data_, dir, fmt, options);") g.P(helper.Indent(1), "bool ok = loaded ? ProcessAfterLoad() : false;") diff --git a/test/cpp-tableau-loader/src/hub/custom/item/custom_item_conf.h b/test/cpp-tableau-loader/src/hub/custom/item/custom_item_conf.h index 6dc2826a..5ebb6820 100644 --- a/test/cpp-tableau-loader/src/hub/custom/item/custom_item_conf.h +++ b/test/cpp-tableau-loader/src/hub/custom/item/custom_item_conf.h @@ -5,7 +5,7 @@ class CustomItemConf : public tableau::Messager { public: static const std::string& Name() { return kCustomName; }; virtual bool Load(const std::string& dir, tableau::Format fmt, - const tableau::LoadOptions* options = nullptr) override { + std::shared_ptr options = nullptr) override { return true; } virtual bool ProcessAfterLoadAll(const tableau::Hub& hub) override; diff --git a/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.cc b/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.cc index a6428088..16094a7e 100644 --- a/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.cc @@ -12,7 +12,7 @@ namespace tableau { const std::string HeroConf::kProtoName = "HeroConf"; -bool HeroConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool HeroConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; @@ -71,7 +71,7 @@ const HeroConf::Hero_Attr_OrderedMap* HeroConf::GetOrderedMap(const std::string& const std::string HeroBaseConf::kProtoName = "HeroBaseConf"; -bool HeroBaseConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool HeroBaseConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; diff --git a/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.h b/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.h index 53ec91a2..02698c01 100644 --- a/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hero_conf.pc.h @@ -15,7 +15,7 @@ namespace tableau { class HeroConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::HeroConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } @@ -46,7 +46,7 @@ class HeroConf : public Messager { class HeroBaseConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::HeroBaseConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index 67699c8f..28448799 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -68,7 +68,7 @@ std::shared_ptr Hub::InternalLoad(const std::string& dir, Format fm for (auto iter : *msger_map) { auto&& name = iter.first; ATOM_DEBUG("loading %s", name.c_str()); - bool ok = iter.second->Load(dir, fmt, options.get()); + bool ok = iter.second->Load(dir, fmt, options); if (!ok) { ATOM_ERROR("load %s failed: %s", name.c_str(), GetErrMsg().c_str()); // restore to old protobuf log handler diff --git a/test/cpp-tableau-loader/src/protoconf/item_conf.pc.cc b/test/cpp-tableau-loader/src/protoconf/item_conf.pc.cc index d8527ca3..c4ca73ad 100644 --- a/test/cpp-tableau-loader/src/protoconf/item_conf.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/item_conf.pc.cc @@ -12,7 +12,7 @@ namespace tableau { const std::string ItemConf::kProtoName = "ItemConf"; -bool ItemConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool ItemConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; diff --git a/test/cpp-tableau-loader/src/protoconf/item_conf.pc.h b/test/cpp-tableau-loader/src/protoconf/item_conf.pc.h index 77442e63..e5afd07c 100644 --- a/test/cpp-tableau-loader/src/protoconf/item_conf.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/item_conf.pc.h @@ -15,7 +15,7 @@ namespace tableau { class ItemConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::ItemConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } diff --git a/test/cpp-tableau-loader/src/protoconf/load.pc.cc b/test/cpp-tableau-loader/src/protoconf/load.pc.cc index 1020552f..46659083 100644 --- a/test/cpp-tableau-loader/src/protoconf/load.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/load.pc.cc @@ -168,7 +168,7 @@ bool PatchMessage(google::protobuf::Message& dst, const google::protobuf::Messag } bool LoadMessageWithPatch(google::protobuf::Message& msg, const std::string& path, Format fmt, tableau::Patch patch, - const LoadOptions* options /* = nullptr*/) { + std::shared_ptr options /* = nullptr*/) { if (options == nullptr) { return LoadMessageByPath(msg, path, fmt, nullptr); } @@ -249,7 +249,7 @@ bool LoadMessageWithPatch(google::protobuf::Message& msg, const std::string& pat } bool LoadMessageByPath(google::protobuf::Message& msg, const std::string& path, Format fmt, - const LoadOptions* options /* = nullptr*/) { + std::shared_ptr options /* = nullptr*/) { std::string content; ReadFunc read_func = util::ReadFile; if (options != nullptr && options->read_func) { @@ -277,7 +277,7 @@ bool LoadMessageByPath(google::protobuf::Message& msg, const std::string& path, } bool LoadMessage(google::protobuf::Message& msg, const std::string& dir, Format fmt, - const LoadOptions* options /* = nullptr*/) { + std::shared_ptr options /* = nullptr*/) { std::string name = util::GetProtoName(msg); std::string path; if (options) { diff --git a/test/cpp-tableau-loader/src/protoconf/load.pc.h b/test/cpp-tableau-loader/src/protoconf/load.pc.h index e61f957e..4fc8a035 100644 --- a/test/cpp-tableau-loader/src/protoconf/load.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/load.pc.h @@ -42,7 +42,7 @@ struct LoadOptions { }; bool LoadMessageByPath(google::protobuf::Message& msg, const std::string& path, Format fmt = Format::kJSON, - const LoadOptions* options = nullptr); + std::shared_ptr options = nullptr); bool LoadMessage(google::protobuf::Message& msg, const std::string& dir, Format fmt = Format::kJSON, - const LoadOptions* options = nullptr); + std::shared_ptr options = nullptr); } // namespace tableau diff --git a/test/cpp-tableau-loader/src/protoconf/messager.pc.h b/test/cpp-tableau-loader/src/protoconf/messager.pc.h index c0f73bfc..3e8de4e7 100644 --- a/test/cpp-tableau-loader/src/protoconf/messager.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/messager.pc.h @@ -27,7 +27,7 @@ class Messager { static const std::string& Name() { return kEmpty; } const Stats& GetStats() { return stats_; } // Load fills message from file in the specified directory and format. - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) = 0; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) = 0; // Message returns the inner message data. virtual const google::protobuf::Message* Message() const { return nullptr; } // callback after all messagers loaded. diff --git a/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.cc b/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.cc index de89e988..22f8dc1d 100644 --- a/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.cc @@ -12,7 +12,7 @@ namespace tableau { const std::string PatchReplaceConf::kProtoName = "PatchReplaceConf"; -bool PatchReplaceConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool PatchReplaceConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; @@ -22,7 +22,7 @@ bool PatchReplaceConf::Load(const std::string& dir, Format fmt, const LoadOption const std::string PatchMergeConf::kProtoName = "PatchMergeConf"; -bool PatchMergeConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool PatchMergeConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; @@ -40,7 +40,7 @@ const protoconf::Item* PatchMergeConf::Get(uint32_t id) const { const std::string RecursivePatchConf::kProtoName = "RecursivePatchConf"; -bool RecursivePatchConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool RecursivePatchConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; diff --git a/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.h b/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.h index 44ed81cb..6f0c366a 100644 --- a/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/patch_conf.pc.h @@ -15,7 +15,7 @@ namespace tableau { class PatchReplaceConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::PatchReplaceConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } @@ -28,7 +28,7 @@ class PatchReplaceConf : public Messager { class PatchMergeConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::PatchMergeConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } @@ -43,7 +43,7 @@ class PatchMergeConf : public Messager { class RecursivePatchConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::RecursivePatchConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } diff --git a/test/cpp-tableau-loader/src/protoconf/test_conf.pc.cc b/test/cpp-tableau-loader/src/protoconf/test_conf.pc.cc index 1a8f8582..effa1bd9 100644 --- a/test/cpp-tableau-loader/src/protoconf/test_conf.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/test_conf.pc.cc @@ -12,7 +12,7 @@ namespace tableau { const std::string ActivityConf::kProtoName = "ActivityConf"; -bool ActivityConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool ActivityConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; @@ -240,7 +240,7 @@ const protoconf::Section::SectionItem* ActivityConf::FindFirstAward(uint32_t id) const std::string ChapterConf::kProtoName = "ChapterConf"; -bool ChapterConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool ChapterConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; @@ -258,7 +258,7 @@ const protoconf::ChapterConf::Chapter* ChapterConf::Get(uint64_t id) const { const std::string ThemeConf::kProtoName = "ThemeConf"; -bool ThemeConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool ThemeConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; @@ -288,7 +288,7 @@ const std::string* ThemeConf::Get(const std::string& name, const std::string& pa const std::string TaskConf::kProtoName = "TaskConf"; -bool TaskConf::Load(const std::string& dir, Format fmt, const LoadOptions* options /* = nullptr */) { +bool TaskConf::Load(const std::string& dir, Format fmt, std::shared_ptr options /* = nullptr */) { tableau::util::TimeProfiler profiler; bool loaded = LoadMessage(data_, dir, fmt, options); bool ok = loaded ? ProcessAfterLoad() : false; diff --git a/test/cpp-tableau-loader/src/protoconf/test_conf.pc.h b/test/cpp-tableau-loader/src/protoconf/test_conf.pc.h index 3947e957..09aeb632 100644 --- a/test/cpp-tableau-loader/src/protoconf/test_conf.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/test_conf.pc.h @@ -15,7 +15,7 @@ namespace tableau { class ActivityConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::ActivityConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } @@ -102,7 +102,7 @@ class ActivityConf : public Messager { class ChapterConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::ChapterConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } @@ -117,7 +117,7 @@ class ChapterConf : public Messager { class ThemeConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::ThemeConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } @@ -133,7 +133,7 @@ class ThemeConf : public Messager { class TaskConf : public Messager { public: static const std::string& Name() { return kProtoName; } - virtual bool Load(const std::string& dir, Format fmt, const LoadOptions* options = nullptr) override; + virtual bool Load(const std::string& dir, Format fmt, std::shared_ptr options = nullptr) override; const protoconf::TaskConf& Data() const { return data_; } const google::protobuf::Message* Message() const override { return &data_; } diff --git a/test/cpp-tableau-loader/src/protoconf/util.pc.cc b/test/cpp-tableau-loader/src/protoconf/util.pc.cc index 1e92f206..fb61f76e 100644 --- a/test/cpp-tableau-loader/src/protoconf/util.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/util.pc.cc @@ -138,7 +138,8 @@ const std::string& Format2Ext(Format fmt) { } } -bool JSON2Message(const std::string& json, google::protobuf::Message& msg, const LoadOptions* options /* = nullptr */) { +bool JSON2Message(const std::string& json, google::protobuf::Message& msg, + std::shared_ptr options /* = nullptr */) { google::protobuf::util::Status status; if (options != nullptr) { google::protobuf::util::JsonParseOptions parse_options; diff --git a/test/cpp-tableau-loader/src/protoconf/util.pc.h b/test/cpp-tableau-loader/src/protoconf/util.pc.h index 32b1b3d3..e6b70f90 100644 --- a/test/cpp-tableau-loader/src/protoconf/util.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/util.pc.h @@ -87,7 +87,8 @@ Format Ext2Format(const std::string& ext); // and the error message can be obtained by GetErrMsg(). const std::string& Format2Ext(Format fmt); -bool JSON2Message(const std::string& json, google::protobuf::Message& msg, const LoadOptions* options = nullptr); +bool JSON2Message(const std::string& json, google::protobuf::Message& msg, + std::shared_ptr options = nullptr); bool Text2Message(const std::string& text, google::protobuf::Message& msg); bool Bin2Message(const std::string& bin, google::protobuf::Message& msg); From 9bdd6a43a68d6e194179127da007a6fdc5b32f34 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Thu, 17 Jul 2025 14:33:26 +0800 Subject: [PATCH 08/12] feat: change Init func --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 9 ++------- test/cpp-tableau-loader/src/protoconf/hub.pc.cc | 7 +------ test/cpp-tableau-loader/src/protoconf/hub.pc.h | 2 +- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index d534e669..d003739e 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -173,7 +173,7 @@ class Hub { Hub(std::shared_ptr options = nullptr); // Init resets the hub's options. - void Init(MessagerContainerProvider provider, Filter filter = nullptr); + void Init(std::shared_ptr options); /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. @@ -302,12 +302,7 @@ Hub::Hub(std::shared_ptr options /* = nullptr */) tableau::Registry::Init(); } -void Hub::Init(MessagerContainerProvider provider, Filter filter /* = nullptr */) { - auto options = std::make_shared(); - options->filter = filter; - options->provider = provider; - options_ = options; -} +void Hub::Init(std::shared_ptr options) { options_ = options; } bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, std::shared_ptr options /* = nullptr */) { diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index 28448799..99af1d55 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -18,12 +18,7 @@ Hub::Hub(std::shared_ptr options /* = nullptr */) tableau::Registry::Init(); } -void Hub::Init(MessagerContainerProvider provider, Filter filter /* = nullptr */) { - auto options = std::make_shared(); - options->filter = filter; - options->provider = provider; - options_ = options; -} +void Hub::Init(std::shared_ptr options) { options_ = options; } bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, std::shared_ptr options /* = nullptr */) { diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 226e55d1..b843a8ee 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -38,7 +38,7 @@ class Hub { Hub(std::shared_ptr options = nullptr); // Init resets the hub's options. - void Init(MessagerContainerProvider provider, Filter filter = nullptr); + void Init(std::shared_ptr options); /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. From 6ee96ad880e8f2d41a2e6a5c5376f4e514f0692d Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Thu, 17 Jul 2025 16:04:48 +0800 Subject: [PATCH 09/12] feat: remove template examples --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 21 ++++++++++--------- test/cpp-tableau-loader/src/hub/hub.cpp | 21 ++++++++----------- test/cpp-tableau-loader/src/hub/hub.h | 17 +++------------ test/cpp-tableau-loader/src/main.cpp | 1 + .../src/protoconf/hub.pc.cc | 11 +++++----- .../cpp-tableau-loader/src/protoconf/hub.pc.h | 10 +++++---- 6 files changed, 35 insertions(+), 46 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index d003739e..31a7eedb 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -157,7 +157,7 @@ using MessagerMap = std::unordered_map>; // FilterFunc filter in messagers if returned value is true. // NOTE: name is the protobuf message name, e.g.: "message ItemConf{...}". using Filter = std::function; -using MessagerContainerProvider = std::function()>; +using MessagerContainerProvider = std::function(const Hub&)>; struct HubOptions { // Filter can only filter in certain specific messagers based on the @@ -170,10 +170,10 @@ struct HubOptions { class Hub { public: - Hub(std::shared_ptr options = nullptr); + Hub(); - // Init resets the hub's options. - void Init(std::shared_ptr options); + // InitOnce sets the hub's options. + void InitOnce(std::shared_ptr options); /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. @@ -225,6 +225,8 @@ class Hub { std::shared_ptr msger_container_; // Loading scheduler. internal::Scheduler* sched_ = nullptr; + // Init once + std::once_flag init_once_; // Hub options std::shared_ptr options_; }; @@ -297,12 +299,11 @@ namespace tableau { std::once_flag Registry::once; Registrar Registry::registrar; -Hub::Hub(std::shared_ptr options /* = nullptr */) - : msger_container_(std::make_shared()), options_(options) { - tableau::Registry::Init(); -} +Hub::Hub() { tableau::Registry::Init(); } -void Hub::Init(std::shared_ptr options) { options_ = options; } +void Hub::InitOnce(std::shared_ptr options) { + std::call_once(init_once_, [&]() { options_ = options; }); +} bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, std::shared_ptr options /* = nullptr */) { @@ -393,7 +394,7 @@ const std::shared_ptr Hub::GetMessager(const std::string& name) const std::shared_ptr Hub::GetMessagerContainerWithProvider() const { if (options_ != nullptr && options_->provider != nullptr) { - return options_->provider(); + return options_->provider(*this); } return msger_container_; } diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index 32942466..32da7f8c 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -17,27 +17,24 @@ void LogWrite(std::ostream* os, const tableau::log::SourceLocation& loc, const t // clang-format on } -bool DefaultHubOptions::Filter(const std::string& name) { +bool DefaultFilter(const std::string& name) { // all messagers return true; } -std::shared_ptr DefaultHubOptions::MessagerContainerProvider() { +std::shared_ptr DefaultMessagerContainerProvider(const tableau::Hub& hub) { // default messager container - return HubBase::Instance().GetMessagerContainer(); + return hub.GetMessagerContainer(); } -std::shared_ptr DefaultHubOptions::GetOptions() { - auto options = std::make_shared(); - options->filter = DefaultHubOptions::Filter; - options->provider = DefaultHubOptions::MessagerContainerProvider; - return options; -} - -void DefaultHubOptions::Init() { +void Hub::InitOnce() { // custom log tableau::log::DefaultLogger()->SetWriter(LogWrite); + auto options = std::make_shared(); + options->filter = DefaultFilter; + options->provider = DefaultMessagerContainerProvider; + tableau::Hub::InitOnce(options); InitCustomMessager(); } -void DefaultHubOptions::InitCustomMessager() { tableau::Registry::Register(); } \ No newline at end of file +void Hub::InitCustomMessager() { tableau::Registry::Register(); } \ No newline at end of file diff --git a/test/cpp-tableau-loader/src/hub/hub.h b/test/cpp-tableau-loader/src/hub/hub.h index 44c92216..e7ce98f7 100644 --- a/test/cpp-tableau-loader/src/hub/hub.h +++ b/test/cpp-tableau-loader/src/hub/hub.h @@ -27,21 +27,10 @@ class Singleton { Singleton() = default; }; -template -class HubBase : public tableau::Hub, public Singleton> { +class Hub : public tableau::Hub, public Singleton { public: - HubBase() : tableau::Hub(T::GetOptions()) { T::Init(); } -}; - -class DefaultHubOptions { - public: - static std::shared_ptr GetOptions(); - static void Init(); + void InitOnce(); private: - static bool Filter(const std::string& name); - static std::shared_ptr MessagerContainerProvider(); - static void InitCustomMessager(); + void InitCustomMessager(); }; - -using Hub = HubBase; diff --git a/test/cpp-tableau-loader/src/main.cpp b/test/cpp-tableau-loader/src/main.cpp index efa38d6d..71c3d5e8 100644 --- a/test/cpp-tableau-loader/src/main.cpp +++ b/test/cpp-tableau-loader/src/main.cpp @@ -121,6 +121,7 @@ bool TestPatch() { } int main() { + Hub::Instance().InitOnce(); auto options = std::make_shared(); options->ignore_unknown_fields = true; options->patch_dirs = {"../../testdata/patchconf/"}; diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index 99af1d55..5139de28 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -13,12 +13,11 @@ namespace tableau { std::once_flag Registry::once; Registrar Registry::registrar; -Hub::Hub(std::shared_ptr options /* = nullptr */) - : msger_container_(std::make_shared()), options_(options) { - tableau::Registry::Init(); -} +Hub::Hub() { tableau::Registry::Init(); } -void Hub::Init(std::shared_ptr options) { options_ = options; } +void Hub::InitOnce(std::shared_ptr options) { + std::call_once(init_once_, [&]() { options_ = options; }); +} bool Hub::Load(const std::string& dir, Format fmt /* = Format::kJSON */, std::shared_ptr options /* = nullptr */) { @@ -109,7 +108,7 @@ const std::shared_ptr Hub::GetMessager(const std::string& name) const std::shared_ptr Hub::GetMessagerContainerWithProvider() const { if (options_ != nullptr && options_->provider != nullptr) { - return options_->provider(); + return options_->provider(*this); } return msger_container_; } diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index b843a8ee..93a79200 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -22,7 +22,7 @@ using MessagerMap = std::unordered_map>; // FilterFunc filter in messagers if returned value is true. // NOTE: name is the protobuf message name, e.g.: "message ItemConf{...}". using Filter = std::function; -using MessagerContainerProvider = std::function()>; +using MessagerContainerProvider = std::function(const Hub&)>; struct HubOptions { // Filter can only filter in certain specific messagers based on the @@ -35,10 +35,10 @@ struct HubOptions { class Hub { public: - Hub(std::shared_ptr options = nullptr); + Hub(); - // Init resets the hub's options. - void Init(std::shared_ptr options); + // InitOnce sets the hub's options. + void InitOnce(std::shared_ptr options); /***** Synchronous Loading *****/ // Load fills messages (in MessagerContainer) from files in the specified directory and format. @@ -90,6 +90,8 @@ class Hub { std::shared_ptr msger_container_; // Loading scheduler. internal::Scheduler* sched_ = nullptr; + // Init once + std::once_flag init_once_; // Hub options std::shared_ptr options_; }; From e3a7cbd3b46a2fe2ad5a6627a1dac036dcc73ad5 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Thu, 17 Jul 2025 16:29:04 +0800 Subject: [PATCH 10/12] fix: filtered-out keys added to messager map --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 24 +++++++++++-------- cmd/protoc-gen-cpp-tableau-loader/shard.go | 2 +- test/cpp-tableau-loader/src/hub/hub.cpp | 4 ++-- .../src/protoconf/hub.pc.cc | 19 ++++++++------- .../cpp-tableau-loader/src/protoconf/hub.pc.h | 1 + .../src/protoconf/hub_shard0.pc.cc | 6 ++--- .../src/protoconf/hub_shard1.pc.cc | 14 +++++------ 7 files changed, 39 insertions(+), 31 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index 31a7eedb..856aa996 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -125,7 +125,7 @@ func generateHubCppTplSpec(g *protogen.GeneratedFile, protofiles []string, fileM func generateHubCppMsgContainerCtor(g *protogen.GeneratedFile, protofiles []string, fileMessagers map[string][]string) { for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { - g.P(helper.Indent(1), strcase.ToSnake(messager), "_ = std::dynamic_pointer_cast<", messager, `>((*msger_map_)["`, messager, `"]);`) + g.P(helper.Indent(1), strcase.ToSnake(messager), "_ = std::dynamic_pointer_cast<", messager, `>(GetMessager("`, messager, `"));`) } } } @@ -260,7 +260,8 @@ const msgContainerHpp = `class MessagerContainer { std::shared_ptr msger_map_; std::time_t last_loaded_time_; - private:` + private: + const std::shared_ptr GetMessager(const std::string& name) const;` const registryHpp = `}; @@ -382,14 +383,7 @@ void Hub::SetMessagerMap(std::shared_ptr msger_map) { } const std::shared_ptr Hub::GetMessager(const std::string& name) const { - auto msger_map = GetMessagerMap(); - if (msger_map) { - auto it = msger_map->find(name); - if (it != msger_map->end()) { - return it->second; - } - } - return nullptr; + return GetMessagerContainerWithProvider()->GetMessager(name); } std::shared_ptr Hub::GetMessagerContainerWithProvider() const { @@ -425,6 +419,16 @@ MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = const registryCpp = `} +const std::shared_ptr MessagerContainer::GetMessager(const std::string& name) const { + if (msger_map_) { + auto it = msger_map_->find(name); + if (it != msger_map_->end()) { + return it->second; + } + } + return nullptr; +} + void Registry::Init() { std::call_once(once, []() {` diff --git a/cmd/protoc-gen-cpp-tableau-loader/shard.go b/cmd/protoc-gen-cpp-tableau-loader/shard.go index 14bc73c0..b1e0aeb7 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/shard.go +++ b/cmd/protoc-gen-cpp-tableau-loader/shard.go @@ -109,7 +109,7 @@ func generateShardedHubCppFileContent(g *protogen.GeneratedFile, shardIndex int, g.P("void MessagerContainer::InitShard", shardIndex, "() {") for _, proto := range protofiles { for _, messager := range fileMessagers[proto] { - g.P(helper.Indent(1), strcase.ToSnake(messager), "_ = std::dynamic_pointer_cast<", messager, `>((*msger_map_)["`, messager, `"]);`) + g.P(helper.Indent(1), strcase.ToSnake(messager), "_ = std::dynamic_pointer_cast<", messager, `>(GetMessager("`, messager, `"));`) } } g.P("}") diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index 32da7f8c..ea1660d6 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -18,8 +18,8 @@ void LogWrite(std::ostream* os, const tableau::log::SourceLocation& loc, const t } bool DefaultFilter(const std::string& name) { - // all messagers - return true; + // all messagers except TaskConf + return name != "TaskConf"; } std::shared_ptr DefaultMessagerContainerProvider(const tableau::Hub& hub) { diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc index 5139de28..77e2d003 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.cc @@ -96,14 +96,7 @@ void Hub::SetMessagerMap(std::shared_ptr msger_map) { } const std::shared_ptr Hub::GetMessager(const std::string& name) const { - auto msger_map = GetMessagerMap(); - if (msger_map) { - auto it = msger_map->find(name); - if (it != msger_map->end()) { - return it->second; - } - } - return nullptr; + return GetMessagerContainerWithProvider()->GetMessager(name); } std::shared_ptr Hub::GetMessagerContainerWithProvider() const { @@ -139,6 +132,16 @@ MessagerContainer::MessagerContainer(std::shared_ptr msger_map /* = InitShard1(); } +const std::shared_ptr MessagerContainer::GetMessager(const std::string& name) const { + if (msger_map_) { + auto it = msger_map_->find(name); + if (it != msger_map_->end()) { + return it->second; + } + } + return nullptr; +} + void Registry::Init() { std::call_once(once, []() { InitShard0(); diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 93a79200..770abb7b 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -165,6 +165,7 @@ class MessagerContainer { std::time_t last_loaded_time_; private: + const std::shared_ptr GetMessager(const std::string& name) const; void InitShard0(); void InitShard1(); diff --git a/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc index 09b17922..d7fbeb61 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub_shard0.pc.cc @@ -25,9 +25,9 @@ const std::shared_ptr Hub::Get() const { } void MessagerContainer::InitShard0() { - hero_base_conf_ = std::dynamic_pointer_cast((*msger_map_)["HeroBaseConf"]); - hero_conf_ = std::dynamic_pointer_cast((*msger_map_)["HeroConf"]); - item_conf_ = std::dynamic_pointer_cast((*msger_map_)["ItemConf"]); + hero_base_conf_ = std::dynamic_pointer_cast(GetMessager("HeroBaseConf")); + hero_conf_ = std::dynamic_pointer_cast(GetMessager("HeroConf")); + item_conf_ = std::dynamic_pointer_cast(GetMessager("ItemConf")); } void Registry::InitShard0() { diff --git a/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc b/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc index dcab9ee0..e063eeeb 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc +++ b/test/cpp-tableau-loader/src/protoconf/hub_shard1.pc.cc @@ -45,13 +45,13 @@ const std::shared_ptr Hub::Get() const { } void MessagerContainer::InitShard1() { - patch_merge_conf_ = std::dynamic_pointer_cast((*msger_map_)["PatchMergeConf"]); - patch_replace_conf_ = std::dynamic_pointer_cast((*msger_map_)["PatchReplaceConf"]); - recursive_patch_conf_ = std::dynamic_pointer_cast((*msger_map_)["RecursivePatchConf"]); - activity_conf_ = std::dynamic_pointer_cast((*msger_map_)["ActivityConf"]); - chapter_conf_ = std::dynamic_pointer_cast((*msger_map_)["ChapterConf"]); - task_conf_ = std::dynamic_pointer_cast((*msger_map_)["TaskConf"]); - theme_conf_ = std::dynamic_pointer_cast((*msger_map_)["ThemeConf"]); + patch_merge_conf_ = std::dynamic_pointer_cast(GetMessager("PatchMergeConf")); + patch_replace_conf_ = std::dynamic_pointer_cast(GetMessager("PatchReplaceConf")); + recursive_patch_conf_ = std::dynamic_pointer_cast(GetMessager("RecursivePatchConf")); + activity_conf_ = std::dynamic_pointer_cast(GetMessager("ActivityConf")); + chapter_conf_ = std::dynamic_pointer_cast(GetMessager("ChapterConf")); + task_conf_ = std::dynamic_pointer_cast(GetMessager("TaskConf")); + theme_conf_ = std::dynamic_pointer_cast(GetMessager("ThemeConf")); } void Registry::InitShard1() { From 0da57b5dd064368fe8e91c35212b6104de19c032 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Fri, 18 Jul 2025 10:42:19 +0800 Subject: [PATCH 11/12] feat: update notes --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 2 +- test/cpp-tableau-loader/src/hub/hub.cpp | 2 ++ test/cpp-tableau-loader/src/protoconf/hub.pc.h | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index 856aa996..12f615cc 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -172,7 +172,7 @@ class Hub { public: Hub(); - // InitOnce sets the hub's options. + // InitOnce inits the hub only once, and the subsequent calls will not take effect. void InitOnce(std::shared_ptr options); /***** Synchronous Loading *****/ diff --git a/test/cpp-tableau-loader/src/hub/hub.cpp b/test/cpp-tableau-loader/src/hub/hub.cpp index ea1660d6..1df497f7 100644 --- a/test/cpp-tableau-loader/src/hub/hub.cpp +++ b/test/cpp-tableau-loader/src/hub/hub.cpp @@ -30,10 +30,12 @@ std::shared_ptr DefaultMessagerContainerProvider(con void Hub::InitOnce() { // custom log tableau::log::DefaultLogger()->SetWriter(LogWrite); + // call base hub's InitOnce auto options = std::make_shared(); options->filter = DefaultFilter; options->provider = DefaultMessagerContainerProvider; tableau::Hub::InitOnce(options); + // register custom messagers InitCustomMessager(); } diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 770abb7b..6ee8b95a 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -37,7 +37,7 @@ class Hub { public: Hub(); - // InitOnce sets the hub's options. + // InitOnce inits the hub only once, and the subsequent calls will not take effect. void InitOnce(std::shared_ptr options); /***** Synchronous Loading *****/ From fda1d75332f643d0c998a0f1e98da02bba0522b1 Mon Sep 17 00:00:00 2001 From: Kybxd <627940450@qq.com> Date: Fri, 18 Jul 2025 11:11:45 +0800 Subject: [PATCH 12/12] feat: update notes --- cmd/protoc-gen-cpp-tableau-loader/hub.go | 3 +++ test/cpp-tableau-loader/src/protoconf/hub.pc.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/cmd/protoc-gen-cpp-tableau-loader/hub.go b/cmd/protoc-gen-cpp-tableau-loader/hub.go index 12f615cc..5e0e468e 100644 --- a/cmd/protoc-gen-cpp-tableau-loader/hub.go +++ b/cmd/protoc-gen-cpp-tableau-loader/hub.go @@ -157,6 +157,9 @@ using MessagerMap = std::unordered_map>; // FilterFunc filter in messagers if returned value is true. // NOTE: name is the protobuf message name, e.g.: "message ItemConf{...}". using Filter = std::function; +// MessagerContainerProvider provides a custom MessagerContainer for hub. +// If not specified, the hub's default MessagerContainer will be used. +// NOTE: This func must return non-nil MessagerContainer. using MessagerContainerProvider = std::function(const Hub&)>; struct HubOptions { diff --git a/test/cpp-tableau-loader/src/protoconf/hub.pc.h b/test/cpp-tableau-loader/src/protoconf/hub.pc.h index 6ee8b95a..bde26d02 100644 --- a/test/cpp-tableau-loader/src/protoconf/hub.pc.h +++ b/test/cpp-tableau-loader/src/protoconf/hub.pc.h @@ -22,6 +22,9 @@ using MessagerMap = std::unordered_map>; // FilterFunc filter in messagers if returned value is true. // NOTE: name is the protobuf message name, e.g.: "message ItemConf{...}". using Filter = std::function; +// MessagerContainerProvider provides a custom MessagerContainer for hub. +// If not specified, the hub's default MessagerContainer will be used. +// NOTE: This func must return non-nil MessagerContainer. using MessagerContainerProvider = std::function(const Hub&)>; struct HubOptions {