visit functions for registry

This commit is contained in:
BlackMATov
2021-07-05 22:01:08 +07:00
parent 88c3bf4eb2
commit 5e10b46f08

View File

@@ -24,43 +24,102 @@ namespace meta_hpp
template < typename T > template < typename T >
std::optional<type> resolve() const { std::optional<type> resolve() const {
const family_id fid = get_type_family_id<T>(); const family_id fid = get_type_family_id<T>();
return detail::find_opt(family_to_types_, fid); return detail::find_opt(types_, fid);
} }
template < auto T > template < auto T >
std::optional<type> resolve() const { std::optional<type> resolve() const {
const family_id fid = get_value_family_id<T>(); const family_id fid = get_value_family_id<T>();
return detail::find_opt(family_to_types_, fid); return detail::find_opt(types_, fid);
} }
template < typename T > template < typename T >
std::optional<type> resolve(T&&) const { std::optional<type> resolve(T&&) const {
const family_id fid = get_type_family_id<std::decay_t<T>>(); const family_id fid = get_type_family_id<std::decay_t<T>>();
return detail::find_opt(family_to_types_, fid); return detail::find_opt(types_, fid);
} }
std::optional<class_info> get_class_by_name(std::string_view name) const { std::optional<class_info> get_class_by_name(std::string_view name) const {
return detail::find_opt(name_to_classes_, name); return detail::find_opt(classes_, name);
} }
std::optional<field_info> get_field_by_name(std::string_view name) const { std::optional<field_info> get_field_by_name(std::string_view name) const {
return detail::find_opt(name_to_fields_, name); return detail::find_opt(fields_, name);
} }
std::optional<function_info> get_function_by_name(std::string_view name) const { std::optional<function_info> get_function_by_name(std::string_view name) const {
return detail::find_opt(name_to_functions_, name); return detail::find_opt(functions_, name);
} }
std::optional<method_info> get_method_by_name(std::string_view name) const { std::optional<method_info> get_method_by_name(std::string_view name) const {
return detail::find_opt(name_to_methods_, name); return detail::find_opt(methods_, name);
} }
std::optional<namespace_info> get_namespace_by_name(std::string_view name) const { std::optional<namespace_info> get_namespace_by_name(std::string_view name) const {
return detail::find_opt(name_to_namespaces_, name); return detail::find_opt(namespaces_, name);
} }
std::optional<variable_info> get_variable_by_name(std::string_view name) const { std::optional<variable_info> get_variable_by_name(std::string_view name) const {
return detail::find_opt(name_to_variables_, name); return detail::find_opt(variables_, name);
}
template < typename F >
void each_type(F&& f) const {
for ( auto&& id_type : types_ ) {
std::invoke(f, id_type.second);
}
}
template < typename F >
void each_class(F&& f) const {
for ( auto&& id_info : classes_ ) {
std::invoke(f, id_info.second);
}
}
template < typename F >
void each_field(F&& f) const {
for ( auto&& id_info : fields_ ) {
std::invoke(f, id_info.second);
}
}
template < typename F >
void each_function(F&& f) const {
for ( auto&& id_info : functions_ ) {
std::invoke(f, id_info.second);
}
}
template < typename F >
void each_method(F&& f) const {
for ( auto&& id_info : methods_ ) {
std::invoke(f, id_info.second);
}
}
template < typename F >
void each_namespace(F&& f) const {
for ( auto&& id_info : namespaces_ ) {
std::invoke(f, id_info.second);
}
}
template < typename F >
void each_variable(F&& f) const {
for ( auto&& id_info : variables_ ) {
std::invoke(f, id_info.second);
}
}
template < typename F >
void visit(F&& f) const {
each_class(f);
each_field(f);
each_function(f);
each_method(f);
each_namespace(f);
each_variable(f);
} }
template < typename... Internals > template < typename... Internals >
@@ -74,8 +133,8 @@ namespace meta_hpp
? info.id() ? info.id()
: prefix + "::" + info.id(); : prefix + "::" + info.id();
detail::merge_with(name_to_classes_, name, info, &class_info::merge); detail::merge_with(types_, info.fid(), info, &type::merge);
detail::merge_with(family_to_types_, info.fid(), info, &type::merge); detail::merge_with(classes_, name, info, &class_info::merge);
info.visit(overloaded { info.visit(overloaded {
[](const data_info&) {}, [](const data_info&) {},
@@ -90,8 +149,8 @@ namespace meta_hpp
? info.id() ? info.id()
: prefix + "::" + info.id(); : prefix + "::" + info.id();
detail::merge_with(name_to_fields_, name, info, &field_info::merge); detail::merge_with(types_, info.fid(), info, &type::merge);
detail::merge_with(family_to_types_, info.fid(), info, &type::merge); detail::merge_with(fields_, name, info, &field_info::merge);
info.visit(overloaded { info.visit(overloaded {
[](const data_info&) {}, [](const data_info&) {},
@@ -106,8 +165,8 @@ namespace meta_hpp
? info.id() ? info.id()
: prefix + "::" + info.id(); : prefix + "::" + info.id();
detail::merge_with(name_to_functions_, name, info, &function_info::merge); detail::merge_with(types_, info.fid(), info, &type::merge);
detail::merge_with(family_to_types_, info.fid(), info, &type::merge); detail::merge_with(functions_, name, info, &function_info::merge);
info.visit(overloaded { info.visit(overloaded {
[](const data_info&) {}, [](const data_info&) {},
@@ -122,8 +181,8 @@ namespace meta_hpp
? info.id() ? info.id()
: prefix + "::" + info.id(); : prefix + "::" + info.id();
detail::merge_with(name_to_methods_, name, info, &method_info::merge); detail::merge_with(types_, info.fid(), info, &type::merge);
detail::merge_with(family_to_types_, info.fid(), info, &type::merge); detail::merge_with(methods_, name, info, &method_info::merge);
info.visit(overloaded { info.visit(overloaded {
[](const data_info&) {}, [](const data_info&) {},
@@ -138,7 +197,7 @@ namespace meta_hpp
? info.id() ? info.id()
: prefix + "::" + info.id(); : prefix + "::" + info.id();
detail::merge_with(name_to_namespaces_, name, info, &namespace_info::merge); detail::merge_with(namespaces_, name, info, &namespace_info::merge);
info.visit(overloaded { info.visit(overloaded {
[](const data_info&) {}, [](const data_info&) {},
@@ -153,8 +212,8 @@ namespace meta_hpp
? info.id() ? info.id()
: prefix + "::" + info.id(); : prefix + "::" + info.id();
detail::merge_with(name_to_variables_, name, info, &variable_info::merge); detail::merge_with(types_, info.fid(), info, &type::merge);
detail::merge_with(family_to_types_, info.fid(), info, &type::merge); detail::merge_with(variables_, name, info, &variable_info::merge);
info.visit(overloaded { info.visit(overloaded {
[](const data_info&) {}, [](const data_info&) {},
@@ -164,12 +223,12 @@ namespace meta_hpp
}); });
} }
private: private:
std::map<family_id, type, std::less<>> family_to_types_; std::map<family_id, type, std::less<>> types_;
std::map<std::string, class_info, std::less<>> name_to_classes_; std::map<std::string, class_info, std::less<>> classes_;
std::map<std::string, field_info, std::less<>> name_to_fields_; std::map<std::string, field_info, std::less<>> fields_;
std::map<std::string, function_info, std::less<>> name_to_functions_; std::map<std::string, function_info, std::less<>> functions_;
std::map<std::string, method_info, std::less<>> name_to_methods_; std::map<std::string, method_info, std::less<>> methods_;
std::map<std::string, namespace_info, std::less<>> name_to_namespaces_; std::map<std::string, namespace_info, std::less<>> namespaces_;
std::map<std::string, variable_info, std::less<>> name_to_variables_; std::map<std::string, variable_info, std::less<>> variables_;
}; };
} }