From 1e8d5cbb1eb647861476630bcd1e0b5bd37a1b9d Mon Sep 17 00:00:00 2001 From: Lucas Czech Date: Wed, 30 Jul 2025 14:28:43 +0200 Subject: [PATCH] Allow multiple add ons for the same class or namespace --- source/class.cpp | 8 ++++++-- source/config.cpp | 4 ++-- source/config.hpp | 10 ++++++---- source/context.cpp | 8 +++++--- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/source/class.cpp b/source/class.cpp index 2963d6d7..3aa94e35 100644 --- a/source/class.cpp +++ b/source/class.cpp @@ -1407,8 +1407,12 @@ void ClassBinder::bind(Context &context) c += bind_repr(context, Config::get()); - std::map const &external_add_on_binders = Config::get().add_on_binders(); - if( external_add_on_binders.count(qualified_name_without_template) ) c += "\n\t{}(cl);\n"_format(external_add_on_binders.at(qualified_name_without_template)); + std::map> const &external_add_on_binders = Config::get().add_on_binders(); + if( external_add_on_binders.count(qualified_name_without_template) ) { + for( auto const& add_on : external_add_on_binders.at(qualified_name_without_template) ) { + c += "\n\t{}(cl);\n"_format(add_on); + } + } c += bind_nested_classes(context); diff --git a/source/config.cpp b/source/config.cpp index 4c70aa9c..c38f51e0 100644 --- a/source/config.cpp +++ b/source/config.cpp @@ -196,7 +196,7 @@ void Config::read(string const &file_name) if( bind ) { auto binder_function = split_in_two(name, "Invalid line for add_on_binder specification! Must be: name_of_type + + name_of_binder. Got: " + line); - add_on_binders_[binder_function.first] = trim(binder_function.second); + add_on_binders_[binder_function.first].push_back(trim(binder_function.second)); } } else if( token == _binder_for_namespace_ ) { @@ -210,7 +210,7 @@ void Config::read(string const &file_name) if( bind ) { auto binder_function = split_in_two(name, "Invalid line for add_on_binder_for_namespace specification! Must be: name_of_type + + name_of_binder. Got: " + line); - add_on_binder_for_namespaces_[binder_function.first] = trim(binder_function.second); + add_on_binder_for_namespaces_[binder_function.first].push_back(trim(binder_function.second)); } } else if ( token == _field_ ) { diff --git a/source/config.hpp b/source/config.hpp index 0c6da2f7..092d4d1e 100644 --- a/source/config.hpp +++ b/source/config.hpp @@ -38,8 +38,10 @@ class Config } private: - std::map binders_, add_on_binders_; - std::map binder_for_namespaces_, add_on_binder_for_namespaces_, custom_trampoline_functions_; + + std::map binders_, binder_for_namespaces_; + std::map> add_on_binders_, add_on_binder_for_namespaces_; + std::map custom_trampoline_functions_; std::map > class_includes_, namespace_includes_; @@ -69,10 +71,10 @@ class Config std::vector buffer_protocols, module_local_namespaces_to_add, module_local_namespaces_to_skip, smart_held_classes; std::map const &binders() const { return binders_; } - std::map const &add_on_binders() const { return add_on_binders_; } + std::map> const &add_on_binders() const { return add_on_binders_; } std::map const &binder_for_namespaces() const { return binder_for_namespaces_; } - std::map const &add_on_binder_for_namespaces() const { return add_on_binder_for_namespaces_; } + std::map> const &add_on_binder_for_namespaces() const { return add_on_binder_for_namespaces_; } std::set python_builtins, not_python_builtins; diff --git a/source/context.cpp b/source/context.cpp index 901750a0..602d570e 100644 --- a/source/context.cpp +++ b/source/context.cpp @@ -387,9 +387,11 @@ void Context::generate(Config const &config) skip = true; } - std::map const &add_on_binder_for_namespaces = Config::get().add_on_binder_for_namespaces(); - if( add_on_binder_for_namespaces.count(namespace_) and code.empty() ) { - if( namespace_entrance[namespace_] == 0 ) code += "\n\t{}(M(\"{}\"));\n"_format(add_on_binder_for_namespaces.at(namespace_), namespace_); + std::map> const &add_on_binder_for_namespaces = Config::get().add_on_binder_for_namespaces(); + if( add_on_binder_for_namespaces.count(namespace_) and code.empty() and namespace_entrance[namespace_] == 0 ) { + for( auto const& add_on : add_on_binder_for_namespaces.at(namespace_) ) { + code += "\n\t{}(M(\"{}\"));\n"_format(add_on, namespace_); + } } for( ; code.size() < config.maximum_file_length and i < binders.size() and namespace_ == namespace_from_named_decl(binders[i]->named_decl()); ++i ) {