Browse Source

meta: deprecate meta properties in favor of custom data

Michele Caini 1 year ago
parent
commit
e4ba5c31d2
4 changed files with 9 additions and 61 deletions
  1. 0 1
      TODO
  2. 1 52
      docs/md/meta.md
  3. 1 1
      src/entt/meta/factory.hpp
  4. 7 7
      src/entt/meta/meta.hpp

+ 0 - 1
TODO

@@ -32,7 +32,6 @@ TODO:
 * cleanup common view from tricks to handle single swap-only and in-place, if constexpr branches
 * cleanup common view from tricks to handle single swap-only and in-place, if constexpr branches
 * entity based component_traits
 * entity based component_traits
 * review cmake warning about FetchContent_Populate (need .28 and EXCLUDE_FROM_ALL for FetchContent)
 * review cmake warning about FetchContent_Populate (need .28 and EXCLUDE_FROM_ALL for FetchContent)
-* deprecate meta properties in favor of custom data
 * make meta objects safe to use with null nodes
 * make meta objects safe to use with null nodes
 * suppress -Wself-move on CI with g++13
 * suppress -Wself-move on CI with g++13
 * view and view iterator specializations for multi, single and filtered elements
 * view and view iterator specializations for multi, single and filtered elements

+ 1 - 52
docs/md/meta.md

