Просмотр исходного кода

meta: meta_data::[set|get]_[arity|arg]

skypjack 15 часов назад
Родитель
Сommit
d74d77f923
4 измененных файлов с 64 добавлено и 48 удалено
  1. 1 4
      TODO
  2. 29 10
      src/entt/meta/meta.hpp
  3. 2 2
      test/entt/meta/meta_context.cpp
  4. 32 32
      test/entt/meta/meta_data.cpp

+ 1 - 4
TODO

@@ -32,9 +32,6 @@ TODO:
 * make meta_any buffer size configurable (propagate to any)
 * test trivially_destructible optimization
 * finish the imgui viewer/editor!
-* test meta_setter/meta_getter with meta_any*
 * test set/get with multiple values
+* test set/get_arity and set/get_arg
 * document additional arguments to meta setters/getters
-* meta_data should check arity on set/get
-* refine arg and arity on meta_data
-* meta: meta_data set/get_arity and set/get_arg or similar

+ 29 - 10
src/entt/meta/meta.hpp

@@ -840,13 +840,21 @@ struct meta_data: meta_object<internal::meta_data_node> {
     }
 
     /**
-     * @brief Returns the number of arguments accepted by a data member.
-     * @return The number of arguments accepted by the data member.
+     * @brief Returns the number of arguments of a data member's setter.
+     * @return The number of arguments accepted by the data member's setter.
      */
