1
0
mirror of https://github.com/SerenityOS/serenity synced 2024-07-05 20:49:59 +00:00

AK: Make NonnullPtrVectors shuffleable

AK::shuffle() doesn't work on these, because their operator[] returns a
reference to the pointed-at value, instead of to the NonnullPtr itself.
This commit is contained in:
Sam Atkins 2023-01-20 15:09:44 +00:00 committed by Linus Groh
parent ccabc8e930
commit c7a66882f4

View File

@ -63,6 +63,19 @@ inline void shuffle(Collection& collection)
}
}
// shuffle() implementation for NonnullPtrVector, since its operator[] returns a reference to the pointed-at value
// instead of the pointer itself.
template<typename Collection>
requires(requires(Collection collection) { collection.ptr_at(0); })
inline void shuffle(Collection& collection)
{
// Fisher-Yates shuffle
for (size_t i = collection.size() - 1; i >= 1; --i) {
size_t j = get_random_uniform(i + 1);
AK::swap(collection.ptr_at(i), collection.ptr_at(j));
}
}
}
#if USING_AK_GLOBALLY