summaryrefslogtreecommitdiffstats
path: root/include/std/util/impl/qsort.H
diff options
context:
space:
mode:
Diffstat (limited to 'include/std/util/impl/qsort.H')
-rw-r--r--include/std/util/impl/qsort.H191
1 files changed, 0 insertions, 191 deletions
diff --git a/include/std/util/impl/qsort.H b/include/std/util/impl/qsort.H
deleted file mode 100644
index 718e3f64..00000000
--- a/include/std/util/impl/qsort.H
+++ /dev/null
@@ -1,191 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/include/util/impl/qsort.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2015 */
-/* [+] International Business Machines Corp. */
-/* */
-/* */
-/* Licensed under the Apache License, Version 2.0 (the "License"); */
-/* you may not use this file except in compliance with the License. */
-/* You may obtain a copy of the License at */
-/* */
-/* http://www.apache.org/licenses/LICENSE-2.0 */
-/* */
-/* Unless required by applicable law or agreed to in writing, software */
-/* distributed under the License is distributed on an "AS IS" BASIS, */
-/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
-/* implied. See the License for the specific language governing */
-/* permissions and limitations under the License. */
-/* */
-/* IBM_PROLOG_END_TAG */
-
-#ifndef __UTIL_IMPL_QSORT_H
-#define __UTIL_IMPL_QSORT_H
-
-/** @file qsort.H
- *
- * Contains the internal implementation details of std::sort implemented as
- * quick-sort.
- */
-
-#include <iterator>
-
-// Forward declaration due to 'swap' being defined in <algorithm> which is
-// including this file itself.
-namespace std
-{
- template <typename T> void swap(T& a, T& b);
-};
-
-namespace Util
-{
- namespace __Util_QSort_Impl
- {
- template <typename RandomAccessIterator>
- void sort(RandomAccessIterator first, RandomAccessIterator last)
- {
- size_t length = std::distance(first, last);
-
- // A range of length 0 or 1 is already sort.
- if ((length == 0) || (length == 1))
- {
- return;
- }
-
- // A range of length 2 has a trivial sort.
- if (length == 2)
- {
- RandomAccessIterator next = first;
- std::advance(next, 1);
-
- if (*next < *first)
- {
- std::swap(*first, *next);
- }
- return;
- }
-
- // Choose pivot as middle and move pivot to end.
- // This is done to eliminate the O(n^2) behavior when the
- // range is already sorted.
- RandomAccessIterator pivot = first;
- std::advance(pivot,length - 1);
- RandomAccessIterator middle = first;
- std::advance(middle, length / 2);
- std::swap(*pivot, *middle);
-
- // Perform partitioning...
-
- // Division points to the first element greater than the pivot or
- // else the farthest point partitioned if no elements greater than
- // the pivot have been found yet.
- RandomAccessIterator division = first;
- RandomAccessIterator pos = first;
- while(pos != pivot)
- {
- // Element less than the pivot is found, so move it to the
- // "less than" side of the division line.
- if (*pos < *pivot)
- {
- if (pos != division)
- {
- std::swap(*pos, *division);
- }
- ++division;
- }
-
- ++pos;
- }
-
- // Move the pivot down to the division line, which is its sorted
- // position in the range.
- if (pivot != division)
- {
- std::swap(*pivot,*division);
- }
-
- // Sort each partition
- __Util_QSort_Impl::sort(first,division);
- std::advance(division, 1);
- __Util_QSort_Impl::sort(division, last);
- };
-
-
- template <typename RandomAccessIterator, typename StrictWeakOrdering>
- void sort(RandomAccessIterator first, RandomAccessIterator last,
- StrictWeakOrdering pred)
- {
- size_t length = std::distance(first, last);
-
- // A range of length 0 or 1 is already sort.
- if ((length == 0) || (length == 1))
- {
- return;
- }
-
- // A range of length 2 has a trivial sort.
- if (length == 2)
- {
- RandomAccessIterator next = first;
- std::advance(next, 1);
-
- if (pred(*next,*first))
- {
- std::swap(*first, *next);
- }
- return;
- }
-
- // Choose pivot as middle and move pivot to end.
- // This is done to eliminate the O(n^2) behavior when the
- // range is already sorted.
- RandomAccessIterator pivot = first;
- std::advance(pivot,length - 1);
- RandomAccessIterator middle = first;
- std::advance(middle, length / 2);
- std::swap(*pivot, *middle);
-
- // Perform partitioning...
-
- // Division points to the first element greater than the pivot or
- // else the farthest point partitioned if no elements greater than
- // the pivot have been found yet.
- RandomAccessIterator division = first;
- RandomAccessIterator pos = first;
- while(pos != pivot)
- {
- // Element less than the pivot is found, so move it to the
- // "less than" side of the division line.
- if (pred(*pos,*pivot))
- {
- if (pos != division)
- {
- std::swap(*pos, *division);
- }
- ++division;
- }
-
- ++pos;
- }
-
- // Move the pivot down to the division line, which is its sorted
- // position in the range.
- if (pivot != division)
- {
- std::swap(*pivot,*division);
- }
-
- // Sort each partition.
- __Util_QSort_Impl::sort(first,division,pred);
- std::advance(division, 1);
- __Util_QSort_Impl::sort(division, last,pred);
- };
-
- };
-};
-
-#endif
OpenPOWER on IntegriCloud