-    [[nodiscard]] size_type arity() const noexcept {
+    [[nodiscard]] size_type set_arity() const noexcept {
         return node_or_assert().set_arity;
     }
 
+    /**
+     * @brief Returns the number of arguments of a data member's getter.
+     * @return The number of arguments accepted by the data member's getter.
+     */
+    [[nodiscard]] size_type get_arity() const noexcept {
+        return node_or_assert().get_arity;
+    }
+
     /**
      * @brief Indicates whether a data member is constant or not.
      * @return True if the data member is constant, false otherwise.
@@ -876,7 +884,7 @@ struct meta_data: meta_object<internal::meta_data_node> {
     template<typename Instance = meta_handle>
     // NOLINTNEXTLINE(modernize-use-nodiscard)
     bool set(Instance &&instance, auto &&...args) const {
-        return (sizeof...(args) == arity()) && node_or_assert().set(meta_handle{*ctx, stl::forward<Instance>(instance)}, stl::array<meta_any, sizeof...(args)>{meta_any{*ctx, stl::forward<decltype(args)>(args)}...}.data());
+        return (sizeof...(args) == set_arity()) && node_or_assert().set(meta_handle{*ctx, stl::forward<Instance>(instance)}, stl::array<meta_any, sizeof...(args)>{meta_any{*ctx, stl::forward<decltype(args)>(args)}...}.data());
     }
 
     /**
@@ -888,15 +896,22 @@ struct meta_data: meta_object<internal::meta_data_node> {
      */
     template<typename Instance = meta_handle>
     [[nodiscard]] meta_any get(Instance &&instance, auto &&...args) const {
-        return node_or_assert().get(meta_handle{*ctx, stl::forward<Instance>(instance)}, stl::array<meta_any, sizeof...(args)>{meta_any{*ctx, stl::forward<decltype(args)>(args)}...}.data());
+        return (sizeof...(args) == get_arity()) ? node_or_assert().get(meta_handle{*ctx, stl::forward<Instance>(instance)}, stl::array<meta_any, sizeof...(args)>{meta_any{*ctx, stl::forward<decltype(args)>(args)}...}.data()) : meta_any{meta_ctx_arg, *ctx};
     }
 
     /**
-     * @brief Returns the type of the i-th argument of a data member.
+     * @brief Returns the type of the i-th argument of a data member's setter.
      * @param index Index of the argument of which to return the type.
-     * @return The type of the i-th argument of a data member.
+     * @return The type of the i-th argument of a data member's setter.
      */
-    [[nodiscard]] inline meta_type arg(size_type index) const noexcept;
+    [[nodiscard]] inline meta_type set_arg(size_type index) const noexcept;
+
+    /**
+     * @brief Returns the type of the i-th argument of a data member's getter.
+     * @param index Index of the argument of which to return the type.
+     * @return The type of the i-th argument of a data member's getter.
+     */
+    [[nodiscard]] inline meta_type get_arg(size_type index) const noexcept;
 
     /**
      * @brief Returns all meta traits for a given meta object.
@@ -1534,8 +1549,12 @@ inline bool meta_any::assign(meta_any &&other) {
     return meta_type{*ctx, node_or_assert().type(internal::meta_context::from(*ctx))};
 }
 
-[[nodiscard]] inline meta_type meta_data::arg(const size_type index) const noexcept {
-    return index < arity() ? node_or_assert().set_arg(*ctx, index) : meta_type{};
+[[nodiscard]] inline meta_type meta_data::set_arg(const size_type index) const noexcept {
+    return index < set_arity() ? node_or_assert().set_arg(*ctx, index) : meta_type{};
+}
+
+[[nodiscard]] inline meta_type meta_data::get_arg(const size_type index) const noexcept {
+    return index < get_arity() ? node_or_assert().get_arg(*ctx, index) : meta_type{};
 }
 
 [[nodiscard]] inline meta_type meta_func::ret() const noexcept {

+ 2 - 2
test/entt/meta/meta_context.cpp

@@ -278,8 +278,8 @@ TEST_F(MetaContext, MetaData) {
     ASSERT_EQ(global.data("value"_hs).type().data("marker"_hs).get({}).cast<int>(), global_marker);
     ASSERT_EQ(local.data("value"_hs).type().data("marker"_hs).get({}).cast<int>(), local_marker);
 
-    ASSERT_EQ(global.data("rw"_hs).arg(0u).data("marker"_hs).get({}).cast<int>(), global_marker);
-    ASSERT_EQ(local.data("rw"_hs).arg(0u).data("marker"_hs).get({}).cast<int>(), local_marker);
+    ASSERT_EQ(global.data("rw"_hs).set_arg(0u).data("marker"_hs).get({}).cast<int>(), global_marker);
+    ASSERT_EQ(local.data("rw"_hs).set_arg(0u).data("marker"_hs).get({}).cast<int>(), local_marker);
 
     clazz instance{'c', 8};
     const argument value{2};

+ 32 - 32
test/entt/meta/meta_data.cpp

@@ -199,9 +199,9 @@ TEST_F(MetaData, NonConst) {
     clazz instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -216,9 +216,9 @@ TEST_F(MetaData, Const) {
     clazz instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_TRUE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 1);
@@ -232,9 +232,9 @@ TEST_F(MetaData, Static) {
     auto data = entt::resolve<clazz>().data("h"_hs);
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_FALSE(data.is_const());
     ASSERT_TRUE(data.is_static());
     ASSERT_EQ(data.get({}).cast<int>(), 2);
@@ -248,9 +248,9 @@ TEST_F(MetaData, ConstStatic) {
     auto data = entt::resolve<clazz>().data("k"_hs);
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_TRUE(data.is_const());
     ASSERT_TRUE(data.is_static());
     ASSERT_EQ(data.get({}).cast<int>(), 3);
@@ -264,9 +264,9 @@ TEST_F(MetaData, Literal) {
     auto data = entt::resolve<clazz>().data("l"_hs);
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<char>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<char>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<char>());
     ASSERT_TRUE(data.is_const());
     ASSERT_TRUE(data.is_static());
     ASSERT_EQ(data.get({}).cast<char>(), 'c');
@@ -375,9 +375,9 @@ TEST_F(MetaData, SetterGetterAsFreeFunctions) {
     setter_getter instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -392,9 +392,9 @@ TEST_F(MetaData, SetterGetterAsMemberFunctions) {
     setter_getter instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<double>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<double>());
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -411,9 +411,9 @@ TEST_F(MetaData, SetterGetterWithRefAsMemberFunctions) {
     setter_getter instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -428,9 +428,9 @@ TEST_F(MetaData, SetterGetterMixed) {
     setter_getter instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -445,9 +445,9 @@ TEST_F(MetaData, SetterGetterReadOnly) {
     setter_getter instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 0u);
+    ASSERT_EQ(data.set_arity(), 0u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::meta_type{});
+    ASSERT_EQ(data.set_arg(0u), entt::meta_type{});
     ASSERT_TRUE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -462,9 +462,9 @@ TEST_F(MetaData, SetterGetterReadOnlyDataMember) {
     setter_getter instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 0u);
+    ASSERT_EQ(data.set_arity(), 0u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::meta_type{});
+    ASSERT_EQ(data.set_arg(0u), entt::meta_type{});
     ASSERT_TRUE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
@@ -505,10 +505,10 @@ TEST_F(MetaData, ArrayStatic) {
     auto data = entt::resolve<array>().data("global"_hs);
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     // NOLINTBEGIN(*-avoid-c-arrays)
     ASSERT_EQ(data.type(), entt::resolve<int[2]>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int[2]>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int[2]>());
     // NOLINTEND(*-avoid-c-arrays)
     ASSERT_FALSE(data.is_const());
     ASSERT_TRUE(data.is_static());
@@ -523,10 +523,10 @@ TEST_F(MetaData, Array) {
     array instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     // NOLINTBEGIN(*-avoid-c-arrays)
     ASSERT_EQ(data.type(), entt::resolve<int[4]>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int[4]>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int[4]>());
     // NOLINTEND(*-avoid-c-arrays)
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
@@ -541,9 +541,9 @@ TEST_F(MetaData, AsVoid) {
     clazz instance{};
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_TRUE(data.set(instance, 1));
     ASSERT_EQ(instance.i, 1);
     ASSERT_EQ(data.get(instance), entt::meta_any{std::in_place_type<void>});
@@ -594,9 +594,9 @@ TEST_F(MetaData, AsRef) {
     auto data = entt::resolve<clazz>().data("i"_hs);
 
     ASSERT_TRUE(data);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_EQ(instance.i, 0);
 
     data.get(instance).cast<int &>() = 3;
@@ -611,9 +611,9 @@ TEST_F(MetaData, AsConstRef) {
     auto data = entt::resolve<clazz>().data("ci"_hs);
 
     ASSERT_EQ(instance.i, 0);
-    ASSERT_EQ(data.arity(), 1u);
+    ASSERT_EQ(data.set_arity(), 1u);
     ASSERT_EQ(data.type(), entt::resolve<int>());
-    ASSERT_EQ(data.arg(0u), entt::resolve<int>());
+    ASSERT_EQ(data.set_arg(0u), entt::resolve<int>());
     ASSERT_EQ(data.get(instance).cast<const int &>(), 0);
     ASSERT_EQ(data.get(instance).cast<int>(), 0);
     ASSERT_EQ(instance.i, 0);