meta: further reduce the number of instantiations due to meta sequence containers
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user