storage: quit accepting (and silently discarding) arguments for empty types when invoking ::insert

This commit is contained in:
skypjack
2025-08-27 12:08:25 +02:00
parent a638df6cae
commit 47ff98e25b
3 changed files with 20 additions and 6 deletions

View File

@@ -610,6 +610,22 @@ public:
return assure<Type>().emplace(entt, std::forward<Args>(args)...);
}
/**
* @brief Assigns each entity in a range the given element.
*
* @sa emplace
*
* @tparam Type Type of element to create.
* @tparam It Type of input iterator.
* @param first An iterator to the first element of the range of entities.
* @param last An iterator past the last element of the range of entities.
*/
template<typename Type, typename It>
void insert(It first, It last) {
ENTT_ASSERT(std::all_of(first, last, [this](const auto entt) { return valid(entt); }), "Invalid entity");
assure<Type>().insert(std::move(first), std::move(last));
}
/**
* @brief Assigns each entity in a range the given element.
*
@@ -622,7 +638,7 @@ public:
* @param value An instance of the element to assign.
*/
template<typename Type, typename It>
void insert(It first, It last, const Type &value = {}) {
void insert(It first, It last, const Type &value) {
ENTT_ASSERT(std::all_of(first, last, [this](const auto entt) { return valid(entt); }), "Invalid entity");
assure<Type>().insert(std::move(first), std::move(last), value);
}

View File

@@ -930,13 +930,11 @@ public:
/**
* @brief Assigns entities to a storage.
* @tparam It Type of input iterator.
* @tparam Args Types of optional arguments.
* @param first An iterator to the first element of the range of entities.
* @param last An iterator past the last element of the range of entities.
*/
template<typename It, typename... Args>
// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
void insert(It first, It last, Args &&...) {
template<typename It>
void insert(It first, It last) {
for(; first != last; ++first) {
base_type::try_emplace(*first, true);
}

View File

@@ -17,7 +17,7 @@ CR_EXPORT int cr_main(cr_plugin *ctx, cr_op operation) {
static_cast<void>(registry.storage<test::empty>());
const auto view = registry.view<test::boxed_int>();
registry.insert(view.begin(), view.end(), test::empty{});
registry.insert<test::empty>(view.begin(), view.end());
registry.view<test::boxed_int, test::empty>().each([cnt = count](test::boxed_int &elem) {
elem.value += cnt;