@@ -16,7 +16,6 @@
   * [Policies: the more, the less](#policies-the-more-the-less)
   * [Policies: the more, the less](#policies-the-more-the-less)
   * [Named constants and enums](#named-constants-and-enums)
   * [Named constants and enums](#named-constants-and-enums)
   * [User defined data](#user-defined-data)
   * [User defined data](#user-defined-data)
-    * [Properties and meta objects](#properties-and-meta-objects)
     * [Traits](#traits)
     * [Traits](#traits)
     * [Custom data](#custom-data)
     * [Custom data](#custom-data)
   * [Unregister types](#unregister-types)
   * [Unregister types](#unregister-types)
@@ -841,15 +840,10 @@ object optimization performed by the `meta_any` class.
 ## User defined data
 ## User defined data
 
 
 Sometimes (for example, when it comes to creating an editor) it might be useful
 Sometimes (for example, when it comes to creating an editor) it might be useful
-to attach _properties_, _traits_ or arbitrary _custom data_ to the meta objects
-created.
+to attach _traits_ or arbitrary _custom data_ to the meta objects created.
 
 
 The main difference between them is that:
 The main difference between them is that:
 
 
-* Properties are usually key-only or key-value pairs with lower access
-  performance. They are deprecated today but have long been the only way to
-  bind user data with meta objects.
-
 * Traits are simple user-defined flags with much higher access performance. The
 * Traits are simple user-defined flags with much higher access performance. The
   library reserves up to 16 bits for traits, that is 16 flags for a bitmask or
   library reserves up to 16 bits for traits, that is 16 flags for a bitmask or
   2^16 values otherwise.
   2^16 values otherwise.
@@ -860,51 +854,6 @@ The main difference between them is that:
 In all cases, this support is currently available only for meta types, meta data
 In all cases, this support is currently available only for meta types, meta data
 and meta functions.
 and meta functions.
 
 
-### Properties and meta objects
-
-Properties are set via a meta factory and are not editable once created:
-
-```cpp
-entt::meta<my_type>().prop("tooltip"_hs, "message");
-```
-
-They are always in the key/value form. The key is a numeric identifier, mostly
-similar to the identifier used to register meta objects. There are no
-restrictions on the type of the value instead, as long as it's movable.<br/>
-Key only properties are also supported out of the box:
-
-```cpp
-entt::meta<my_type>().prop(my_enum::key_only);
-```
-
-To attach multiple properties to a meta object, just invoke `prop` more than
-once.<br/>
-It's also possible to call `prop` at different times, as long as the factory is
-reset to the meta object of interest:
-
-```cpp
-entt::meta<my_type>()
-    .data<&my_type::data_member, entt::as_ref_t>("member"_hs)
-    .prop("key"_hs, value);
-```
-
-Once created, all meta objects offer a couple of member functions named `prop`
-to iterate all properties at once or to search a specific property by key:
-
-```cpp
-// iterate all properties of a meta type
-for(auto &&[id, prop]: entt::resolve<my_type>().prop()) {
-    // ...
-}
-
-// search for a given property by name
-auto prop = entt::resolve<my_type>().prop("tooltip"_hs);
-```
-
-Meta properties are objects having a fairly poor interface, all in all. They
-only provide the `value` member function to retrieve the contained value in the
-form of a `meta_any` object.
-
 ### Traits
 ### Traits
 
 
 User-defined traits are set via a meta factory:
 User-defined traits are set via a meta factory:

+ 1 - 1
src/entt/meta/factory.hpp

@@ -498,7 +498,7 @@ public:
      * @return A meta factory for the parent type.
      * @return A meta factory for the parent type.
      */
      */
     template<typename... Value>
     template<typename... Value>
-    meta_factory prop(id_type id, [[maybe_unused]] Value &&...value) {
+    [[deprecated("use ::custom() instead")]] meta_factory prop(id_type id, [[maybe_unused]] Value &&...value) {
         if constexpr(sizeof...(Value) == 0u) {
         if constexpr(sizeof...(Value) == 0u) {
             base_type::prop(internal::meta_prop_node{id, &internal::resolve<void>});
             base_type::prop(internal::meta_prop_node{id, &internal::resolve<void>});
         } else {
         } else {

+ 7 - 7
src/entt/meta/meta.hpp

@@ -765,7 +765,7 @@ private:
 };
 };
 
 
 /*! @brief Opaque wrapper for properties of any type. */
 /*! @brief Opaque wrapper for properties of any type. */
-struct meta_prop {
+struct [[deprecated("use meta_custom instead")]] meta_prop {
     /*! @brief Default constructor. */
     /*! @brief Default constructor. */
     meta_prop() noexcept = default;
     meta_prop() noexcept = default;
 
 
@@ -938,7 +938,7 @@ struct meta_data {
      * @brief Returns a range to visit registered meta properties.
      * @brief Returns a range to visit registered meta properties.
      * @return An iterable range to visit registered meta properties.
      * @return An iterable range to visit registered meta properties.
      */
      */
-    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_data_node::prop)::const_iterator> prop() const noexcept {
+    [[nodiscard]] [[deprecated("use ::custom() instead")]] meta_range<meta_prop, typename decltype(internal::meta_data_node::prop)::const_iterator> prop() const noexcept {
         return {{*ctx, node->prop.cbegin()}, {*ctx, node->prop.cend()}};
         return {{*ctx, node->prop.cbegin()}, {*ctx, node->prop.cend()}};
     }
     }
 
 
@@ -947,7 +947,7 @@ struct meta_data {
      * @param key The key to use to search for a property.
      * @param key The key to use to search for a property.
      * @return The registered meta property for the given key, if any.
      * @return The registered meta property for the given key, if any.
      */
      */
-    [[nodiscard]] meta_prop prop(const id_type key) const {
+    [[nodiscard]] [[deprecated("use ::custom() instead")]] meta_prop prop(const id_type key) const {
         for(auto &&elem: node->prop) {
         for(auto &&elem: node->prop) {
             if(elem.id == key) {
             if(elem.id == key) {
                 return meta_prop{*ctx, elem};
                 return meta_prop{*ctx, elem};
@@ -1083,7 +1083,7 @@ struct meta_func {
     }
     }
 
 
     /*! @copydoc meta_data::prop */
     /*! @copydoc meta_data::prop */
-    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_func_node::prop)::const_iterator> prop() const noexcept {
+    [[nodiscard]] [[deprecated("use ::custom() instead")]] meta_range<meta_prop, typename decltype(internal::meta_func_node::prop)::const_iterator> prop() const noexcept {
         return {{*ctx, node->prop.cbegin()}, {*ctx, node->prop.cend()}};
         return {{*ctx, node->prop.cbegin()}, {*ctx, node->prop.cend()}};
     }
     }
 
 
@@ -1092,7 +1092,7 @@ struct meta_func {
      * @param key The key to use to search for a property.
      * @param key The key to use to search for a property.
      * @return The registered meta property for the given key, if any.
      * @return The registered meta property for the given key, if any.
      */
      */
-    [[nodiscard]] meta_prop prop(const id_type key) const {
+    [[nodiscard]] [[deprecated("use ::custom() instead")]] meta_prop prop(const id_type key) const {
         for(auto &&elem: node->prop) {
         for(auto &&elem: node->prop) {
             if(elem.id == key) {
             if(elem.id == key) {
                 return meta_prop{*ctx, elem};
                 return meta_prop{*ctx, elem};
@@ -1562,7 +1562,7 @@ public:
      * @brief Returns a range to visit registered top-level meta properties.
      * @brief Returns a range to visit registered top-level meta properties.
      * @return An iterable range to visit registered top-level meta properties.
      * @return An iterable range to visit registered top-level meta properties.
      */
      */
-    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_type_descriptor::prop)::const_iterator> prop() const noexcept {
+    [[nodiscard]] [[deprecated("use ::custom() instead")]] meta_range<meta_prop, typename decltype(internal::meta_type_descriptor::prop)::const_iterator> prop() const noexcept {
         using range_type = meta_range<meta_prop, typename decltype(internal::meta_type_descriptor::prop)::const_iterator>;
         using range_type = meta_range<meta_prop, typename decltype(internal::meta_type_descriptor::prop)::const_iterator>;
         return node.details ? range_type{{*ctx, node.details->prop.cbegin()}, {*ctx, node.details->prop.cend()}} : range_type{};
         return node.details ? range_type{{*ctx, node.details->prop.cbegin()}, {*ctx, node.details->prop.cend()}} : range_type{};
     }
     }
@@ -1572,7 +1572,7 @@ public:
      * @param key The key to use to search for a property.
      * @param key The key to use to search for a property.
      * @return The registered meta property for the given key, if any.
      * @return The registered meta property for the given key, if any.
      */
      */
-    [[nodiscard]] meta_prop prop(const id_type key) const {
+    [[nodiscard]] [[deprecated("use ::custom() instead")]] meta_prop prop(const id_type key) const {
         const auto *elem = internal::look_for<&internal::meta_type_descriptor::prop>(internal::meta_context::from(*ctx), node, key);
         const auto *elem = internal::look_for<&internal::meta_type_descriptor::prop>(internal::meta_context::from(*ctx), node, key);
         return elem ? meta_prop{*ctx, *elem} : meta_prop{};
         return elem ? meta_prop{*ctx, *elem} : meta_prop{};
     }
     }