meta: further reduce the number of instantiations due to meta sequence containers

This commit is contained in:
Michele Caini
2022-03-14 11:23:29 +01:00
parent ef3c030576
commit 32bbb27c9f
2 changed files with 7 additions and 19 deletions

View File

@@ -54,25 +54,15 @@ struct basic_meta_sequence_container_traits {
return false;
}
[[nodiscard]] static iterator begin(any &container) {
[[nodiscard]] static iterator iter(any &container, const bool end) {
using std::begin;
if(auto *const cont = any_cast<Type>(&container); cont) {
return iterator{begin(*cont), 0};
}
return iterator{begin(any_cast<const Type &>(container)), 0};
}
[[nodiscard]] static iterator end(any &container) {
using std::end;
if(auto *const cont = any_cast<Type>(&container); cont) {
return iterator{end(*cont), static_cast<typename iterator::difference_type>(cont->size())};
return iterator{begin(*cont), end ? static_cast<typename iterator::difference_type>(cont->size()) : 0};
}
const Type &as_const = any_cast<const Type &>(container);
return iterator{end(as_const), static_cast<typename iterator::difference_type>(as_const.size())};
return iterator{begin(as_const), end ? static_cast<typename iterator::difference_type>(as_const.size()) : 0};
}
[[nodiscard]] static iterator insert([[maybe_unused]] any &container, [[maybe_unused]] const std::ptrdiff_t offset, [[maybe_unused]] meta_any &value) {

View File

@@ -62,8 +62,7 @@ struct meta_sequence_container {
: value_type_node{internal::meta_node<std::remove_const_t<std::remove_reference_t<typename Type::value_type>>>::resolve()},
size_fn{&meta_sequence_container_traits<Type>::size},
resize_fn{&meta_sequence_container_traits<Type>::resize},
begin_fn{&meta_sequence_container_traits<Type>::begin},
end_fn{&meta_sequence_container_traits<Type>::end},
iter_fn{&meta_sequence_container_traits<Type>::iter},
insert_fn{&meta_sequence_container_traits<Type>::insert},
erase_fn{&meta_sequence_container_traits<Type>::erase},
storage{std::move(instance)} {}
@@ -83,8 +82,7 @@ private:
internal::meta_type_node *value_type_node = nullptr;
size_type (*size_fn)(const any &) ENTT_NOEXCEPT = nullptr;
bool (*resize_fn)(any &, size_type) = nullptr;
iterator (*begin_fn)(any &) = nullptr;
iterator (*end_fn)(any &) = nullptr;
iterator (*iter_fn)(any &, const bool) = nullptr;
iterator (*insert_fn)(any &, const std::ptrdiff_t, meta_any &) = nullptr;
iterator (*erase_fn)(any &, const std::ptrdiff_t) = nullptr;
any storage{};
@@ -1645,7 +1643,7 @@ inline bool meta_sequence_container::clear() {
* @return An iterator to the first element of the container.
*/
[[nodiscard]] inline meta_sequence_container::iterator meta_sequence_container::begin() {
return begin_fn(storage);
return iter_fn(storage, false);
}
/**
@@ -1653,7 +1651,7 @@ inline bool meta_sequence_container::clear() {
* @return An iterator that is past the last element of the container.
*/
[[nodiscard]] inline meta_sequence_container::iterator meta_sequence_container::end() {
return end_fn(storage);
return iter_fn(storage, true);
}
/**