The moveInVector() function was defined in qthelper.h, even though it has nothing to do with Qt. Therefore, move it into its own header. Morover, since it is a very low-level function, use snake_case. And rename it to move_in_range(), because it does not only work on vectors, but any range with random-access iterators. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
33 lines
1.2 KiB
C++
33 lines
1.2 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
// Helper functions for range manipulations
|
|
#ifndef RANGE_H
|
|
#define RANGE_H
|
|
|
|
// Move a range in a vector to a different position.
|
|
// The parameters are given according to the usual STL-semantics:
|
|
// v: a container with STL-like random access iterator via std::begin(...)
|
|
// rangeBegin: index of first element
|
|
// rangeEnd: index one *past* last element
|
|
// destination: index to element before which the range will be moved
|
|
// Owing to std::begin() magic, this function works with STL-like containers:
|
|
// QVector<int> v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
|
// move_in_range(v, 1, 4, 6);
|
|
// as well as with C-style arrays:
|
|
// int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
|
// move_in_range(array, 1, 4, 6);
|
|
// Both calls will have the following effect:
|
|
// Before: 0 1 2 3 4 5 6 7 8 9
|
|
// After: 0 4 5 1 2 3 6 7 8 9
|
|
// No sanitizing of the input arguments is performed.
|
|
template <typename Range>
|
|
void move_in_range(Range &v, int rangeBegin, int rangeEnd, int destination)
|
|
{
|
|
auto it = std::begin(v);
|
|
if (destination > rangeEnd)
|
|
std::rotate(it + rangeBegin, it + rangeEnd, it + destination);
|
|
else if (destination < rangeBegin)
|
|
std::rotate(it + destination, it + rangeBegin, it + rangeEnd);
|
|
}
|
|
|
|
#endif
|