diff --git a/src/entt/entity/sparse_set.hpp b/src/entt/entity/sparse_set.hpp index 569fec2bc..6792f7f62 100644 --- a/src/entt/entity/sparse_set.hpp +++ b/src/entt/entity/sparse_set.hpp @@ -1044,23 +1044,23 @@ public: } /** - * @brief Sort entities according to their order in another sparse set. + * @brief Sort entities according to their order in a range. * - * Entities that are part of both the sparse sets are ordered internally - * according to the order they have in `other`.
- * All the other entities goes to the end of the list and there are no + * Entities that are part of both the sparse set and the range are ordered + * internally according to the order they have in the range.
+ * All other entities goes to the end of the sparse set and there are no * guarantees on their order. * - * @param other The sparse sets that imposes the order of the entities. + * @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. */ - void sort_as(const basic_sparse_set &other) { + template + void sort_as(It first, It last) { ENTT_ASSERT((mode != deletion_policy::in_place) || (head == traits_type::to_entity(null)), "Sorting with tombstones not allowed"); - const auto to = other.end(); - auto from = other.begin(); - - for(auto it = begin(); it.index() && from != to; ++from) { - if(const auto curr = *from; contains(curr)) { + for(auto it = begin(); it.index() && first != last; ++first) { + if(const auto curr = *first; contains(curr)) { if(const auto entt = *it; entt != curr) { // basic no-leak guarantee (with invalid state) if swapping throws swap_elements(entt, curr); @@ -1071,6 +1071,14 @@ public: } } + /** + * @copybrief sort_as + * @param other The sparse sets that imposes the order of the entities. + */ + [[deprecated("use iterator based sort_as instead")]] void sort_as(const basic_sparse_set &other) { + sort_as(other.begin(), other.end()); + } + /*! @brief Clears a sparse set. */ void clear() { pop_all();