From 0d17759942583f7570e81dea40066d848fbfd1f0 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 1 Jul 2021 01:44:41 +0700 Subject: [PATCH] foreach by info internals --- headers/meta.hpp/meta_class_info.hpp | 42 ++++++++++++++++++++++++ headers/meta.hpp/meta_data_info.hpp | 7 ++++ headers/meta.hpp/meta_field_info.hpp | 7 ++++ headers/meta.hpp/meta_function_info.hpp | 7 ++++ headers/meta.hpp/meta_method_info.hpp | 7 ++++ headers/meta.hpp/meta_namespace_info.hpp | 36 ++++++++++++++++++++ headers/meta.hpp/meta_variable_info.hpp | 7 ++++ 7 files changed, 113 insertions(+) diff --git a/headers/meta.hpp/meta_class_info.hpp b/headers/meta.hpp/meta_class_info.hpp index 46cc4c5..6f3ea3b 100644 --- a/headers/meta.hpp/meta_class_info.hpp +++ b/headers/meta.hpp/meta_class_info.hpp @@ -34,6 +34,48 @@ namespace meta_hpp return id_; } + template < typename F > + void each_class(F&& f) const { + for ( auto [_, info] : classes_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_field(F&& f) const { + for ( auto [_, info] : fields_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_function(F&& f) const { + for ( auto [_, info] : functions_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_method(F&& f) const { + for ( auto [_, info] : methods_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_variable(F&& f) const { + for ( auto [_, info] : variables_ ) { + std::invoke(f, info); + } + } + std::optional get_class(std::string_view id) const { return detail::find_opt(classes_, id); } diff --git a/headers/meta.hpp/meta_data_info.hpp b/headers/meta.hpp/meta_data_info.hpp index 0c26133..e86aa82 100644 --- a/headers/meta.hpp/meta_data_info.hpp +++ b/headers/meta.hpp/meta_data_info.hpp @@ -33,6 +33,13 @@ namespace meta_hpp return value_; } + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + std::optional get_data(std::string_view id) const { return detail::find_opt(datas_, id); } diff --git a/headers/meta.hpp/meta_field_info.hpp b/headers/meta.hpp/meta_field_info.hpp index 8a0a57e..3099767 100644 --- a/headers/meta.hpp/meta_field_info.hpp +++ b/headers/meta.hpp/meta_field_info.hpp @@ -83,6 +83,13 @@ namespace meta_hpp return setter_(instance, std::forward(value)); } + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + std::optional get_data(std::string_view id) const { return detail::find_opt(datas_, id); } diff --git a/headers/meta.hpp/meta_function_info.hpp b/headers/meta.hpp/meta_function_info.hpp index c208022..b1b66e8 100644 --- a/headers/meta.hpp/meta_function_info.hpp +++ b/headers/meta.hpp/meta_function_info.hpp @@ -88,6 +88,13 @@ namespace meta_hpp return invoke_(vargs.data(), vargs.size()); } + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + std::optional get_data(std::string_view id) const { return detail::find_opt(datas_, id); } diff --git a/headers/meta.hpp/meta_method_info.hpp b/headers/meta.hpp/meta_method_info.hpp index 9d3758c..106ca97 100644 --- a/headers/meta.hpp/meta_method_info.hpp +++ b/headers/meta.hpp/meta_method_info.hpp @@ -150,6 +150,13 @@ namespace meta_hpp return cinvoke_(instance, vargs.data(), vargs.size()); } + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + std::optional get_data(std::string_view id) const { return detail::find_opt(datas_, id); } diff --git a/headers/meta.hpp/meta_namespace_info.hpp b/headers/meta.hpp/meta_namespace_info.hpp index cec5528..c8a11f5 100644 --- a/headers/meta.hpp/meta_namespace_info.hpp +++ b/headers/meta.hpp/meta_namespace_info.hpp @@ -32,6 +32,42 @@ namespace meta_hpp const std::string& id() const noexcept { return id_; } + + template < typename F > + void each_class(F&& f) const { + for ( auto [_, info] : classes_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_function(F&& f) const { + for ( auto [_, info] : functions_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_namespace(F&& f) const { + for ( auto [_, info] : namespaces_ ) { + std::invoke(f, info); + } + } + + template < typename F > + void each_variable(F&& f) const { + for ( auto [_, info] : variables_ ) { + std::invoke(f, info); + } + } + std::optional get_class(std::string_view id) const { return detail::find_opt(classes_, id); } diff --git a/headers/meta.hpp/meta_variable_info.hpp b/headers/meta.hpp/meta_variable_info.hpp index 96e0486..c385e89 100644 --- a/headers/meta.hpp/meta_variable_info.hpp +++ b/headers/meta.hpp/meta_variable_info.hpp @@ -78,6 +78,13 @@ namespace meta_hpp return setter_(std::forward(value)); } + template < typename F > + void each_data(F&& f) const { + for ( auto [_, info] : datas_ ) { + std::invoke(f, info); + } + } + std::optional get_data(std::string_view id) const { return detail::find_opt(datas_, id); }