| 697 | // shuffle to the end of the vector. |
| 698 | template <typename E> |
| 699 | void ShuffleRange(internal::Random* random, int begin, int end, |
| 700 | std::vector<E>* v) { |
| 701 | const int size = static_cast<int>(v->size()); |
| 702 | GTEST_CHECK_(0 <= begin && begin <= size) |
| 703 | << "Invalid shuffle range start " << begin << ": must be in range [0, " |
| 704 | << size << "]."; |
| 705 | GTEST_CHECK_(begin <= end && end <= size) |
| 706 | << "Invalid shuffle range finish " << end << ": must be in range [" |
| 707 | << begin << ", " << size << "]."; |
| 708 | |
| 709 | // Fisher-Yates shuffle, from |
| 710 | // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle |
| 711 | for (int range_width = end - begin; range_width >= 2; range_width--) { |
| 712 | const int last_in_range = begin + range_width - 1; |
| 713 | const int selected = begin + random->Generate(range_width); |
| 714 | std::swap((*v)[selected], (*v)[last_in_range]); |
| 715 | } |
| 716 | } |
| 717 | |
| 718 | // Performs an in-place shuffle of the vector's elements. |
| 719 | template <typename E> |
no test coverage detected