summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-12-10 06:42:11 +0330
committerAndreas Kling <kling@serenityos.org>2020-12-10 11:02:02 +0100
commitec4980e87561f1ad3132d525c579c139f2399098 (patch)
treea8311a99677fd5d01854a9d4dd40dde290d2082b
parent5b104eedaf2640c3c82a6a1d6434d10c442c7149 (diff)
downloadserenity-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.h4
-rw-r--r--AK/Tests/TestQuickSort.cpp58
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)