diff --git a/src/entt/meta/container.hpp b/src/entt/meta/container.hpp index 4f0b04cd1..9531fa4d9 100644 --- a/src/entt/meta/container.hpp +++ b/src/entt/meta/container.hpp @@ -44,10 +44,23 @@ struct reserve_aware_container: std::false_type {}; template struct reserve_aware_container>: std::true_type {}; +} // namespace internal + +/** + * Internal details not to be documented. + * @endcond + */ + +/** + * @brief General purpose implementation of meta sequence container traits. + * @tparam Type Type of underlying sequence container. + */ template -struct basic_meta_sequence_container_traits { +class basic_meta_sequence_container_traits { static_assert(std::is_same_v>>, "Unexpected type"); + friend meta_sequence_container; + using operation = internal::meta_container_operation; using size_type = typename meta_sequence_container::size_type; using iterator = typename meta_sequence_container::iterator; @@ -57,21 +70,21 @@ struct basic_meta_sequence_container_traits { case operation::size: return static_cast(cvalue)->size(); case operation::clear: - if constexpr(dynamic_sequence_container::value) { + if constexpr(internal::dynamic_sequence_container::value) { static_cast(value)->clear(); return true; } else { break; } case operation::reserve: - if constexpr(reserve_aware_container::value) { + if constexpr(internal::reserve_aware_container::value) { static_cast(value)->reserve(*static_cast(cvalue)); return true; } else { break; } case operation::resize: - if constexpr(dynamic_sequence_container::value) { + if constexpr(internal::dynamic_sequence_container::value) { static_cast(value)->resize(*static_cast(cvalue)); return true; } else { @@ -95,7 +108,7 @@ struct basic_meta_sequence_container_traits { return true; case operation::insert: case operation::erase: - if constexpr(dynamic_sequence_container::value) { + if constexpr(internal::dynamic_sequence_container::value) { auto *const non_const = any_cast(&it->base()); typename Type::const_iterator underlying{non_const ? *non_const : any_cast(it->base())}; @@ -122,16 +135,22 @@ struct basic_meta_sequence_container_traits { } }; +/** + * @brief General purpose implementation of meta associative container traits. + * @tparam Type Type of underlying associative container. + */ template -struct basic_meta_associative_container_traits { +class basic_meta_associative_container_traits { static_assert(std::is_same_v>>, "Unexpected type"); + friend meta_associative_container; + + static constexpr auto key_only = internal::key_only_associative_container::value; + using operation = internal::meta_container_operation; using size_type = typename meta_associative_container::size_type; using iterator = typename meta_associative_container::iterator; - static constexpr auto key_only = key_only_associative_container::value; - static size_type basic_vtable(const operation op, const meta_ctx &ctx, const void *cvalue, void *value, meta_any *key, iterator *it) { switch(op) { case operation::size: @@ -140,7 +159,7 @@ struct basic_meta_associative_container_traits { static_cast(value)->clear(); return true; case operation::reserve: - if constexpr(reserve_aware_container::value) { + if constexpr(internal::reserve_aware_container::value) { static_cast(value)->reserve(*static_cast(cvalue)); return true; } else { @@ -200,20 +219,13 @@ struct basic_meta_associative_container_traits { } }; -} // namespace internal - -/** - * Internal details not to be documented. - * @endcond - */ - /** * @brief Meta sequence container traits for `std::vector`s of any type. * @tparam Args Template arguments for the container. */ template struct meta_sequence_container_traits> - : internal::basic_meta_sequence_container_traits> {}; + : basic_meta_sequence_container_traits> {}; /** * @brief Meta sequence container traits for `std::array`s of any type. @@ -222,7 +234,7 @@ struct meta_sequence_container_traits> */ template struct meta_sequence_container_traits> - : internal::basic_meta_sequence_container_traits> {}; + : basic_meta_sequence_container_traits> {}; /** * @brief Meta sequence container traits for `std::list`s of any type. @@ -230,7 +242,7 @@ struct meta_sequence_container_traits> */ template struct meta_sequence_container_traits> - : internal::basic_meta_sequence_container_traits> {}; + : basic_meta_sequence_container_traits> {}; /** * @brief Meta sequence container traits for `std::deque`s of any type. @@ -238,7 +250,7 @@ struct meta_sequence_container_traits> */ template struct meta_sequence_container_traits> - : internal::basic_meta_sequence_container_traits> {}; + : basic_meta_sequence_container_traits> {}; /** * @brief Meta associative container traits for `std::map`s of any type. @@ -246,7 +258,7 @@ struct meta_sequence_container_traits> */ template struct meta_associative_container_traits> - : internal::basic_meta_associative_container_traits> {}; + : basic_meta_associative_container_traits> {}; /** * @brief Meta associative container traits for `std::unordered_map`s of any @@ -255,7 +267,7 @@ struct meta_associative_container_traits> */ template struct meta_associative_container_traits> - : internal::basic_meta_associative_container_traits> {}; + : basic_meta_associative_container_traits> {}; /** * @brief Meta associative container traits for `std::set`s of any type. @@ -263,7 +275,7 @@ struct meta_associative_container_traits> */ template struct meta_associative_container_traits> - : internal::basic_meta_associative_container_traits> {}; + : basic_meta_associative_container_traits> {}; /** * @brief Meta associative container traits for `std::unordered_set`s of any @@ -272,7 +284,7 @@ struct meta_associative_container_traits> */ template struct meta_associative_container_traits> - : internal::basic_meta_associative_container_traits> {}; + : basic_meta_associative_container_traits> {}; /** * @brief Meta associative container traits for `dense_map`s of any type. @@ -280,7 +292,7 @@ struct meta_associative_container_traits> */ template struct meta_associative_container_traits> - : internal::basic_meta_associative_container_traits> {}; + : basic_meta_associative_container_traits> {}; /** * @brief Meta associative container traits for `dense_set`s of any type. @@ -288,7 +300,7 @@ struct meta_associative_container_traits> */ template struct meta_associative_container_traits> - : internal::basic_meta_associative_container_traits> {}; + : basic_meta_associative_container_traits> {}; } // namespace entt