Skip to content

Commit e797fad

Browse files
committed
meta: further review meta container vtables
1 parent 316b5b9 commit e797fad

File tree

3 files changed

+34
-35
lines changed

3 files changed

+34
-35
lines changed

TODO

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ TODO (high prio):
1717
* view with entity storage: begin/end should return filtered iterators
1818
* update view doc: single vs multi type views are no longer a thing actually
1919
* meta container: add value type to resize
20-
* meta: cbegin/cend for meta containers, avoid the branch
20+
* meta: drop unused return type from meta container vtables
2121
* ===> TEST: review view tests after the last changes
2222

2323
WIP:

src/entt/meta/container.hpp

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class basic_meta_sequence_container_traits {
6464
using size_type = typename meta_sequence_container::size_type;
6565
using iterator = typename meta_sequence_container::iterator;
6666

67-
static size_type basic_vtable(const operation op, const void *container, const void *value, iterator *it) {
67+
static size_type basic_vtable(const operation op, const void *container, const void *value, meta_any *elem) {
6868
switch(op) {
6969
case operation::size:
7070
return static_cast<const Type *>(container)->size();
@@ -90,36 +90,35 @@ class basic_meta_sequence_container_traits {
9090
break;
9191
}
9292
case operation::begin:
93-
it->rebind(static_cast<Type *>(const_cast<void *>(container))->begin());
93+
static_cast<iterator *>(const_cast<void *>(value))->rebind(static_cast<Type *>(const_cast<void *>(container))->begin());
9494
return true;
9595
case operation::cbegin:
96-
it->rebind(static_cast<const Type *>(container)->begin());
96+
static_cast<iterator *>(const_cast<void *>(value))->rebind(static_cast<const Type *>(container)->begin());
9797
return true;
9898
case operation::end:
99-
it->rebind(static_cast<Type *>(const_cast<void *>(container))->end());
99+
static_cast<iterator *>(const_cast<void *>(value))->rebind(static_cast<Type *>(const_cast<void *>(container))->end());
100100
return true;
101101
case operation::cend:
102-
it->rebind(static_cast<const Type *>(container)->end());
102+
static_cast<iterator *>(const_cast<void *>(value))->rebind(static_cast<const Type *>(container)->end());
103103
return true;
104104
case operation::insert:
105105
if constexpr(internal::dynamic_sequence_container<Type>::value) {
106-
auto *const non_const = any_cast<typename Type::iterator>(&it->base());
107-
typename Type::const_iterator underlying{non_const ? *non_const : any_cast<const typename Type::const_iterator &>(it->base())};
108-
109106
// this abomination is necessary because only on macos value_type and const_reference are different types for std::vector<bool>
110-
if(auto &as_any = *static_cast<meta_any *>(const_cast<void *>(value)); as_any.allow_cast<typename Type::const_reference>() || as_any.allow_cast<typename Type::value_type>()) {
107+
if(auto &as_any = *elem; as_any.allow_cast<typename Type::const_reference>() || as_any.allow_cast<typename Type::value_type>()) {
108+
auto &it = *static_cast<iterator *>(const_cast<void *>(value));
109+
auto *const non_const = any_cast<typename Type::iterator>(&it.base());
111110
const auto *element = as_any.try_cast<std::remove_reference_t<typename Type::const_reference>>();
112-
it->rebind(static_cast<Type *>(const_cast<void *>(container))->insert(underlying, element ? *element : as_any.cast<typename Type::value_type>()));
111+
it.rebind(static_cast<Type *>(const_cast<void *>(container))->insert(non_const ? *non_const : any_cast<const typename Type::const_iterator &>(it.base()), element ? *element : as_any.cast<typename Type::value_type>()));
113112
return true;
114113
}
115114
}
116115

117116
break;
118117
case operation::erase:
119118
if constexpr(internal::dynamic_sequence_container<Type>::value) {
120-
auto *const non_const = any_cast<typename Type::iterator>(&it->base());
121-
typename Type::const_iterator underlying{non_const ? *non_const : any_cast<const typename Type::const_iterator &>(it->base())};
122-
it->rebind(static_cast<Type *>(const_cast<void *>(container))->erase(underlying));
119+
auto &it = *static_cast<iterator *>(const_cast<void *>(value));
120+
auto *const non_const = any_cast<typename Type::iterator>(&it.base());
121+
it.rebind(static_cast<Type *>(const_cast<void *>(container))->erase(non_const ? *non_const : any_cast<const typename Type::const_iterator &>(it.base())));
123122
return true;
124123
} else {
125124
break;
@@ -146,7 +145,7 @@ class basic_meta_associative_container_traits {
146145
using size_type = typename meta_associative_container::size_type;
147146
using iterator = typename meta_associative_container::iterator;
148147

149-
static size_type basic_vtable(const operation op, const void *container, const void *key, const void *value, iterator *it) {
148+
static size_type basic_vtable(const operation op, const void *container, const void *key, const void *value) {
150149
switch(op) {
151150
case operation::size:
152151
return static_cast<const Type *>(const_cast<void *>(container))->size();
@@ -161,16 +160,16 @@ class basic_meta_associative_container_traits {
161160
break;
162161
}
163162
case operation::begin:
164-
it->rebind<key_only>(static_cast<Type *>(const_cast<void *>(container))->begin());
163+
static_cast<iterator *>(const_cast<void *>(value))->rebind<key_only>(static_cast<Type *>(const_cast<void *>(container))->begin());
165164
return true;
166165
case operation::cbegin:
167-
it->rebind<key_only>(static_cast<const Type *>(container)->begin());
166+
static_cast<iterator *>(const_cast<void *>(value))->rebind<key_only>(static_cast<const Type *>(container)->begin());
168167
return true;
169168
case operation::end:
170-
it->rebind<key_only>(static_cast<Type *>(const_cast<void *>(container))->end());
169+
static_cast<iterator *>(const_cast<void *>(value))->rebind<key_only>(static_cast<Type *>(const_cast<void *>(container))->end());
171170
return true;
172171
case operation::cend:
173-
it->rebind<key_only>(static_cast<const Type *>(container)->end());
172+
static_cast<iterator *>(const_cast<void *>(value))->rebind<key_only>(static_cast<const Type *>(container)->end());
174173
return true;
175174
case operation::insert:
176175
if constexpr(key_only) {
@@ -181,10 +180,10 @@ class basic_meta_associative_container_traits {
181180
case operation::erase:
182181
return static_cast<Type *>(const_cast<void *>(container))->erase(*static_cast<const typename Type::key_type *>(key));
183182
case operation::find:
184-
it->rebind<key_only>(static_cast<Type *>(const_cast<void *>(container))->find(*static_cast<const typename Type::key_type *>(key)));
183+
static_cast<iterator *>(const_cast<void *>(value))->rebind<key_only>(static_cast<Type *>(const_cast<void *>(container))->find(*static_cast<const typename Type::key_type *>(key)));
185184
return true;
186185
case operation::cfind:
187-
it->rebind<key_only>(static_cast<const Type *>(container)->find(*static_cast<const typename Type::key_type *>(key)));
186+
static_cast<iterator *>(const_cast<void *>(value))->rebind<key_only>(static_cast<const Type *>(container)->find(*static_cast<const typename Type::key_type *>(key)));
188187
return true;
189188
}
190189

src/entt/meta/meta.hpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class meta_sequence_container {
7575
private:
7676
const meta_ctx *ctx{};
7777
internal::meta_type_node (*value_type_node)(const internal::meta_context &){};
78-
size_type (*vtable)(const operation, const void *, const void *, iterator *){};
78+
size_type (*vtable)(const operation, const void *, const void *, meta_any *){};
7979
any storage{};
8080
};
8181

@@ -137,7 +137,7 @@ class meta_associative_container {
137137
internal::meta_type_node (*key_type_node)(const internal::meta_context &){};
138138
internal::meta_type_node (*mapped_type_node)(const internal::meta_context &){};
139139
internal::meta_type_node (*value_type_node)(const internal::meta_context &){};
140-
size_type (*vtable)(const operation, const void *, const void *, const void *, iterator *){};
140+
size_type (*vtable)(const operation, const void *, const void *, const void *){};
141141
any storage{};
142142
};
143143

@@ -1808,7 +1808,7 @@ inline bool meta_sequence_container::reserve(const size_type sz) {
18081808
*/
18091809
[[nodiscard]] inline meta_sequence_container::iterator meta_sequence_container::begin() {
18101810
iterator it{*ctx};
1811-
vtable(storage.policy() == any_policy::cref ? operation::cbegin : operation::begin, std::as_const(storage).data(), nullptr, &it);
1811+
vtable(storage.policy() == any_policy::cref ? operation::cbegin : operation::begin, std::as_const(storage).data(), &it, nullptr);
18121812
return it;
18131813
}
18141814

@@ -1818,7 +1818,7 @@ inline bool meta_sequence_container::reserve(const size_type sz) {
18181818
*/
18191819
[[nodiscard]] inline meta_sequence_container::iterator meta_sequence_container::end() {
18201820
iterator it{*ctx};
1821-
vtable(storage.policy() == any_policy::cref ? operation::cend : operation::end, std::as_const(storage).data(), nullptr, &it);
1821+
vtable(storage.policy() == any_policy::cref ? operation::cend : operation::end, std::as_const(storage).data(), &it, nullptr);
18221822
return it;
18231823
}
18241824

@@ -1829,7 +1829,7 @@ inline bool meta_sequence_container::reserve(const size_type sz) {
18291829
* @return A possibly invalid iterator to the inserted element.
18301830
*/
18311831
inline meta_sequence_container::iterator meta_sequence_container::insert(iterator it, meta_any value) {
1832-
return ((storage.policy() != any_policy::cref) && vtable(operation::insert, storage.data(), &value, &it)) ? it : iterator{*ctx};
1832+
return ((storage.policy() != any_policy::cref) && vtable(operation::insert, storage.data(), &it, &value)) ? it : iterator{*ctx};
18331833
}
18341834

18351835
/**
@@ -1838,7 +1838,7 @@ inline meta_sequence_container::iterator meta_sequence_container::insert(iterato
18381838
* @return A possibly invalid iterator following the last removed element.
18391839
*/
18401840
inline meta_sequence_container::iterator meta_sequence_container::erase(iterator it) {
1841-
return ((storage.policy() != any_policy::cref) && vtable(operation::erase, storage.data(), nullptr, &it)) ? it : iterator{*ctx};
1841+
return ((storage.policy() != any_policy::cref) && vtable(operation::erase, storage.data(), &it, nullptr)) ? it : iterator{*ctx};
18421842
}
18431843

18441844
/**
@@ -1884,30 +1884,30 @@ inline meta_sequence_container::iterator meta_sequence_container::erase(iterator
18841884

18851885
/*! @copydoc meta_sequence_container::size */
18861886
[[nodiscard]] inline meta_associative_container::size_type meta_associative_container::size() const noexcept {
1887-
return vtable(operation::size, std::as_const(storage).data(), nullptr, nullptr, nullptr);
1887+
return vtable(operation::size, std::as_const(storage).data(), nullptr, nullptr);
18881888
}
18891889

18901890
/*! @copydoc meta_sequence_container::clear */
18911891
inline bool meta_associative_container::clear() {
1892-
return (storage.policy() != any_policy::cref) && vtable(operation::clear, storage.data(), nullptr, nullptr, nullptr);
1892+
return (storage.policy() != any_policy::cref) && vtable(operation::clear, storage.data(), nullptr, nullptr);
18931893
}
18941894

18951895
/*! @copydoc meta_sequence_container::reserve */
18961896
inline bool meta_associative_container::reserve(const size_type sz) {
1897-
return (storage.policy() != any_policy::cref) && vtable(operation::reserve, storage.data(), nullptr, &sz, nullptr);
1897+
return (storage.policy() != any_policy::cref) && vtable(operation::reserve, storage.data(), nullptr, &sz);
18981898
}
18991899

19001900
/*! @copydoc meta_sequence_container::begin */
19011901
[[nodiscard]] inline meta_associative_container::iterator meta_associative_container::begin() {
19021902
iterator it{*ctx};
1903-
vtable(storage.policy() == any_policy::cref ? operation::cbegin : operation::begin, std::as_const(storage).data(), nullptr, nullptr, &it);
1903+
vtable(storage.policy() == any_policy::cref ? operation::cbegin : operation::begin, std::as_const(storage).data(), nullptr, &it);
19041904
return it;
19051905
}
19061906

19071907
/*! @copydoc meta_sequence_container::end */
19081908
[[nodiscard]] inline meta_associative_container::iterator meta_associative_container::end() {
19091909
iterator it{*ctx};
1910-
vtable(storage.policy() == any_policy::cref ? operation::cend : operation::end, std::as_const(storage).data(), nullptr, nullptr, &it);
1910+
vtable(storage.policy() == any_policy::cref ? operation::cend : operation::end, std::as_const(storage).data(), nullptr, &it);
19111911
return it;
19121912
}
19131913

@@ -1919,7 +1919,7 @@ inline bool meta_associative_container::reserve(const size_type sz) {
19191919
*/
19201920
inline bool meta_associative_container::insert(meta_any key, meta_any value = {}) {
19211921
const bool valid_key_value = key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))}) && (!mapped_type_node || value.allow_cast(meta_type{*ctx, mapped_type_node(internal::meta_context::from(*ctx))}));
1922-
return valid_key_value && (storage.policy() != any_policy::cref) && vtable(operation::insert, storage.data(), std::as_const(key).data(), std::as_const(value).data(), nullptr);
1922+
return valid_key_value && (storage.policy() != any_policy::cref) && vtable(operation::insert, storage.data(), std::as_const(key).data(), std::as_const(value).data());
19231923
}
19241924

19251925
/**
@@ -1929,7 +1929,7 @@ inline bool meta_associative_container::insert(meta_any key, meta_any value = {}
19291929
*/
19301930
inline meta_associative_container::size_type meta_associative_container::erase(meta_any key) {
19311931
const bool valid_key = key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))});
1932-
return valid_key && (storage.policy() != any_policy::cref) && vtable(operation::erase, storage.data(), std::as_const(key).data(), nullptr, nullptr);
1932+
return valid_key && (storage.policy() != any_policy::cref) && vtable(operation::erase, storage.data(), std::as_const(key).data(), nullptr);
19331933
}
19341934

19351935
/**
@@ -1939,7 +1939,7 @@ inline meta_associative_container::size_type meta_associative_container::erase(m
19391939
*/
19401940
[[nodiscard]] inline meta_associative_container::iterator meta_associative_container::find(meta_any key) {
19411941
iterator it{*ctx};
1942-
key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))}) && vtable(storage.policy() == any_policy::cref ? operation::cfind : operation::find, std::as_const(storage).data(), std::as_const(key).data(), nullptr, &it);
1942+
key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))}) && vtable(storage.policy() == any_policy::cref ? operation::cfind : operation::find, std::as_const(storage).data(), std::as_const(key).data(), &it);
19431943
return it;
19441944
}
19451945

0 commit comments

Comments
 (0)