diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-12-10 06:42:11 +0330 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-12-10 11:02:02 +0100 |
commit | ec4980e87561f1ad3132d525c579c139f2399098 (patch) | |
tree | a8311a99677fd5d01854a9d4dd40dde290d2082b | |
parent | 5b104eedaf2640c3c82a6a1d6434d10c442c7149 (diff) | |
download | serenity-ec4980e87561f1ad3132d525c579c139f2399098.zip |
AK: Ensure dual_pivot_quick_sort does not copy the pivots
Also add a test that would fail to compile if quick_sort tries to copy
anything :P
-rw-r--r-- | AK/QuickSort.h | 4 | ||||
-rw-r--r-- | AK/Tests/TestQuickSort.cpp | 58 |
2 files changed, 60 insertions, 2 deletions
diff --git a/AK/QuickSort.h b/AK/QuickSort.h index fb5868c9e3..45e7973fa4 100644 --- a/AK/QuickSort.h +++ b/AK/QuickSort.h @@ -51,8 +51,8 @@ void dual_pivot_quick_sort(Collection& col, int start, int end, LessThan less_th int k = start + 1; int g = end - 1; - auto left_pivot = col[start]; - auto right_pivot = col[end]; + auto&& left_pivot = col[start]; + auto&& right_pivot = col[end]; while (k <= g) { if (less_than(col[k], left_pivot)) { diff --git a/AK/Tests/TestQuickSort.cpp b/AK/Tests/TestQuickSort.cpp new file mode 100644 index 0000000000..6b9510b21d --- /dev/null +++ b/AK/Tests/TestQuickSort.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020, the SerenityOS developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <AK/TestSuite.h> + +#include <AK/Checked.h> +#include <AK/Noncopyable.h> +#include <AK/QuickSort.h> +#include <AK/StdLibExtras.h> + +TEST_CASE(sorts_without_copy) +{ + struct NoCopy { + AK_MAKE_NONCOPYABLE(NoCopy); + + public: + NoCopy() { } + NoCopy(NoCopy&&) = default; + + NoCopy& operator=(NoCopy&&) = default; + + int value { 0 }; + }; + + Array<NoCopy, 64> array; + for (size_t i = 0; i < 64; ++i) + array[i].value = (64 - i) % 32 + 32; + + quick_sort(array, [](auto& a, auto& b) { return a.value < b.value; }); + + for (size_t i = 0; i < 63; ++i) + EXPECT(array[i].value <= array[i + 1].value); +} + +TEST_MAIN(QuickSort) |