diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index cb193f48..54e0e78f 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Morwenn +# Copyright (c) 2021-2022 Morwenn # SPDX-License-Identifier: MIT name: Ubuntu Builds @@ -23,13 +23,13 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: cxx: - - g++-5 + - g++-7 - clang++-6.0 config: # Release build @@ -46,8 +46,8 @@ jobs: - uses: actions/checkout@v3 - name: Install GCC - if: ${{matrix.cxx == 'g++-5'}} - run: sudo apt-get install -y g++-5 + if: ${{matrix.cxx == 'g++-7'}} + run: sudo apt-get install -y g++-7 - name: Install Clang if: ${{matrix.cxx == 'clang++-6.0'}} diff --git a/CMakeLists.txt b/CMakeLists.txt index a061b9be..a90839db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,11 @@ -# Copyright (c) 2015-2022 Morwenn +# Copyright (c) 2015-2023 Morwenn # SPDX-License-Identifier: MIT cmake_minimum_required(VERSION 3.8.0) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -project(cpp-sort VERSION 1.14.0 LANGUAGES CXX) +project(cpp-sort VERSION 1.15.0 LANGUAGES CXX) include(CMakePackageConfigHelpers) include(GNUInstallDirs) @@ -15,11 +15,25 @@ option(BUILD_TESTING "Build the cpp-sort test suite (deprecated, use CPPSORT_BUI option(BUILD_EXAMPLES "Build the cpp-sort examples (deprecated, use CPPSORT_BUILD_EXAMPLES)" OFF) option(CPPSORT_BUILD_TESTING "Build the cpp-sort test suite" ${BUILD_TESTING}) option(CPPSORT_BUILD_EXAMPLES "Build the cpp-sort examples" ${BUILD_EXAMPLES}) +option(CPPSORT_ENABLE_AUDITS "Enable assertions in the library" OFF) +option(CPPSORT_ENABLE_ASSERTIONS "Enable assertions in the library" ${CPPSORT_ENABLE_AUDITS}) +option(CPPSORT_USE_LIBASSERT "Use libassert for assertions (experimental)" OFF) + +# Optionally use libassert for assertions +if (CPPSORT_USE_LIBASSERT) + include(DownloadProject) + download_project(PROJ libassert + GIT_REPOSITORY https://github.com/jeremy-rifkin/libassert + GIT_TAG v1.2 + UPDATE_DISCONNECTED 1 + ) + add_subdirectory(${libassert_SOURCE_DIR} ${libassert_BINARY_DIR}) +endif() # Create cpp-sort library and configure it add_library(cpp-sort INTERFACE) target_include_directories(cpp-sort INTERFACE - $ + $ $ ) @@ -27,7 +41,24 @@ target_compile_features(cpp-sort INTERFACE cxx_std_14) # MSVC won't work without a stricter standard compliance if (MSVC) - target_compile_options(cpp-sort INTERFACE /permissive-) + target_compile_options(cpp-sort INTERFACE + /permissive- + /Zc:preprocessor + ) +endif() + +# Handle diagnostic options +if (CPPSORT_ENABLE_ASSERTIONS) + target_compile_definitions(cpp-sort INTERFACE CPPSORT_ENABLE_ASSERTIONS) +endif() +if (CPPSORT_ENABLE_AUDITS) + target_compile_definitions(cpp-sort INTERFACE CPPSORT_ENABLE_AUDITS) +endif() + +# Optionally link to libassert +if (CPPSORT_USE_LIBASSERT) + target_link_libraries(cpp-sort INTERFACE assert) + target_compile_definitions(cpp-sort INTERFACE CPPSORT_USE_LIBASSERT) endif() add_library(cpp-sort::cpp-sort ALIAS cpp-sort) diff --git a/README.md b/README.md index 5dc54996..4ab53896 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![cpp-sort logo](docs/images/cpp-sort-logo.svg) -[![Latest Release](https://img.shields.io/badge/release-1.14.0-blue.svg)](https://github.com/Morwenn/cpp-sort/releases/tag/1.14.0) -[![Conan Package](https://img.shields.io/badge/conan-cpp--sort%2F1.14.0-blue.svg)](https://conan.io/center/cpp-sort?version=1.14.0) +[![Latest Release](https://img.shields.io/badge/release-1.15.0-blue.svg)](https://github.com/Morwenn/cpp-sort/releases/tag/1.15.0) +[![Conan Package](https://img.shields.io/badge/conan-cpp--sort%2F1.15.0-blue.svg)](https://conan.io/center/recipes/cpp-sort?version=1.15.0) [![Code Coverage](https://codecov.io/gh/Morwenn/cpp-sort/branch/develop/graph/badge.svg)](https://codecov.io/gh/Morwenn/cpp-sort) [![Pitchfork Layout](https://img.shields.io/badge/standard-PFL-orange.svg)](https://github.com/vector-of-bool/pitchfork) @@ -122,11 +122,11 @@ page][benchmarks]. ![MacOS builds status](https://github.com/Morwenn/cpp-sort/workflows/MacOS%20Builds/badge.svg?branch=develop) **cpp-sort** requires C++14 support, and should work with the following compilers: -* g++5.5 or more recent. It is known not to work with some older g++5 versions. -* clang++6.0 or more recent. It should work with clang++ versions all the way back to 3.8, but the CI pipeline doesn't have test for those anymore. -* Visual Studio 2019 version 16.8.3 or more recent, only with `/permissive-`. A few features are still unavailable. +* g++7 or more recent. +* clang++6.0 or more recent (with both libstdc++ and libc++). * The versions of MinGW-w64 and AppleClang equivalent to the compilers mentioned above. -* Clang is notably tested with both libstdc++ and libc++. +* Visual Studio 2019 version 16.8.3 or more recent, only with `/permissive-`. A few features are unavailable. +* clang-cl corresponding the the Visual Studio version above. The compilers listed above are the ones used by the CI pipeline, and the library is also tested with the most recent versions of those compilers on a regular basis. All the other compiler @@ -134,11 +134,10 @@ versions in-between are untested, but should also work. Feel free to open an iss case. The features in the library might differ depending on the C++ version used and on the compiler -extensions enabled. Those changes [are documented](https://github.com/Morwenn/cpp-sort/wiki/Changelog) -in the wiki. +extensions enabled. Those changes are documented [in the wiki][changelog]. The main repository contains additional support for standard tooling such as CMake or Conan. -You can read more about those [in the wiki](https://github.com/Morwenn/cpp-sort/wiki/Tooling). +You can read more about those [in the wiki][tooling]. # Thanks @@ -217,7 +216,7 @@ slightly modified version of Matthew Bentley's [indiesort](https://github.com/ma comes from Danila Kutenin's [miniselect library](https://github.com/danlark1/miniselect) and uses Andrei Alexandrescu's [*AdaptiveQuickselect*](https://arxiv.org/abs/1606.00484) algorithm. -* The sorting networks used by `sorting_network_sorter` all come [from this list](http://users.telenet.be/bertdobbelaere/SorterHunter/sorting_networks.html) +* The sorting networks used by `sorting_network_sorter` all come [from this list](https://bertdobbelaere.github.io/sorting_networks_extended.html) maintained by Bert Dobbelaere. The page has references to the sources of all of the sorting networks it lists. @@ -244,6 +243,8 @@ developed by Thøger Rivera-Thorsen. [adaptive-sort]: https://en.wikipedia.org/wiki/Adaptive_sort [benchmarks]: https://github.com/Morwenn/cpp-sort/wiki/Benchmarks + [changelog]: https://github.com/Morwenn/cpp-sort/wiki/Changelog [drop-merge-adapter]: https://github.com/Morwenn/cpp-sort/wiki/Sorter-adapters#drop_merge_adapter [heap-sorter]: https://github.com/Morwenn/cpp-sort/wiki/Sorters#heap_sorter [split-adapter]: https://github.com/Morwenn/cpp-sort/wiki/Sorter-adapters#split_adapter + [tooling]: https://github.com/Morwenn/cpp-sort/wiki/Tooling diff --git a/benchmarks/benchmarking-tools/cpu_cycles.h b/benchmarks/benchmarking-tools/cpu_cycles.h new file mode 100644 index 00000000..304b67a0 --- /dev/null +++ b/benchmarks/benchmarking-tools/cpu_cycles.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#include +#include +#include +#include +#include +#include "rdtsc.h" + +//////////////////////////////////////////////////////////// +// Tag + +struct cpu_cycles_tag {}; + +//////////////////////////////////////////////////////////// +// Metric + +template +struct cpu_cycles: + cppsort::utility::adapter_storage, + cppsort::detail::check_iterator_category, + cppsort::detail::check_is_always_stable +{ + using tag_t = cpu_cycles_tag; + using metric_t = cppsort::utility::metric; + + cpu_cycles() = default; + + constexpr explicit cpu_cycles(Sorter sorter): + cppsort::utility::adapter_storage(std::move(sorter)) + {} + + template + auto operator()(Args&&... args) const + -> decltype( + this->get()(std::forward(args)...), + metric_t(std::declval()) + ) + { + auto start = ::rdtsc(); + this->get()(std::forward(args)...); + auto stop = ::rdtsc(); + return metric_t(stop - start); + } +}; + +//////////////////////////////////////////////////////////// +// is_stable specialization + +namespace cppsort +{ + template + struct is_stable(Args...)>: + is_stable + {}; +} diff --git a/benchmarks/benchmarking-tools/rdtsc.h b/benchmarks/benchmarking-tools/rdtsc.h index c7f735aa..7df2a153 100644 --- a/benchmarks/benchmarking-tools/rdtsc.h +++ b/benchmarks/benchmarking-tools/rdtsc.h @@ -26,7 +26,9 @@ #ifdef _WIN32 #include - #define rdtsc __rdtsc + inline unsigned long long rdtsc() { + return __rdtsc(); + } #else #ifdef __i586__ static __inline__ unsigned long long rdtsc() { diff --git a/benchmarks/errorbar-plot/bench.cpp b/benchmarks/errorbar-plot/bench.cpp index 61015249..763ae9e8 100644 --- a/benchmarks/errorbar-plot/bench.cpp +++ b/benchmarks/errorbar-plot/bench.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Morwenn + * Copyright (c) 2020-2023 Morwenn * SPDX-License-Identifier: MIT */ #include @@ -16,6 +16,7 @@ #include #include #include +#include #include #include "../benchmarking-tools/distributions.h" #include "../benchmarking-tools/filesystem.h" @@ -36,7 +37,7 @@ using sort_f = void (*)(collection_t&); std::pair sorts[] = { { "heap_sort", cppsort::heap_sort }, { "poplar_sort", cppsort::poplar_sort }, - { "smooth_sort", cppsort::smooth_sort } + { "smooth_sort", cppsort::smooth_sort }, }; // Distribution to benchmark against @@ -95,11 +96,10 @@ int main(int argc, char** argv) while (total_end - total_start < max_run_time && times.size() < max_runs_per_size) { collection_t collection; distribution(std::back_inserter(collection), size); - auto start = clock_type::now(); - sort.second(collection); - auto end = clock_type::now(); + auto do_sort = cppsort::metrics::running_time(sort.second); + auto duration = do_sort(collection); assert(std::is_sorted(std::begin(collection), std::end(collection))); - times.push_back(std::chrono::duration(end - start).count()); + times.push_back(duration.value().count()); total_end = clock_type::now(); } diff --git a/benchmarks/inversions/inv-bench.cpp b/benchmarks/inversions/inv-bench.cpp index 6ced3046..1dd2d879 100644 --- a/benchmarks/inversions/inv-bench.cpp +++ b/benchmarks/inversions/inv-bench.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2022 Morwenn + * Copyright (c) 2020-2023 Morwenn * SPDX-License-Identifier: MIT */ #include @@ -13,10 +13,11 @@ #include #include #include +#include #include +#include "../benchmarking-tools/cpu_cycles.h" #include "../benchmarking-tools/distributions.h" #include "../benchmarking-tools/filesystem.h" -#include "../benchmarking-tools/rdtsc.h" using namespace std::chrono_literals; @@ -31,9 +32,9 @@ using collection_t = std::vector; // Sorting algorithms to benchmark using sort_f = void (*)(collection_t&); std::pair sorts[] = { - { "drop_merge_sort", cppsort::drop_merge_sort }, - { "pdq_sort", cppsort::pdq_sort }, - { "split_sort", cppsort::split_sort }, + { "heap_sort", cppsort::heap_sort }, + { "drop_merge_adapter(heap_sort)", cppsort::drop_merge_adapter{} }, + { "split_adapter(heap_sort)", cppsort::split_adapter{} }, }; // Size of the collections to sort @@ -92,15 +93,13 @@ int main(int argc, char* argv[]) auto total_start = clock_type::now(); auto total_end = clock_type::now(); - while (std::chrono::duration_cast(total_end - total_start) < max_run_time && - cycles.size() < max_runs_per_size) { + while (total_end - total_start < max_run_time && cycles.size() < max_runs_per_size) { collection_t collection; distribution(std::back_inserter(collection), size); - std::uint64_t start = rdtsc(); - sort.second(collection); - std::uint64_t end = rdtsc(); + auto do_sort = cpu_cycles(sort.second); + auto nb_cycles = do_sort(collection); assert(std::is_sorted(std::begin(collection), std::end(collection))); - cycles.push_back(double(end - start) / size + 0.5); + cycles.push_back(double(nb_cycles.value()) / size + 0.5); total_end = clock_type::now(); } diff --git a/benchmarks/patterns/bars.py b/benchmarks/patterns/bars.py index 4afee7cd..71128ac6 100644 --- a/benchmarks/patterns/bars.py +++ b/benchmarks/patterns/bars.py @@ -62,8 +62,8 @@ def main(): "pdq_sort", "quick_sort", "ska_sort", + "spin_sort", "std_sort", - "verge_sort", ] root = pathlib.Path(args.root) diff --git a/benchmarks/patterns/bench.cpp b/benchmarks/patterns/bench.cpp index 7dcf02b2..427965c8 100644 --- a/benchmarks/patterns/bench.cpp +++ b/benchmarks/patterns/bench.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2021 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ @@ -36,8 +36,8 @@ #include #include #include +#include "../benchmarking-tools/cpu_cycles.h" #include "../benchmarking-tools/distributions.h" -#include "../benchmarking-tools/rdtsc.h" // Type of data to sort during the benchmark using value_t = double; @@ -77,8 +77,8 @@ int main() { "pdq_sort", cppsort::pdq_sort }, { "quick_sort", cppsort::quick_sort }, { "ska_sort", cppsort::ska_sort }, + { "spin_sort", cppsort::spin_sort }, { "std_sort", cppsort::std_sort }, - { "verge_sort", cppsort::verge_sort }, }; std::size_t sizes[] = { 1'000'000 }; @@ -94,26 +94,25 @@ int main() distributions_prng.seed(seed); for (auto size: sizes) { - std::vector cycles; + std::vector cycles_per_element; auto total_start = clock_type::now(); auto total_end = clock_type::now(); while (total_end - total_start < 5s) { collection_t collection; distribution.second(std::back_inserter(collection), size); - std::uint64_t start = rdtsc(); - sort.second(collection); - std::uint64_t end = rdtsc(); + auto do_sort = cpu_cycles(sort.second); + auto nb_cycles = do_sort(collection); assert(std::is_sorted(std::begin(collection), std::end(collection))); - cycles.push_back(double(end - start) / size + 0.5); + cycles_per_element.push_back(double(nb_cycles.value()) / size + 0.5); total_end = clock_type::now(); } for (std::ostream* stream: {&std::cout, &std::cerr}) { (*stream) << size << ", " << distribution.first << ", " << sort.first << ", "; - auto it = cycles.begin(); + auto it = cycles_per_element.begin(); (*stream) << *it; - while (++it != cycles.end()) { + while (++it != cycles_per_element.end()) { (*stream) << ", " << *it; } (*stream) << std::endl; diff --git a/benchmarks/small-array/benchmark.cpp b/benchmarks/small-array/benchmark.cpp index 7101d22a..5ecb33d2 100644 --- a/benchmarks/small-array/benchmark.cpp +++ b/benchmarks/small-array/benchmark.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2022 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #include @@ -16,8 +16,8 @@ #include #include #include +#include "../benchmarking-tools/cpu_cycles.h" #include "../benchmarking-tools/distributions.h" -#include "../benchmarking-tools/rdtsc.h" using namespace std::chrono_literals; @@ -43,9 +43,9 @@ template< typename T, std::size_t N, typename Sorter, - typename DistributionFunction + typename Dist > -auto time_it(Sorter sorter, DistributionFunction distribution) +auto time_it(Sorter sorter, Dist distribution) -> std::uint64_t { static_assert(N > 0, "this benchmark does not support zero-sized arrays"); @@ -59,15 +59,13 @@ auto time_it(Sorter sorter, DistributionFunction distribution) // Generate and sort arrays of size N thanks to distribution auto total_start = clock_type::now(); auto total_end = clock_type::now(); - while (std::chrono::duration_cast(total_end - total_start) < max_run_time && - cycles.size() < max_runs_per_size) { + while (total_end - total_start < max_run_time && cycles.size() < max_runs_per_size) { std::array arr; distribution(arr.begin(), N); - std::uint64_t start = rdtsc(); - sorter(arr); - std::uint64_t end = rdtsc(); + auto do_sort = cpu_cycles(sorter); + auto nb_cycles = do_sort(arr); assert(std::is_sorted(arr.begin(), arr.end())); - cycles.push_back(double(end - start) / N); + cycles.push_back(double(nb_cycles.value()) / N); total_end = clock_type::now(); } @@ -109,7 +107,7 @@ auto time_distribution(std::index_sequence) }; // Output the results to their respective files - std::ofstream output(Distribution::output); + std::ofstream output(Dist::output); for (auto&& sort_result: results) { output << std::get<0>(sort_result) << ','; for (auto&& nb_cycles: std::get<1>(sort_result)) { diff --git a/cmake/cpp-sort-utils.cmake b/cmake/cpp-sort-utils.cmake index 5a422a1e..fb946ef1 100644 --- a/cmake/cpp-sort-utils.cmake +++ b/cmake/cpp-sort-utils.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2022 Morwenn +# Copyright (c) 2019-2023 Morwenn # SPDX-License-Identifier: MIT # Add a selection of warnings to a target @@ -7,14 +7,11 @@ macro(cppsort_add_warnings target) target_compile_options(${target} PRIVATE /W2) else() target_compile_options(${target} PRIVATE - -Wall -Wextra -Wcast-align -Winline -Wmissing-declarations -Wmissing-include-dirs + -Wall -Wextra -Wcast-align -Wmissing-declarations -Wmissing-include-dirs -Wnon-virtual-dtor -Wodr -Wpedantic -Wredundant-decls -Wundef -Wunreachable-code $<$:-Wlogical-op -Wuseless-cast -Wzero-as-null-pointer-constant> # The warning when initializing an std::array is just too much of a bother $<$:-Wno-missing-braces> - # Without this we get thousands of -Winline warnings without even explicitly - # asking to inline anything, which makes compilation results unreadable - $<$:-Wno-inline> ) endif() endmacro() diff --git a/conanfile.py b/conanfile.py index 677e397a..6eee043e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018-2022 Morwenn +# Copyright (c) 2018-2023 Morwenn # SPDX-License-Identifier: MIT import os.path @@ -9,18 +9,19 @@ from conan.tools.build import check_min_cppstd from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout from conan.tools.files import copy +from conan.tools.microsoft import is_msvc required_conan_version = ">=1.50.0" class CppSortConan(ConanFile): name = "cpp-sort" - version = "1.14.0" - description = "Additional sorting algorithms & related tools" - topics = "sorting", "algorithms" + version = "1.15.0" + description = "Sorting algorithms & related tools" + license = "MIT" url = "https://github.com/Morwenn/cpp-sort" homepage = url - license = "MIT" + topics = "cpp-sort", "sorting", "algorithms" author = "Morwenn " # Minimal export (excludes tests, coverage, etc.) @@ -30,8 +31,8 @@ class CppSortConan(ConanFile): "CMakeLists.txt", "cmake/cpp-sort-config.cmake.in" ] - no_copy_source = True settings = "os", "compiler", "build_type", "arch" + no_copy_source = True def validate(self): if self.settings.get_safe("compiler.cppstd"): @@ -56,10 +57,13 @@ def package(self): copy(self, file, self.recipe_folder, os.path.join(self.package_folder, "licenses"), keep_path=False) def package_info(self): - self.cpp_info.names["cmake_find_package"] = "cpp-sort" - self.cpp_info.names["cmake_find_package_multi"] = "cpp-sort" - if self.info.settings.compiler == "Visual Studio": - self.cpp_info.cxxflags = ["/permissive-"] + self.cpp_info.set_property("cmake_file_name", "cpp-sort") + self.cpp_info.set_property("cmake_target_name", "cpp-sort::cpp-sort") + self.cpp_info.bindirs = [] + self.cpp_info.libdirs = [] + + if is_msvc(self): + self.cpp_info.cxxflags = ["/permissive-", "/Zc:preprocessor"] def package_id(self): self.info.clear() # Header-only diff --git a/docs/Fixed-size-sorters.md b/docs/Fixed-size-sorters.md index 45e1e9e9..2d3563a3 100644 --- a/docs/Fixed-size-sorters.md +++ b/docs/Fixed-size-sorters.md @@ -101,7 +101,7 @@ All specializations of `merge_exchange_network_sorter` provide a `index_pairs() ```cpp template -[[nodiscard]] static constexpr auto index_pairs() +[[nodiscard]] static constexpr auto index_pairs() noexcept -> std::array, /* Number of CEs in the network */>; ``` @@ -128,7 +128,7 @@ All specializations of `odd_even_merge_network_sorter` provide a `index_pairs() ```cpp template -[[nodiscard]] static constexpr auto index_pairs() +[[nodiscard]] static constexpr auto index_pairs() noexcept -> std::array, /* Number of CEs in the network */>; ``` @@ -140,30 +140,34 @@ template #include ``` -This sorter provides size-optimal [sorting networks][sorting-network] for 0 thru 32 inputs. While using a generic algorithm for the task such as a Batcher's odd-even mergesort may be too slow to be usable, the resulting unrolled sorting networks may be fast enough and even tend to be faster than everything else when it comes to sorting small arrays of integers without requiring additional memory. +This sorter provides size-optimal [sorting networks][sorting-network] for 0 thru 64 inputs. Those networks are manually unrolled *sequential* series of *compare-exchange* operations (CEs) which can be fast enough for certain operations, and do tend to be faster than everything else when it comes to sorting small arrays of integers without requiring additional memory. ```cpp template struct sorting_network_sorter; ``` -The following table gives the number of *compare-exchange* operations (CEs) used to sort a fixed collection of a given size. These numbers should correspond to the best-known size-optimal sorting networks at the time of writing (as opposed to depth-optimal sorting networks). If you ever find a sorting network using fewer CEs for one of these sizes, don't hesitate to open an issue (but you might as well write a research paper about it). +The following table gives the number of *compare-exchange* operations used to sort a fixed collection of a given size. These numbers should correspond to the best-known size-optimal sorting networks at the time of writing (as opposed to depth-optimal sorting networks). If you ever find a sorting network using fewer CEs for one of these sizes, don't hesitate to open an issue, though you might as well write a research paper about it. Size | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: **CEs** | 0 | 1 | 3 | 5 | 9 | 12 | 16 | 19 | 25 | 29 | 35 | 39 | 45 | 51 | 56 | 60 **Size** | **17** | **18** | **19** | **20** | **21** | **22** | **23** | **24** | **25** | **26** | **27** | **28** | **29** | **30** | **31** | **32** -**CEs** | 71 | 77 | 85 | 91 | 99 | 106 | 114 | 120 | 130 | 139 | 148 | 155 | 164 | 172 | 180 | 185 +**CEs** | 71 | 77 | 85 | 91 | 99 | 106 | 114 | 120 | 130 | 139 | 147 | 155 | 164 | 172 | 180 | 185 +**Size** | **33** | **34** | **35** | **36** | **37** | **38** | **39** | **40** | **41** | **42** | **43** | **44** | **45** | **46** | **47** | **48** +**CEs** | 199 | 209 | 220 | 227 | 241 | 250 | 259 | 265 | 282 | 292 | 304 | 311 | 324 | 332 | 340 | 346 +**Size** | **49** | **50** | **51** | **52** | **53** | **54** | **55** | **56** | **57** | **58** | **59** | **60** | **61** | **62** | **63** | **64** +**CEs** | 365 | 376 | 387 | 395 | 411 | 421 | 432 | 438 | 454 | 465 | 476 | 483 | 497 | 506 | 515 | 521 -One of the main advantages of sorting networks is the fixed number of CEs required to sort a collection: this means that sorting networks are far more resistant to time and cache attacks since the number of performed comparisons does not depend on the contents of the collection. However, additional care (not provided by the library) is required to ensure that the algorithms always perform the same amount of memory loads and stores. For example, one could create a `constant_time_iterator` with a dedicated `iter_swap` tuned to perform a constant-time compare-exchange operation. +Networks 0, 1, 2 and 3 are stable. All other networks are unstable. -*Note:* don't be fooled by the name; none of the algorithms in this fixed-size sorter explicitly perform any operation in parallel. Everything is sequential. The algorithms are but long sequences of compare-exchange operations. +One of the main advantages of sorting networks is the fixed number of CEs required to sort a collection: this means that sorting networks are far more resiliant to time and cache attacks since the number of performed comparisons does not depend on the contents of the collection. However, additional care (not provided by the library) is required to ensure that the algorithms always perform the same amount of memory loads and stores. For example, one could create a `constant_time_iterator` with a dedicated `iter_swap` tuned to perform a constant-time compare-exchange operation. -All specializations of `sorting_network_sorter` provide a `index_pairs() static` function template which returns an [`std::array`][std-array] of [`utility::index_pair`][utility-sorting-networks]. Those pairs represent the indices used by the CE operations of the network and can be passed manipulated and passed to dedicated [sorting network tools][utility-sorting-networks] from the library's utility module. The function is templated of the index/difference type, which must be constructible from `int`. +All specializations of `sorting_network_sorter` provide a `index_pairs()` `static` function template which returns an [`std::array`][std-array] of [`utility::index_pair`][utility-sorting-networks]. Those pairs represent the indices used by the CE operations of the network and can be manipulated and passed to dedicated [sorting network tools][utility-sorting-networks] from the library's utility module. The function is templated on the index/difference type, which must be constructible from `int`. ```cpp template -[[nodiscard]] static constexpr auto index_pairs() +[[nodiscard]] static constexpr auto index_pairs() noexcept -> std::array, /* Number of CEs in the network */>; ``` @@ -181,6 +185,11 @@ template *Changed in version 1.13.1:* `index_pair()` is now `[[nodiscard]]` when possible for all `sorting_network_sorter` specializations. +*Changed in version 1.15.0:* new specializations for 33 thru 64 inputs. + +*Changed in version 1.15.0:* sorting 27 inputs requires 174 CEs instead of 148. + +*Changed in version 1.15.0:* sorting 3 inputs is now stable. Specializations 0, 1, 2 and 3 are marked as stable. [double-insertion-sort]: Original-research.md#double-insertion-sort [fixed-sorter-traits]: Sorter-traits.md#fixed_sorter_traits diff --git a/docs/Home.md b/docs/Home.md index d394530f..79842d75 100644 --- a/docs/Home.md +++ b/docs/Home.md @@ -1,6 +1,6 @@ ![cpp-sort logo](images/cpp-sort-logo.svg) -Welcome to the **cpp-sort 1.14.0** documentation! +Welcome to the **cpp-sort 1.15.0** documentation! This wiki contains documentation about the library: basic documentation about the many sorting tools and how to use them, documentation about the additional utilities provided by the library, as well as a few tutorials about writing your own sorters or sorter adapters. This main page explains a few general things that didn't quite fit in other parts of the documentation. @@ -73,12 +73,28 @@ Some old components undergo deprecation before being removed in the following ma Some algorithms have assertions to guard against accidental logic issues (mostly in algorithms adapted from other projects), but they are disabled by default. You can enable these assertions by defining the preprocessor macro `CPPSORT_ENABLE_ASSERTIONS`. This new macro still honours `NDEBUG`, so assertions won't be enabled anyway if `NDEBUG` is defined. -A similar `CPPSORT_ENABLE_AUDITS` macro can be defined to enable audits: those are expensive assertions which are not enabled by `CPPSORT_ENABLE_ASSERTIONS` because they are too expensive, to the point that they might even change the complexity of some algorithms. When turning on audits, internal calls to `__assume` and equivalent statements will also be turned into assertions to provide additional checks. +A similar `CPPSORT_ENABLE_AUDITS` macro can be defined to enable audits: those are expensive assertions which are not enabled by `CPPSORT_ENABLE_ASSERTIONS` because they are too expensive, to the point that they might even change the complexity of some algorithms. When turning on audits, assertions are automatically enabled too, and internal uses of [`[[assume(...)]]`][assume] and equivalent statements are turned into assertions. This macro also honours `NDEBUG`. + +The macros `CPPSORT_ENABLE_ASSERTIONS` and `CPPSORT_ENABLE_AUDITS` can be configured directly from CMake by setting the eponymous options to `ON`. See [the Tooling page][tooling-cmake] for more information. *New in version 1.6.0* *New in version 1.9.0*: `CPPSORT_ENABLE_AUDITS` +*New in version 1.15.0:* `CPPSORT_ENABLE_ASSERTIONS` and `CPPSORT_ENABLE_AUDITS` can be defined with CMake options. + +*Changed in version 1.15.0*: defining `CPPSORT_ENABLE_AUDITS` now automatically defines `CPPSORT_ENABLE_ASSERTIONS`. + +#### Rich assertions with libassert (experimental) + +When defined, the macro `CPPSORT_USE_LIBASSERT` makes internal assertions use [libassert][libassert] instead of the standard `assert` macro. This allows assertions to provide additional information when an assertion fires, notably by displaying a full stack trace, and optionally to decompose the asserted expressions. See the library's README for more information. + +This option can be enabled from CMake by setting the `CPPSORT_USE_LIBASSERT` to `ON`. See [the Tooling page][tooling-cmake] for more information. + +*Note: the support for libassert is still experimental and has not been tested on all supported platforms. Errors are to be expected.* + +*New in version 1.15.0* + ## Miscellaneous This wiki also includes a small section about the [original research][original-research] that happened during the conception of the library and the results of this research. While it is not needed to understand how the library works or how to use it, it may be of interest if you want to discover new things about sorting. @@ -89,7 +105,10 @@ If you ever feel that this wiki is incomplete, that it needs more examples or mo Hope you have fun! + [assume]: https://en.cppreference.com/w/cpp/language/attributes/assume [benchmarks]: Benchmarks.md + [libassert]: https://github.com/jeremy-rifkin/libassert [original-research]: Original-research.md [quickstart]: Quickstart.md [swappable]: https://en.cppreference.com/w/cpp/concepts/swappable + [tooling-cmake]: Tooling.md#cmake diff --git a/docs/Library-nomenclature.md b/docs/Library-nomenclature.md index 2aabeb96..e8ce6602 100644 --- a/docs/Library-nomenclature.md +++ b/docs/Library-nomenclature.md @@ -28,6 +28,8 @@ auto max_inversion = cppsort::probe::dis(collection); +* *Metric*: as special kind of *sorter adapter* that returns information about sorted collections. See [the corresponding page][metrics] for additional information. + * *Projection*: some sorters accept a projection as an additional parameter. A projection is a unary function that allows to "view" the values of a collection differently. For example it may allow to sort a collection of values on a specific field. The available sorting algorithms transform projections on the fly so that pointers to member data can also be used as projections. Projections were pioneered by the [Adobe Source Libraries][stlab] and appear in the C++20 [constrained algorithms][std-ranges]. struct wrapper { int value; }; @@ -74,6 +76,7 @@ [iterator-category]: Sorter-traits.md#iterator_category [iterator-tags]: https://en.cppreference.com/w/cpp/iterator/iterator_tags [measures-of-presortedness]: Measures-of-presortedness.md + [metrics]: Metrics.md [p0022]: https://wg21.link/P0022 [radix-sort]: https://en.wikipedia.org/wiki/Radix_sort [sorter-adapters]: Sorter-adapters.md diff --git a/docs/Measures-of-presortedness.md b/docs/Measures-of-presortedness.md index da03ca89..1be6f1bf 100644 --- a/docs/Measures-of-presortedness.md +++ b/docs/Measures-of-presortedness.md @@ -118,7 +118,7 @@ Computes the maximum distance determined by an inversion. | n | n | Bidirectional | | n log n | 1 | Forward | -When enough memory is available, `probe::dis` runs in O(n), otherwise it falls back to an O(n log n) algorithm that does not require extra memory. If forward iterators are passed, the O(n log n) algorithm is always used. +When enough memory is available `probe::dis` runs in O(n) using an algorithm described by T. Altman and Y. Igarashi in *Roughly Sorting: Sequential and Parallel Approach*, otherwise it falls back to an O(n log n) algorithm that does not require extra memory. If forward iterators are passed, the O(n log n) algorithm is always used. `max_for_size`: |*X*| - 1 when the last element of *X* is smaller than the first one. @@ -224,7 +224,7 @@ The measure of presortedness is slightly different from its original description #include ``` -Computes the *Oscillation* measure described by C. Levcopoulos and O. Petersson in *Adaptive Heapsort*. +Computes the *Oscillation* measure described by C. Levcopoulos and O. Petersson in *Adaptive Heapsort*, using an algorithm devised by J. Nehring. | Complexity | Memory | Iterators | | ----------- | ----------- | ------------- | diff --git a/docs/Metrics.md b/docs/Metrics.md new file mode 100644 index 00000000..00740d1c --- /dev/null +++ b/docs/Metrics.md @@ -0,0 +1,82 @@ +*New in version 1.15.0* + +*Metrics* are special kinds of [*sorter adapters*][sorter-adapters] that can be used to compute properties about a sorting algorithm, such as the number of comparisons performed while sorting a given collection, or the time it took to sort. As *sorter adapters*, metrics follow the *unified sorting interface*, and *do* sort the passed collection before returning the result. + +The anatomy of a metric adapter is thus close to that of any *sorter adapter* with the following additional properties: +* The result of the *adapted sorter*'s is replaced with an instance of [`cppsort:::utility::metric`][utility-metrics-tools], which is a small wrapper type encapsulating a value. +* It exposes a `tag_t` aliasing the tag of the returned metric value. +* It exposes a `metric_t` type aliasing the returned metric type. + +The metrics tag can be any type, generally ending with the `_tag` suffix, and can be either empty or contain freeform static metadata about the kind of metric that uses it. Future versions of **cpp-sort** might standardize some tag fields. + +## Available metrics + +All available metrics live in the subnamespace `cppsort::metrics`. Even though all of them are available in their own standalone header, it is possible to include all of them at once with the following include: + +```cpp +#include +``` + +All of the metrics headers also includes ``. + +### `comparisons` + +```cpp +#include +``` + +Computes the number of comparisons performed by the *adapted sorter*. + +This is done by wrapping the passed comparison function. As such it only works with sorters that accept a comparison, and bypasses components that special-case specific comparison objects. + +```cpp +template< + typename Sorter, + typename CountType = std::size_t +> +struct comparisons; +``` + +Returns an instance of `utility::metric`. + +### `projections` + +```cpp +#include +``` + +Computes the number of projections performed by the *adapted sorter*. + +This is done by wrapping the passed projection function. As such it only works with sorters that accept a projection, and bypasses components that special-case specific projection objects. + +```cpp +template< + typename Sorter, + typename CountType = std::size_t +> +struct projections; +``` + +Returns an instance of `utility::metric`. + +### `running_time` + +```cpp +#include +``` + +Computes the time it takes for the *adapted sorter* to sort a collection, using a steady clock by default. + +```cpp +template< + typename Sorter, + typename DurationType = typename std::chrono::steady_clock::duration +> +struct running_time; +``` + +Returns an instance of `utility::metric`. + + + [sorter-adapters]: Sorter-adapters.md + [utility-metrics-tools]: Miscellaneous-utilities.md#metrics-tools diff --git a/docs/Miscellaneous-utilities.md b/docs/Miscellaneous-utilities.md index 74a3fc42..c988863e 100644 --- a/docs/Miscellaneous-utilities.md +++ b/docs/Miscellaneous-utilities.md @@ -290,6 +290,142 @@ template< using make_index_range = make_integer_range; ``` +### Metrics tools + +```cpp +#include +``` + +This header contains utility classes used to implement or manipulate [metrics][metrics]. + +The most fundamental such type is `utility::metrics`, a small tagged wrapper for a value type. The idea is to give some stronger typing to value types to add additional mening to them. For example the number of comparisons performed by a sorting operation would be represented with `utility::metric`. The idea is to allow operations between metrics with the same tag type while disallowing those that have different tags. + +The tag type can be any type, generally ending with the `_tag` suffix, and can be either empty or contain freeform static metadata about the kind of metric that uses it. Future versions of **cpp-sort** might standardize some tag fields. + +The `metric` type itself is rather barebones, implementing construction, assignment, value type access, comparison and relational operators. Any other operation can be performed by retrieving the wrapped value and wrapping it again as needed. + +```cpp +template +class metric +{ +public: + //////////////////////////////////////////////////////////// + // Construction + + metric() = default; + metric(const metric&) = default; + metric(metric&&) = default; + + constexpr explicit metric(const T& value) + noexcept(std::is_nothrow_copy_constructible::value); + constexpr explicit metric(T&& value) + noexcept(std::is_nothrow_move_constructible::value); + + //////////////////////////////////////////////////////////// + // Accessors + + constexpr explicit operator T() const; + + constexpr auto value() const + -> T; + + //////////////////////////////////////////////////////////// + // Assignment + + metric& operator=(const metric&) = default; + metric& operator=(metric&&) = default; + + constexpr auto operator=(const T& other) + noexcept(std::is_nothrow_copy_assignable::value) + -> metric&; + constexpr auto operator=(T&& other) + noexcept(std::is_nothrow_move_assignable::value) + -> metric&; + + template + constexpr auto operator=(const metric& other) + noexcept(std::is_nothrow_assignable::value) + -> metric&; + template + constexpr auto operator=(metric&& other) + noexcept(std::is_nothrow_assignable::value) + -> metric&; + + //////////////////////////////////////////////////////////// + // Comparison operators + + template + friend constexpr auto operator==(const metric& lhs, const metric& rhs) + -> bool; + friend constexpr auto operator==(const metric& lhs, const T& rhs) + -> bool: + friend constexpr auto operator==(const T& lhs, const metric& rhs) + -> bool; + + template + friend constexpr auto operator!=(const metric& lhs, const metric& rhs) + -> bool; + friend constexpr auto operator!=(const metric& lhs, const T& rhs) + -> bool; + friend constexpr auto operator!=(const T& lhs, const metric& rhs) + -> bool; + + //////////////////////////////////////////////////////////// + // Relational operators + + template + friend constexpr auto operator<(const metric& lhs, const metric& rhs) + -> bool; + friend constexpr auto operator<(const metric& lhs, const T& rhs) + -> bool; + friend constexpr auto operator<(const T& lhs, const metric& rhs) + -> bool; + + template + friend constexpr auto operator<=(const metric& lhs, const metric& rhs) + -> bool; + friend constexpr auto operator<=(const metric& lhs, const T& rhs) + -> bool; + friend constexpr auto operator<=(const T& lhs, const metric& rhs) + -> bool; + + template + friend constexpr auto operator>(const metric& lhs, const metric& rhs) + -> bool; + friend constexpr auto operator>(const metric& lhs, const T& rhs) + -> bool; + friend constexpr auto operator>(const T& lhs, const metric& rhs) + -> bool; + + template + friend constexpr auto operator>=(const metric& lhs, const metric& rhs) + -> bool; + friend constexpr auto operator>=(const metric& lhs, const T& rhs) + -> bool; + friend constexpr auto operator>=(const T& lhs, const metric& rhs) + -> bool; +}; +``` + +Individual metrics can be grouped together using the `utility::metrics` tag, which is basically a barebones tuple type. It main difference compared to `std::tuple` is that it can only be contructed with `utility::metric` instances and has an overloaded `get(metrics)` function that can be used to retrieve a member it holds with the given tag: + +```cpp +struct foo_tag {}; +struct bar_tag {}; + +cppsort::utility::metric m1(5); +cppsort::utility::metric m2(6.0); +cppsort::utility::metrics mm(m1, m2); + +// Retrieve the metric member +using std::get; +auto m = get(mm); +``` + +`utility::metrics` is still mostly experimental and unused in the rest of the library. As such this documentation is voluntarily thin. + +*New in version 1.15.0* + ### `size` ```cpp @@ -426,6 +562,7 @@ You can read more about this instantiation pattern in [this article][eric-nieble [fixed-size-sorters]: Fixed-size-sorters.md [inline-variables]: https://en.cppreference.com/w/cpp/language/inline [is-stable]: Sorter-traits.md#is_stable + [metrics]: Metrics.md [numpy-argsort]: https://numpy.org/doc/stable/reference/generated/numpy.argsort.html [p0022]: https://wg21.link/P0022 [pdq-sorter]: Sorters.md#pdq_sorter diff --git a/docs/Sorter-adapters.md b/docs/Sorter-adapters.md index c836d4b8..b9d9d61c 100644 --- a/docs/Sorter-adapters.md +++ b/docs/Sorter-adapters.md @@ -326,17 +326,19 @@ This little dance sometimes allows to reduce the nesting of function calls and t While the library already provides a `verge_sorter` built on top of `pdq_sorter`, the true power of vergesort is to add a fast *Runs*-adaptive layer on top of any sorting algorithm to make it handle data with big runs better while not being noticeably slower for the distributions that the vergesort layer can't handle. [This page][vergesort-fallbacks] contains benchmarks of vergesort on top of several sorting algorithms, showing that it can be valuable tool to add on top of most sorting algorithms. -`verge_adapter` takes any sorter and uses it as a fallback sorting algorithm when it can't sort a collection on its own. The *resulting sorter* is always unstable, no matter the stability of the *adapted sorter*. It only accepts random-access iterables. +`verge_adapter` takes any sorter and uses it as a fallback sorting algorithm when it can't sort a collection on its own. The *resulting sorter* is always unstable, no matter the stability of the *adapted sorter*. It accepts bidirectional iterators. ```cpp template struct verge_adapter; ``` -When wrapped into [`stable_adapter`][stable-adapter], it has a slightly different behaviour: it detects strictly descending runs instead of non-ascending ones, and wraps the fallback sorter with `stable_t`. The *resulting sorter* is stable, and faster than just using `make_stable`. +When wrapped into [`stable_adapter`][stable-adapter], it has a slightly different behaviour: it detects strictly descending runs instead of non-ascending ones, and wraps the fallback sorter with `stable_t`. The *resulting sorter* is stable, and can be faster than just using `make_stable`. *New in version 1.9.0:* explicit specialization for `stable_adapter`. +*Changed in version 1.15.0:* `verge_adapter` now supports bidirectional iterators. + [ctad]: https://en.cppreference.com/w/cpp/language/class_template_argument_deduction [cycle-sort]: https://en.wikipedia.org/wiki/Cycle_sort diff --git a/docs/Sorters.md b/docs/Sorters.md index 3c098212..f9c467a1 100644 --- a/docs/Sorters.md +++ b/docs/Sorters.md @@ -114,6 +114,8 @@ struct stable_adapter: #include ``` +***WARNING:** `drop_merge_sorter` is deprecated in version 1.15.0 and removed in version 2.0.0, use [`drop_merge_adapter`][drop-merge-adapter]`(`[`pdq_sort`][pdq-sorter]`)` instead.* + Implements a [drop-merge sort][drop-merge-sort]. | Best | Average | Worst | Memory | Stable | Iterators | @@ -122,6 +124,10 @@ Implements a [drop-merge sort][drop-merge-sort]. Drop-merge sort is a [*Rem*-adaptive][probe-rem] sorting algorithm. While it is not as good as other sorting algorithms to sort shuffled data, it is excellent when more than 80% of the data is already ordered according to *Rem*. +*Deprecated in version 1.15.0* + +*Removed in version 2.0.0* + ### `grail_sorter<>` ```cpp @@ -379,7 +385,7 @@ While the complexity guarantees of this algorithm are optimal, this smoothsort i #include ``` -Implements a [spinsort][spinsort] +Implements a [spinsort][spinsort]. | Best | Average | Worst | Memory | Stable | Iterators | | ----------- | ----------- | ----------- | ----------- | ----------- | ------------- | @@ -387,12 +393,28 @@ Implements a [spinsort][spinsort] *New in version 1.6.0* +### `splay_sorter` + +```cpp +#include +``` + +Implements a [splaysort][splaysort]. + +| Best | Average | Worst | Memory | Stable | Iterators | +| ----------- | ----------- | ----------- | ----------- | ----------- | ------------- | +| n | n log n | n log n | n | Yes | Forward | + +*New in version 1.15.0* + ### `split_sorter` ```cpp #include ``` +***WARNING:** `split_sorter` is deprecated in version 1.15.0 and removed in version 2.0.0, use [`split_adapter`][split-adapter]`(`[`pdq_sort`][pdq-sorter]`)` instead.* + Implements an in-place *SplitSort* as descirbed in *Splitsort — an adaptive sorting algorithm* by C. Levcopoulos and O. Petersson. This library implements the simpler "in-place" version of the algorithm described in the paper. | Best | Average | Worst | Memory | Stable | Iterators | @@ -408,6 +430,10 @@ This sorter can't throw `std::bad_alloc`. *New in version 1.4.0* +*Deprecated in version 1.15.0* + +*Removed in version 2.0.0* + ### `std_sorter` ```cpp @@ -596,6 +622,7 @@ struct spread_sorter: [cppsort-sort]: Sorting-functions.md#cppsortsort [d-ary-heap]: https://en.wikipedia.org/wiki/D-ary_heap [default-sorter]: Sorters.md#default_sorter + [drop-merge-adapter]: Sorter-adapters.md#drop_merge_adapter [drop-merge-sort]: https://github.com/emilk/drop-merge-sort [grailsort]: https://github.com/Mrrl/GrailSort [heapsort]: https://en.wikipedia.org/wiki/Heapsort @@ -605,6 +632,7 @@ struct spread_sorter: [issue-168]: https://github.com/Morwenn/cpp-sort/issues/168 [median-of-medians]: https://en.wikipedia.org/wiki/Median_of_medians [merge-sort]: https://en.wikipedia.org/wiki/Merge_sort + [pdq-sorter]: Sorters.md#pdq_sorter [pdqsort]: https://github.com/orlp/pdqsort [probe-rem]: Measures-of-presortedness.md#rem [probe-runs]: Measures-of-presortedness.md#runs @@ -618,6 +646,8 @@ struct spread_sorter: [sorter-adapters]: Sorter-adapters.md [sorting-functions]: Sorting-functions.md [spinsort]: https://www.boost.org/doc/libs/1_80_0/libs/sort/doc/html/sort/single_thread/spinsort.html + [splaysort]: https://en.wikipedia.org/wiki/Splaysort + [split-adapter]: Sorter-adapters.md#split_adapter [spreadsort]: https://en.wikipedia.org/wiki/Spreadsort [stable-adapter]: Sorter-adapters.md#stable_adapter-make_stable-and-stable_t [std-greater-void]: https://en.cppreference.com/w/cpp/utility/functional/greater_void diff --git a/docs/Tooling.md b/docs/Tooling.md index 83b329bc..e3c7918d 100644 --- a/docs/Tooling.md +++ b/docs/Tooling.md @@ -26,20 +26,27 @@ target_link_libraries(my-target PRIVATE cpp-sort::cpp-sort) The project's CMake files offers some options, though they are mainly used to configure the test suite and examples: * `CPPSORT_BUILD_TESTING`: whether to build the test suite, defaults to `ON`. -* `CPPSORT_BUILD_EXAMPLES`: whether to build the examples, defaults to `OFF`. +* `CPPSORT_BUILD_EXAMPLES`: whether to build the examples, defaults to `OFF`. * `CPPSORT_ENABLE_COVERAGE`: whether to produce code coverage information when building the test suite, defaults to `OFF`. * `CPPSORT_USE_VALGRIND`: whether to run the test suite through Valgrind, defaults to `OFF`. * `CPPSORT_SANITIZE`: comma-separated list of values to pass to the `-fsanitize` flag of compilers that support it, defaults to an empty string. * `CPPSORT_STATIC_TESTS`: when `ON`, some tests are executed at compile time instead of runtime, defaults to `OFF`. +* `CPPSORT_ENABLE_ASSERTIONS`: when `ON`, defines the eponymous macro which enables debug assertions from the library's internals, defaults to the value of `CPPSORT_ENABLE_AUDITS`. +* `CPPSORT_ENABLE_AUDITS`: when `ON`, defines the eponymous macro which enables expensive debug assertions from the library's internals, defaults to `OFF`. +* `CPPSORT_USE_LIBASSERT` (experimental): when `ON`, internal assertions use [libassert][libassert] instead of the standard `assert` macro, providing additional information about the errors. Defaults to `OFF`. Some of those options also exist without the `CPPSORT_` prefix, but they are deprecated. For compatibility reasons, the options with the `CPPSORT_` prefix default to the values of the equivalent unprefixed options. +Note: when `CPPSORT_ENABLE_AUDITS` is `ON`, assertions in the library are enabled even if `CPPSORT_ENABLE_ASSERTIONS` is `OFF`. See [the relevant page][assertions-and-audits] for more information. + *New in version 1.6.0:* added the option `BUILD_EXAMPLES`. *New in version 1.9.0:* options with the `CPPSORT_` prefix. *New in version 1.13.0:* added the option `CPPSORT_STATIC_TESTS`. +*New in version 1.15.0:* `CPPSORT_ENABLE_ASSERTIONS`, `CPPSORT_ENABLE_AUDITS` and `CPPSORT_USE_LIBASSERT`. + ***WARNING:** options without a `CPPSORT_` prefixed are deprecated in version 1.9.0 and removed in version 2.0.0.* [Catch2][catch2] 3.0.0-preview4 or greater is required to build the tests: if a suitable version has been installed on the system it will be used, otherwise the latest suitable Catch2 release will be downloaded. @@ -53,16 +60,18 @@ Some of those options also exist without the `CPPSORT_` prefix, but they are dep **cpp-sort** is available directly on [Conan Center][conan-center]. You can find the different versions available with the following command: ```sh -conan search cpp-sort --remote=conan-center +conan search cpp-sort --remote=conancenter ``` -And then install any version to your local cache as follows (here with version 1.14.0): +And then install any version to your local cache as follows (here with version 1.15.0): ```sh -conan install cpp-sort/1.14.0 +conan install --requires=cpp-sort/1.15.0 ``` -The packages downloaded from conan-center are minimal and only contain the files required to use **cpp-sort** as a library: the headers, CMake files and licensing information. If you need anything else you have to build your own package with the `conanfile.py` available in this repository. +The packages downloaded from conan-center are minimal and only contain the files required to use **cpp-sort** as a library: the headers, CMake files and licensing information. If you need anything else you have to create your own package with the `conanfile.py` available in this repository. + +*Changed in version 1.15.0:* the recipes now only target conan 2.X. ## Gollum @@ -77,8 +86,10 @@ This can notably used to browse old versions of the documentation. It seems howe Due to slight markup differences, some pages might not fully render correctly but it should nonetheless be a better experience than navigaitng the Markdown files by hand. + [assertions-and-audits]: Home.md#assertions--audits [catch2]: https://github.com/catchorg/Catch2 [cmake]: https://cmake.org/ [conan]: https://conan.io/ - [conan-center]: https://conan.io/center/cpp-sort + [conan-center]: https://conan.io/center/recipes/cpp-sort [gollum]: https://github.com/gollum/gollum + [libassert]: https://github.com/jeremy-rifkin/libassert diff --git a/docs/_Sidebar.md b/docs/_Sidebar.md index 8c7458b9..ec6c6d32 100644 --- a/docs/_Sidebar.md +++ b/docs/_Sidebar.md @@ -6,6 +6,7 @@ * [Sorters](Sorters.md) * [Fixed-size sorters](Fixed-size-sorters.md) * [Sorter adapters](Sorter-adapters.md) + * [Metrics](Metrics.md) * [Sorter facade](Sorter-facade.md) * [Sorter traits](Sorter-traits.md) * [Measures of presortedness](Measures-of-presortedness.md) diff --git a/include/cpp-sort/adapters/split_adapter.h b/include/cpp-sort/adapters/split_adapter.h index f56cbe31..0b038aa9 100644 --- a/include/cpp-sort/adapters/split_adapter.h +++ b/include/cpp-sort/adapters/split_adapter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Morwenn + * Copyright (c) 2022-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_ADAPTERS_SPLIT_ADAPTER_H_ @@ -26,28 +26,6 @@ namespace cppsort namespace detail { - template - struct split_adapter_iterator_category - { - using type = std::bidirectional_iterator_tag; - }; - - template - struct split_adapter_iterator_category< - Sorter, - void_t::iterator_category> - > - { - using type = detail::conditional_t< - std::is_base_of< - std::bidirectional_iterator_tag, - typename sorter_traits::iterator_category - >::value, - typename sorter_traits::iterator_category, - std::bidirectional_iterator_tag - >; - }; - template struct split_adapter_impl: utility::adapter_storage @@ -86,8 +64,7 @@ namespace cppsort //////////////////////////////////////////////////////////// // Sorter traits - using iterator_category - = typename split_adapter_iterator_category::type; + using iterator_category = typename bidir_at_best_tag::type; using is_always_stable = std::false_type; }; } diff --git a/include/cpp-sort/adapters/stable_adapter.h b/include/cpp-sort/adapters/stable_adapter.h index 4472669e..ba01af2f 100644 --- a/include/cpp-sort/adapters/stable_adapter.h +++ b/include/cpp-sort/adapters/stable_adapter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021 Morwenn + * Copyright (c) 2016-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_ADAPTERS_STABLE_ADAPTER_H_ @@ -24,7 +24,6 @@ #include "../detail/immovable_vector.h" #include "../detail/iterator_traits.h" #include "../detail/raw_checkers.h" -#include "../detail/sized_iterator.h" #include "../detail/type_traits.h" namespace cppsort @@ -115,26 +114,6 @@ namespace cppsort ); } - template< - typename ForwardIterator, - typename Compare, - typename Projection, - typename Sorter - > - auto make_stable_and_sort(sized_iterator first, difference_type_t size, - Compare&& compare, Projection&& projection, Sorter&& sorter) - -> decltype(auto) - { - // Hack to get the stable bidirectional version of vergesort - // to work correctly without duplicating tons of code - return make_stable_and_sort( - first.base(), size, - std::forward(compare), - std::forward(projection), - std::forward(sorter) - ); - } - //////////////////////////////////////////////////////////// // make_stable_impl @@ -178,8 +157,7 @@ namespace cppsort Compare compare={}, Projection projection={}) const -> decltype(auto) { - using std::distance; // Hack for sized_iterator - return make_stable_and_sort(first, distance(first, last), + return make_stable_and_sort(first, std::distance(first, last), std::move(compare), std::move(projection), this->get()); } diff --git a/include/cpp-sort/adapters/verge_adapter.h b/include/cpp-sort/adapters/verge_adapter.h index 4714c9e2..b9a9f8c2 100644 --- a/include/cpp-sort/adapters/verge_adapter.h +++ b/include/cpp-sort/adapters/verge_adapter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2022 Morwenn + * Copyright (c) 2017-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_ADAPTERS_VERGE_ADAPTER_H_ @@ -38,23 +38,49 @@ namespace cppsort {} template< - typename RandomAccessIterator, + typename BidirectionalIterable, typename Compare = std::less<>, typename Projection = utility::identity, typename = detail::enable_if_t< - is_projection_iterator_v + is_projection_v > > - auto operator()(RandomAccessIterator first, RandomAccessIterator last, + auto operator()(BidirectionalIterable&& iterable, Compare compare={}, Projection projection={}) const -> void { static_assert( std::is_base_of< iterator_category, - iterator_category_t + iterator_category_t >::value, - "verge_adapter requires at least random-access iterators" + "verge_adapter requires a stronger iterator category" + ); + + verge::sort(std::begin(iterable), std::end(iterable), + utility::size(iterable), + std::move(compare), std::move(projection), + this->get()); + } + + template< + typename BidirectionalIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t< + is_projection_iterator_v + > + > + auto operator()(BidirectionalIterator first, BidirectionalIterator last, + Compare compare={}, Projection projection={}) const + -> void + { + static_assert( + std::is_base_of< + iterator_category, + iterator_category_t + >::value, + "verge_adapter requires a stronger iterator category" ); verge::sort(std::move(first), std::move(last), last - first, @@ -65,7 +91,7 @@ namespace cppsort //////////////////////////////////////////////////////////// // Sorter traits - using iterator_category = std::random_access_iterator_tag; + using iterator_category = typename bidir_at_best_tag::type; using is_always_stable = std::integral_constant; }; } diff --git a/include/cpp-sort/comparators/flip.h b/include/cpp-sort/comparators/flip.h index f62f908b..4543a733 100644 --- a/include/cpp-sort/comparators/flip.h +++ b/include/cpp-sort/comparators/flip.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Morwenn + * Copyright (c) 2021-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_COMPARATORS_FLIP_H_ @@ -166,15 +166,6 @@ namespace cppsort func.projection() ); } - - static constexpr auto construct(projection_compare&& func) - -> type - { - return type( - detail::flip_impl::construct(std::move(func.comparison())), - std::move(func.projection()) - ); - } }; } diff --git a/include/cpp-sort/comparators/not_fn.h b/include/cpp-sort/comparators/not_fn.h index 1baa2da9..4c319e5c 100644 --- a/include/cpp-sort/comparators/not_fn.h +++ b/include/cpp-sort/comparators/not_fn.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Morwenn + * Copyright (c) 2021-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_COMPARATORS_NOT_FN_H_ @@ -165,15 +165,6 @@ namespace cppsort func.projection() ); } - - static constexpr auto construct(projection_compare&& func) - -> type - { - return type( - detail::not_fn_impl::construct(std::move(func.comparison())), - std::move(func.projection()) - ); - } }; } diff --git a/include/cpp-sort/detail/binary_tree.h b/include/cpp-sort/detail/binary_tree.h new file mode 100644 index 00000000..3e56e862 --- /dev/null +++ b/include/cpp-sort/detail/binary_tree.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2022 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_DETAIL_BINARY_TREE_H_ +#define CPPSORT_DETAIL_BINARY_TREE_H_ + +namespace cppsort +{ +namespace detail +{ + struct binary_tree_node_base + { + constexpr binary_tree_node_base(binary_tree_node_base* parent, + binary_tree_node_base* left_child, + binary_tree_node_base* right_child) noexcept: + parent(parent), + left_child(left_child), + right_child(right_child) + {} + + // Make tree nodes immovable + binary_tree_node_base(const binary_tree_node_base&) = delete; + binary_tree_node_base(binary_tree_node_base&&) = delete; + binary_tree_node_base& operator=(const binary_tree_node_base&) = delete; + binary_tree_node_base& operator=(binary_tree_node_base&&) = delete; + + // Parent node + binary_tree_node_base* parent; + // Children nodes + binary_tree_node_base* left_child; + binary_tree_node_base* right_child; + }; + + template + struct binary_tree_node: + binary_tree_node_base + { + constexpr binary_tree_node(T&& value, binary_tree_node_base* parent, + binary_tree_node_base* left_child = nullptr, + binary_tree_node_base* right_child = nullptr) + noexcept(std::is_nothrow_move_constructible::value): + binary_tree_node_base(parent, left_child, right_child), + value(std::move(value)) + {} + + // Stored value + T value; + }; +}} + +#endif // CPPSORT_DETAIL_BINARY_TREE_H_ diff --git a/include/cpp-sort/detail/cartesian_tree_sort.h b/include/cpp-sort/detail/cartesian_tree_sort.h index f2dc73d5..2f273ca0 100644 --- a/include/cpp-sort/detail/cartesian_tree_sort.h +++ b/include/cpp-sort/detail/cartesian_tree_sort.h @@ -15,41 +15,16 @@ #include #include #include -#include "../detail/heapsort.h" -#include "../detail/immovable_vector.h" -#include "../detail/iterator_traits.h" -#include "../detail/type_traits.h" +#include "binary_tree.h" +#include "heapsort.h" +#include "immovable_vector.h" +#include "iterator_traits.h" +#include "type_traits.h" namespace cppsort { namespace detail { - template - struct cartesian_tree_node - { - constexpr cartesian_tree_node(T&& value, cartesian_tree_node* parent, cartesian_tree_node* left_child) - noexcept(std::is_nothrow_move_constructible::value): - value(std::move(value)), - parent(parent), - left_child(left_child) - {} - - // Make tree nodes immovable - cartesian_tree_node(const cartesian_tree_node&) = delete; - cartesian_tree_node(cartesian_tree_node&&) = delete; - cartesian_tree_node& operator=(const cartesian_tree_node&) = delete; - cartesian_tree_node& operator=(cartesian_tree_node&&) = delete; - - // Stored value - T value; - - // Parent node - cartesian_tree_node* parent = nullptr; - // Children nodes - cartesian_tree_node* left_child = nullptr; - cartesian_tree_node* right_child = nullptr; - }; - template struct cartesian_tree { @@ -59,7 +34,7 @@ namespace detail // Public types using difference_type = std::ptrdiff_t; - using node_type = cartesian_tree_node; + using node_type = binary_tree_node; //////////////////////////////////////////////////////////// // Constructor @@ -98,7 +73,7 @@ namespace detail //////////////////////////////////////////////////////////// // Accessors - auto root() const + auto root() const noexcept -> node_type* { return root_; @@ -121,7 +96,7 @@ namespace detail if (prev_node == root_) { return nullptr; } - prev_node = prev_node->parent; + prev_node = static_cast(prev_node->parent); } return prev_node; } @@ -149,20 +124,20 @@ namespace detail } tree_type tree(first, last, size, compare, projection); - std::vector pq; // Priority queue + std::vector pq; // Priority queue pq.push_back(tree.root()); auto&& comp = cppsort::flip(compare); auto proj_value = [proj=utility::as_function(projection)](auto* node) -> decltype(auto) { - return proj(node->value); + return proj(static_cast(node)->value); }; while (not pq.empty()) { // Retrieve biggest element - node_type* node = pq.front(); + auto* node = pq.front(); // Add the element back to the original collection - *first = std::move(node->value); + *first = std::move(static_cast(node)->value); ++first; // Add the node's children to the priority queue diff --git a/include/cpp-sort/detail/config.h b/include/cpp-sort/detail/config.h index 98660a17..020c19aa 100644 --- a/include/cpp-sort/detail/config.h +++ b/include/cpp-sort/detail/config.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2022 Morwenn + * Copyright (c) 2016-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_CONFIG_H_ @@ -61,8 +61,16 @@ //////////////////////////////////////////////////////////// // General: assertions -#if defined(CPPSORT_ENABLE_ASSERTIONS) || defined(CPPSORT_ENABLE_AUDITS) +// Ensure that enabling audits always enables assertions +#if defined(CPPSORT_ENABLE_AUDITS) +# define CPPSORT_ENABLE_ASSERTIONS +#endif + +#if defined(CPPSORT_ENABLE_ASSERTIONS) # include +# if defined(CPPSORT_USE_LIBASSERT) +# include +# endif #endif //////////////////////////////////////////////////////////// @@ -72,12 +80,22 @@ // than just relying on NDEBUG, so assertions have to be // explicitly enabled in cpp-sort -#ifndef CPPSORT_ASSERT -# ifdef CPPSORT_ENABLE_ASSERTIONS -# define CPPSORT_ASSERT(...) assert((__VA_ARGS__)) -# else -# define CPPSORT_ASSERT(...) +#if !defined(NDEBUG) && defined(CPPSORT_ENABLE_ASSERTIONS) +# if !defined(CPPSORT_ASSERT) +# if defined(CPPSORT_USE_LIBASSERT) +# define CPPSORT_ASSERT(...) ASSERT(__VA_ARGS__) +# else +# define CPPSORT_ARG2(_0, _1, _2, ...) _2 +# define CPPSORT_NARG2(...) CPPSORT_ARG2(__VA_ARGS__, 2, 1, 0) +# define CPPSORT_ONE_OR_TWO_ARGS_1(condition) assert(condition) +# define CPPSORT_ONE_OR_TWO_ARGS_2(condition, message) assert(condition && message) +# define CPPSORT_ONE_OR_TWO_ARGS_N(N, ...) CPPSORT_ONE_OR_TWO_ARGS_##N(__VA_ARGS__) +# define CPPSORT_ONE_OR_TWO_ARGS(N, ...) CPPSORT_ONE_OR_TWO_ARGS_N(N, __VA_ARGS__) +# define CPPSORT_ASSERT(...) CPPSORT_ONE_OR_TWO_ARGS(CPPSORT_NARG2(__VA_ARGS__), __VA_ARGS__) +# endif # endif +#else +# define CPPSORT_ASSERT(...) ((void)0) #endif //////////////////////////////////////////////////////////// @@ -87,12 +105,12 @@ // scenarios, but still of great help when debugging tough // problems, hence this audit feature -#ifndef CPPSORT_AUDIT -# ifdef CPPSORT_ENABLE_AUDITS -# define CPPSORT_AUDIT(...) assert((__VA_ARGS__)) -# else -# define CPPSORT_AUDIT(...) +#if !defined(NDEBUG) && defined(CPPSORT_ENABLE_AUDITS) +# ifndef CPPSORT_AUDIT +# define CPPSORT_AUDIT(...) CPPSORT_ASSERT(__VA_ARGS__) # endif +#else +# define CPPSORT_AUDIT(...) ((void)0) #endif //////////////////////////////////////////////////////////// @@ -105,7 +123,7 @@ // actually correct. #if defined(CPPSORT_ENABLE_AUDITS) -# define CPPSORT_ASSUME(...) assert((__VA_ARGS__)) +# define CPPSORT_ASSUME(...) CPPSORT_ASSERT(__VA_ARGS__) #elif defined(__GNUC__) # define CPPSORT_ASSUME(expression) do { if (!(expression)) __builtin_unreachable(); } while(0) #elif defined(__clang__) @@ -113,7 +131,7 @@ #elif defined(_MSC_VER) # define CPPSORT_ASSUME(expression) __assume(expression) #else -# define CPPSORT_ASSUME(cond) +# define CPPSORT_ASSUME(cond) ((void)0) #endif //////////////////////////////////////////////////////////// @@ -123,14 +141,14 @@ // clause of a switch when we know the default can never be // reached -#if defined(CPPSORT_ENABLE_AUDITS) -# define CPPSORT_UNREACHABLE CPPSORT_ASSERT("unreachable", false); +#if !defined(NDEBUG) && defined(CPPSORT_ENABLE_AUDITS) +# define CPPSORT_UNREACHABLE CPPSORT_ASSERT(false, "unreachable") #elif defined(__GNUC__) || defined(__clang__) # define CPPSORT_UNREACHABLE __builtin_unreachable() #elif defined(_MSC_VER) # define CPPSORT_UNREACHABLE __assume(false) #else -# define CPPSORT_UNREACHABLE +# define CPPSORT_UNREACHABLE ((void)0) #endif //////////////////////////////////////////////////////////// diff --git a/include/cpp-sort/detail/empty_sorter.h b/include/cpp-sort/detail/empty_sorter.h index 99be395a..105f9feb 100644 --- a/include/cpp-sort/detail/empty_sorter.h +++ b/include/cpp-sort/detail/empty_sorter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Morwenn + * Copyright (c) 2021-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_EMPTY_SORTER_H_ @@ -52,7 +52,7 @@ namespace detail { template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 0> { return {}; diff --git a/include/cpp-sort/detail/fixed_size_list.h b/include/cpp-sort/detail/fixed_size_list.h index 80ef28f8..6ac87105 100644 --- a/include/cpp-sort/detail/fixed_size_list.h +++ b/include/cpp-sort/detail/fixed_size_list.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Morwenn + * Copyright (c) 2020-2022 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_FIXED_SIZE_LIST_H_ @@ -180,7 +180,7 @@ namespace detail // Node providing/retrieval CPPSORT_ATTRIBUTE_NODISCARD - auto next_free_node() + auto next_free_node() noexcept -> node_type* { // Retrieve next free node @@ -190,7 +190,7 @@ namespace detail return static_cast(new_node); } - auto retrieve_nodes(list_node_base* first, list_node_base* last) + auto retrieve_nodes(list_node_base* first, list_node_base* last) noexcept -> void { // Get back a range of nodes linked together, this function @@ -218,11 +218,11 @@ namespace detail // Using this function incorrectly *will* fuck everything // and its invariants up. - auto reset_nodes(std::ptrdiff_t until_n) + auto reset_nodes(std::ptrdiff_t until_n) noexcept -> void { auto ptr = buffer_.get(); - for (std::ptrdiff_t n = 0 ; n < until_n - 1 ; ++n, ++ptr) { + for (std::ptrdiff_t n = 0; n < until_n - 1; ++n, ++ptr) { ptr->next = ptr + 1; } if (until_n == capacity_) { @@ -286,7 +286,7 @@ namespace detail // Members access CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto base() const + constexpr auto base() const noexcept -> node_type* { return static_cast(ptr_); @@ -296,14 +296,14 @@ namespace detail // Element access CPPSORT_ATTRIBUTE_NODISCARD - auto operator*() const + auto operator*() const noexcept -> reference { return static_cast(ptr_)->value; } CPPSORT_ATTRIBUTE_NODISCARD - auto operator->() const + auto operator->() const noexcept -> pointer { return &(operator*()); @@ -312,14 +312,14 @@ namespace detail //////////////////////////////////////////////////////////// // Increment/decrement operators - auto operator++() + auto operator++() noexcept -> fixed_size_list_iterator& { ptr_ = ptr_->next; return *this; } - auto operator++(int) + auto operator++(int) noexcept -> fixed_size_list_iterator { auto tmp = *this; @@ -327,14 +327,14 @@ namespace detail return tmp; } - auto operator--() + auto operator--() noexcept -> fixed_size_list_iterator& { ptr_ = ptr_->prev; return *this; } - auto operator--(int) + auto operator--(int) noexcept -> fixed_size_list_iterator { auto tmp = *this; @@ -346,14 +346,14 @@ namespace detail // Comparison operators CPPSORT_ATTRIBUTE_NODISCARD - friend constexpr auto operator==(const fixed_size_list_iterator& lhs, const fixed_size_list_iterator& rhs) + friend constexpr auto operator==(const fixed_size_list_iterator& lhs, const fixed_size_list_iterator& rhs) noexcept -> bool { return lhs.base() == rhs.base(); } CPPSORT_ATTRIBUTE_NODISCARD - friend constexpr auto operator!=(const fixed_size_list_iterator& lhs, const fixed_size_list_iterator& rhs) + friend constexpr auto operator!=(const fixed_size_list_iterator& lhs, const fixed_size_list_iterator& rhs) noexcept -> bool { return lhs.base() != rhs.base(); @@ -492,21 +492,21 @@ namespace detail // Element access CPPSORT_ATTRIBUTE_NODISCARD - auto front() + auto front() noexcept -> reference { return static_cast(sentinel_node_.next)->value; } CPPSORT_ATTRIBUTE_NODISCARD - auto back() + auto back() noexcept -> reference { return static_cast(sentinel_node_.prev)->value; } CPPSORT_ATTRIBUTE_NODISCARD - auto node_pool() + auto node_pool() noexcept -> fixed_size_list_node_pool& { return *node_pool_; @@ -516,14 +516,14 @@ namespace detail // Iterators CPPSORT_ATTRIBUTE_NODISCARD - auto begin() + auto begin() noexcept -> iterator { return iterator(sentinel_node_.next); } CPPSORT_ATTRIBUTE_NODISCARD - auto end() + auto end() noexcept -> iterator { return iterator(&sentinel_node_); @@ -593,7 +593,7 @@ namespace detail } CPPSORT_ATTRIBUTE_NODISCARD - auto extract(list_node_base* node) + auto extract(list_node_base* node) noexcept -> node_type* { CPPSORT_ASSERT(node != &sentinel_node_); @@ -604,27 +604,27 @@ namespace detail } CPPSORT_ATTRIBUTE_NODISCARD - auto extract(iterator pos) + auto extract(iterator pos) noexcept -> node_type* { return extract(pos.base()); } CPPSORT_ATTRIBUTE_NODISCARD - auto extract_back() + auto extract_back() noexcept -> node_type* { return extract(sentinel_node_.prev); } CPPSORT_ATTRIBUTE_NODISCARD - auto extract_front() + auto extract_front() noexcept -> node_type* { return extract(sentinel_node_.next); } - auto set_node_destructor(node_value_destructor_t node_destructor) + auto set_node_destructor(node_value_destructor_t node_destructor) noexcept -> void { node_destructor_ = std::move(node_destructor); @@ -754,7 +754,7 @@ namespace detail other.sentinel_node_.prev = &other.sentinel_node_; } - auto splice(iterator pos, fixed_size_list& other) + auto splice(iterator pos, fixed_size_list& other) noexcept -> void { if (other.is_empty()) { @@ -763,7 +763,7 @@ namespace detail splice(pos, other, other.begin(), other.end()); } - auto splice(iterator pos, fixed_size_list&, iterator first, iterator last) + auto splice(iterator pos, fixed_size_list&, iterator first, iterator last) noexcept -> void { CPPSORT_ASSERT(first.base() != last.base()); @@ -814,7 +814,7 @@ namespace detail return new_node; } - auto link_node_before_(list_node_base* node, list_node_base* pos) + auto link_node_before_(list_node_base* node, list_node_base* pos) noexcept -> void { // Relink pointers to a new node @@ -824,7 +824,7 @@ namespace detail node->next->prev = node; } - auto fast_splice_(iterator pos, iterator first, iterator last) + auto fast_splice_(iterator pos, iterator first, iterator last) noexcept -> void { CPPSORT_ASSERT(first.base() != last.base()); diff --git a/include/cpp-sort/detail/immovable_vector.h b/include/cpp-sort/detail/immovable_vector.h index 0cd6f1fe..55276212 100644 --- a/include/cpp-sort/detail/immovable_vector.h +++ b/include/cpp-sort/detail/immovable_vector.h @@ -72,21 +72,21 @@ namespace detail //////////////////////////////////////////////////////////// // Element access - auto operator[](std::ptrdiff_t pos) + auto operator[](std::ptrdiff_t pos) noexcept -> T& { CPPSORT_ASSERT(pos <= end_ - memory_); return memory_[pos]; } - auto front() + auto front() noexcept -> T& { CPPSORT_ASSERT(memory_ != end_); return *memory_; } - auto back() + auto back() noexcept -> T& { CPPSORT_ASSERT(end_ - memory_ > 0); @@ -96,13 +96,13 @@ namespace detail //////////////////////////////////////////////////////////// // Iterators - auto begin() + auto begin() noexcept -> T* { return memory_; } - auto end() + auto end() noexcept -> T* { return end_; diff --git a/include/cpp-sort/detail/merge_insertion_sort.h b/include/cpp-sort/detail/merge_insertion_sort.h index 14e43e7a..984a2fe0 100644 --- a/include/cpp-sort/detail/merge_insertion_sort.h +++ b/include/cpp-sort/detail/merge_insertion_sort.h @@ -120,16 +120,6 @@ namespace detail return *this; } - //////////////////////////////////////////////////////////// - // Elements access operators - - CPPSORT_ATTRIBUTE_NODISCARD - auto operator[](difference_type pos) const - -> decltype(base()[pos]) - { - return _it[pos * _size + _size - 1]; - } - //////////////////////////////////////////////////////////// // Comparison operators diff --git a/include/cpp-sort/detail/quick_merge_sort.h b/include/cpp-sort/detail/quick_merge_sort.h index fd853d04..66097798 100644 --- a/include/cpp-sort/detail/quick_merge_sort.h +++ b/include/cpp-sort/detail/quick_merge_sort.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2022 Morwenn + * Copyright (c) 2018-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_QUICK_MERGE_SORT_H_ @@ -17,7 +17,6 @@ #include "iterator_traits.h" #include "nth_element.h" #include "quicksort.h" -#include "sized_iterator.h" #include "swap_ranges.h" namespace cppsort @@ -150,18 +149,6 @@ namespace detail } small_sort(first, last, std::move(compare), std::move(projection)); } - - template - auto quick_merge_sort(sized_iterator first, sized_iterator last, - difference_type_t size, - Compare compare, Projection projection) - -> void - { - // Hack to get the stable bidirectional version of vergesort - // to work correctly without duplicating tons of code - quick_merge_sort(first.base(), last.base(), size, - std::move(compare), std::move(projection)); - } }} #endif // CPPSORT_DETAIL_QUICK_MERGE_SORT_H_ diff --git a/include/cpp-sort/detail/sized_iterator.h b/include/cpp-sort/detail/sized_iterator.h deleted file mode 100644 index 03fba901..00000000 --- a/include/cpp-sort/detail/sized_iterator.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2020-2022 Morwenn - * SPDX-License-Identifier: MIT - */ -#ifndef CPPSORT_DETAIL_SIZED_ITERATOR_H_ -#define CPPSORT_DETAIL_SIZED_ITERATOR_H_ - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include "attributes.h" -#include "iterator_traits.h" - -namespace cppsort -{ -namespace detail -{ - //////////////////////////////////////////////////////////// - // Mostly a hack to avoid some gratuitous performance loss - // by passing bidirectional iterators + size to a function - // accepting a pair of iterators. It is worse than the - // equivalent C++20 features, but should be good enough for - // the internal use we make of it. - // - // NOTE: the full iterator features are not provided, this - // is intentional to avoid unintentional uses of the - // class in the library's internals. - - template - class sized_iterator - { - public: - - //////////////////////////////////////////////////////////// - // Public types - - using iterator_category = iterator_category_t; - using iterator_type = Iterator; - using value_type = value_type_t; - using difference_type = difference_type_t; - using pointer = pointer_t; - using reference = reference_t; - - //////////////////////////////////////////////////////////// - // Constructors - - sized_iterator() = default; - - constexpr sized_iterator(Iterator it, difference_type size): - _it(std::move(it)), - _size(size) - {} - - //////////////////////////////////////////////////////////// - // Members access - - CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto base() const - -> iterator_type - { - return _it; - } - - CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto size() const - -> difference_type - { - return _size; - } - - //////////////////////////////////////////////////////////// - // Element access - - CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto operator*() const - -> reference - { - return *_it; - } - - CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto operator->() const - -> pointer - { - return &(operator*()); - } - - private: - - Iterator _it; - difference_type _size; - }; - - // Alternative to std::distance meant to be picked up by ADL in - // specific places, uses the size of the *second* iterator - template - CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto distance(sized_iterator, sized_iterator last) - -> difference_type_t - { - return last.size(); - } - - template - CPPSORT_ATTRIBUTE_NODISCARD - constexpr auto make_sized_iterator(Iterator it, difference_type_t size) - -> sized_iterator - { - return { it, size }; - } - -}} - -#endif // CPPSORT_DETAIL_SIZED_ITERATOR_H_ diff --git a/include/cpp-sort/detail/sized_range.h b/include/cpp-sort/detail/sized_range.h new file mode 100644 index 00000000..cffcccc4 --- /dev/null +++ b/include/cpp-sort/detail/sized_range.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_DETAIL_SIZED_RANGE_H_ +#define CPPSORT_DETAIL_SIZED_RANGE_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include "config.h" +#include "iterator_traits.h" + +namespace cppsort +{ +namespace detail +{ + // Very simple class to bundle together a pair of begin/end + // iterators and a corresponding size - shallow constness + + template + class sized_range + { + public: + + constexpr sized_range(ForwardIterator begin, ForwardIterator end, + difference_type_t size): + begin_(begin), + end_(end), + size_(size) + { + using category = iterator_category_t; + if (std::is_base_of::value) { + CPPSORT_ASSERT(std::distance(begin, end) == size); + } else { + CPPSORT_AUDIT(std::distance(begin, end) == size); + } + } + + constexpr auto begin() const + -> ForwardIterator + { + return begin_; + } + + constexpr auto end() const + -> ForwardIterator + { + return end_; + } + + constexpr auto size() const noexcept + -> difference_type_t + { + return size_; + } + + private: + + ForwardIterator begin_; + ForwardIterator end_; + difference_type_t size_; + }; + + template + constexpr auto make_sized_range(ForwardIterator begin, ForwardIterator end, + difference_type_t size) + -> sized_range + { + return sized_range(std::move(begin), std::move(end), size); + } +}} + +#endif // CPPSORT_DETAIL_SIZED_RANGE_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort10.h b/include/cpp-sort/detail/sorting_network/sort10.h index 374801fd..6cb77ee9 100644 --- a/include/cpp-sort/detail/sorting_network/sort10.h +++ b/include/cpp-sort/detail/sorting_network/sort10.h @@ -57,7 +57,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 29> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort11.h b/include/cpp-sort/detail/sorting_network/sort11.h index 202e2989..9b11bb74 100644 --- a/include/cpp-sort/detail/sorting_network/sort11.h +++ b/include/cpp-sort/detail/sorting_network/sort11.h @@ -63,7 +63,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 35> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort12.h b/include/cpp-sort/detail/sorting_network/sort12.h index 6bda26cd..cb8f1dd9 100644 --- a/include/cpp-sort/detail/sorting_network/sort12.h +++ b/include/cpp-sort/detail/sorting_network/sort12.h @@ -67,7 +67,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 39> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort13.h b/include/cpp-sort/detail/sorting_network/sort13.h index c012ae0d..493d9d47 100644 --- a/include/cpp-sort/detail/sorting_network/sort13.h +++ b/include/cpp-sort/detail/sorting_network/sort13.h @@ -73,7 +73,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 45> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort14.h b/include/cpp-sort/detail/sorting_network/sort14.h index aef91aee..85207f08 100644 --- a/include/cpp-sort/detail/sorting_network/sort14.h +++ b/include/cpp-sort/detail/sorting_network/sort14.h @@ -79,7 +79,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 51> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort15.h b/include/cpp-sort/detail/sorting_network/sort15.h index aa79732f..b721fdcf 100644 --- a/include/cpp-sort/detail/sorting_network/sort15.h +++ b/include/cpp-sort/detail/sorting_network/sort15.h @@ -84,7 +84,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 56> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort16.h b/include/cpp-sort/detail/sorting_network/sort16.h index b6ab2933..8a73d072 100644 --- a/include/cpp-sort/detail/sorting_network/sort16.h +++ b/include/cpp-sort/detail/sorting_network/sort16.h @@ -88,7 +88,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 60> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort17.h b/include/cpp-sort/detail/sorting_network/sort17.h index d1d1765b..f1ed625f 100644 --- a/include/cpp-sort/detail/sorting_network/sort17.h +++ b/include/cpp-sort/detail/sorting_network/sort17.h @@ -99,7 +99,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 71> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort18.h b/include/cpp-sort/detail/sorting_network/sort18.h index 134cb6eb..3ed4066b 100644 --- a/include/cpp-sort/detail/sorting_network/sort18.h +++ b/include/cpp-sort/detail/sorting_network/sort18.h @@ -105,7 +105,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 77> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort19.h b/include/cpp-sort/detail/sorting_network/sort19.h index f54e9d85..a397e0ba 100644 --- a/include/cpp-sort/detail/sorting_network/sort19.h +++ b/include/cpp-sort/detail/sorting_network/sort19.h @@ -113,7 +113,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 85> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort2.h b/include/cpp-sort/detail/sorting_network/sort2.h index 3c868ba0..bd76b412 100644 --- a/include/cpp-sort/detail/sorting_network/sort2.h +++ b/include/cpp-sort/detail/sorting_network/sort2.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2022 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT2_H_ @@ -7,36 +7,44 @@ namespace cppsort { -namespace detail -{ - template<> - struct sorting_network_sorter_impl<2> + namespace detail { - template< - typename RandomAccessIterator, - typename Compare = std::less<>, - typename Projection = utility::identity, - typename = detail::enable_if_t> - > - auto operator()(RandomAccessIterator first, RandomAccessIterator, - Compare compare={}, Projection projection={}) const - -> void + template<> + struct sorting_network_sorter_impl<2> { - iter_swap_if(first, first + 1, compare, projection); - } + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + } - template - CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() - -> std::array, 1> - { - return {{ - {0, 1}, - }}; - } + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 1> + { + return {{ + {0, 1}, + }}; + } + }; + } + + template<> + struct sorter_traits> + { + using iterator_category = std::random_access_iterator_tag; + using is_always_stable = std::true_type; }; -}} +} #endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT2_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort20.h b/include/cpp-sort/detail/sorting_network/sort20.h index 751dbfda..81dd4501 100644 --- a/include/cpp-sort/detail/sorting_network/sort20.h +++ b/include/cpp-sort/detail/sorting_network/sort20.h @@ -119,7 +119,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 91> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort21.h b/include/cpp-sort/detail/sorting_network/sort21.h index e0feac1c..ec21bc32 100644 --- a/include/cpp-sort/detail/sorting_network/sort21.h +++ b/include/cpp-sort/detail/sorting_network/sort21.h @@ -127,7 +127,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 99> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort22.h b/include/cpp-sort/detail/sorting_network/sort22.h index 0bf071db..8eec5220 100644 --- a/include/cpp-sort/detail/sorting_network/sort22.h +++ b/include/cpp-sort/detail/sorting_network/sort22.h @@ -134,7 +134,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 106> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort23.h b/include/cpp-sort/detail/sorting_network/sort23.h index 1b5bdcc7..776b643e 100644 --- a/include/cpp-sort/detail/sorting_network/sort23.h +++ b/include/cpp-sort/detail/sorting_network/sort23.h @@ -142,7 +142,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 114> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort24.h b/include/cpp-sort/detail/sorting_network/sort24.h index 95d96179..0269c645 100644 --- a/include/cpp-sort/detail/sorting_network/sort24.h +++ b/include/cpp-sort/detail/sorting_network/sort24.h @@ -148,7 +148,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 120> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort25.h b/include/cpp-sort/detail/sorting_network/sort25.h index 612f2515..838798f2 100644 --- a/include/cpp-sort/detail/sorting_network/sort25.h +++ b/include/cpp-sort/detail/sorting_network/sort25.h @@ -158,7 +158,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 130> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort26.h b/include/cpp-sort/detail/sorting_network/sort26.h index cef80e94..3b49b6d9 100644 --- a/include/cpp-sort/detail/sorting_network/sort26.h +++ b/include/cpp-sort/detail/sorting_network/sort26.h @@ -167,7 +167,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 139> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort27.h b/include/cpp-sort/detail/sorting_network/sort27.h index cbf9ec30..e2927d4a 100644 --- a/include/cpp-sort/detail/sorting_network/sort27.h +++ b/include/cpp-sort/detail/sorting_network/sort27.h @@ -30,138 +30,138 @@ namespace detail iter_swap_if(first + 6, first + 7, compare, projection); iter_swap_if(first + 8, first + 9, compare, projection); iter_swap_if(first + 10, first + 11, compare, projection); - iter_swap_if(first + 12, first + 13, compare, projection); - iter_swap_if(first + 14, first + 15, compare, projection); - iter_swap_if(first + 16, first + 17, compare, projection); - iter_swap_if(first + 18, first + 19, compare, projection); - iter_swap_if(first + 20, first + 21, compare, projection); - iter_swap_if(first + 22, first + 23, compare, projection); - iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); iter_swap_if(first, first + 2, compare, projection); iter_swap_if(first + 1, first + 3, compare, projection); iter_swap_if(first + 4, first + 6, compare, projection); iter_swap_if(first + 5, first + 7, compare, projection); iter_swap_if(first + 8, first + 10, compare, projection); iter_swap_if(first + 9, first + 11, compare, projection); - iter_swap_if(first + 12, first + 14, compare, projection); - iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); iter_swap_if(first + 16, first + 18, compare, projection); - iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); iter_swap_if(first + 20, first + 22, compare, projection); - iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); iter_swap_if(first + 24, first + 26, compare, projection); - iter_swap_if(first, first + 4, compare, projection); - iter_swap_if(first + 1, first + 5, compare, projection); - iter_swap_if(first + 2, first + 6, compare, projection); - iter_swap_if(first + 3, first + 7, compare, projection); - iter_swap_if(first + 8, first + 12, compare, projection); - iter_swap_if(first + 9, first + 13, compare, projection); - iter_swap_if(first + 10, first + 14, compare, projection); - iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first, first + 23, compare, projection); + iter_swap_if(first + 1, first + 24, compare, projection); + iter_swap_if(first + 2, first + 25, compare, projection); + iter_swap_if(first + 3, first + 26, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); iter_swap_if(first + 16, first + 20, compare, projection); iter_swap_if(first + 17, first + 21, compare, projection); iter_swap_if(first + 18, first + 22, compare, projection); - iter_swap_if(first + 19, first + 23, compare, projection); - iter_swap_if(first + 25, first + 26, compare, projection); - iter_swap_if(first, first + 8, compare, projection); - iter_swap_if(first + 1, first + 9, compare, projection); - iter_swap_if(first + 2, first + 10, compare, projection); - iter_swap_if(first + 3, first + 11, compare, projection); - iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 19, compare, projection); + iter_swap_if(first + 3, first + 20, compare, projection); iter_swap_if(first + 5, first + 13, compare, projection); - iter_swap_if(first + 6, first + 14, compare, projection); - iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); iter_swap_if(first + 18, first + 24, compare, projection); - iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 7, first + 22, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 4, first + 15, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 10, first + 19, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 15, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); iter_swap_if(first + 2, first + 8, compare, projection); - iter_swap_if(first + 3, first + 12, compare, projection); - iter_swap_if(first + 5, first + 10, compare, projection); - iter_swap_if(first + 6, first + 9, compare, projection); - iter_swap_if(first + 7, first + 13, compare, projection); - iter_swap_if(first + 11, first + 14, compare, projection); - iter_swap_if(first + 16, first + 18, compare, projection); - iter_swap_if(first + 17, first + 22, compare, projection); - iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); iter_swap_if(first + 21, first + 25, compare, projection); - iter_swap_if(first, first + 16, compare, projection); - iter_swap_if(first + 1, first + 8, compare, projection); - iter_swap_if(first + 5, first + 22, compare, projection); - iter_swap_if(first + 10, first + 24, compare, projection); - iter_swap_if(first + 11, first + 25, compare, projection); - iter_swap_if(first + 23, first + 26, compare, projection); - iter_swap_if(first + 1, first + 18, compare, projection); - iter_swap_if(first + 4, first + 8, compare, projection); - iter_swap_if(first + 5, first + 19, compare, projection); - iter_swap_if(first + 9, first + 26, compare, projection); - iter_swap_if(first + 10, first + 20, compare, projection); - iter_swap_if(first + 12, first + 23, compare, projection); - iter_swap_if(first + 21, first + 24, compare, projection); - iter_swap_if(first + 2, first + 10, compare, projection); - iter_swap_if(first + 3, first + 21, compare, projection); - iter_swap_if(first + 4, first + 17, compare, projection); - iter_swap_if(first + 6, first + 20, compare, projection); - iter_swap_if(first + 7, first + 24, compare, projection); - iter_swap_if(first + 8, first + 19, compare, projection); - iter_swap_if(first + 12, first + 18, compare, projection); - iter_swap_if(first + 14, first + 23, compare, projection); - iter_swap_if(first + 15, first + 26, compare, projection); - iter_swap_if(first + 2, first + 4, compare, projection); - iter_swap_if(first + 6, first + 10, compare, projection); - iter_swap_if(first + 7, first + 11, compare, projection); - iter_swap_if(first + 8, first + 16, compare, projection); - iter_swap_if(first + 9, first + 17, compare, projection); - iter_swap_if(first + 13, first + 19, compare, projection); - iter_swap_if(first + 14, first + 22, compare, projection); - iter_swap_if(first + 15, first + 23, compare, projection); - iter_swap_if(first + 20, first + 21, compare, projection); - iter_swap_if(first + 1, first + 8, compare, projection); - iter_swap_if(first + 3, first + 10, compare, projection); - iter_swap_if(first + 5, first + 9, compare, projection); - iter_swap_if(first + 12, first + 16, compare, projection); - iter_swap_if(first + 13, first + 18, compare, projection); - iter_swap_if(first + 14, first + 17, compare, projection); - iter_swap_if(first + 15, first + 24, compare, projection); - iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 17, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); iter_swap_if(first + 1, first + 2, compare, projection); - iter_swap_if(first + 3, first + 12, compare, projection); - iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); iter_swap_if(first + 7, first + 13, compare, projection); - iter_swap_if(first + 9, first + 16, compare, projection); - iter_swap_if(first + 11, first + 18, compare, projection); - iter_swap_if(first + 14, first + 20, compare, projection); - iter_swap_if(first + 17, first + 21, compare, projection); - iter_swap_if(first + 19, first + 22, compare, projection); - iter_swap_if(first + 23, first + 25, compare, projection); - iter_swap_if(first + 2, first + 4, compare, projection); - iter_swap_if(first + 3, first + 8, compare, projection); - iter_swap_if(first + 5, first + 12, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); iter_swap_if(first + 6, first + 9, compare, projection); - iter_swap_if(first + 7, first + 14, compare, projection); - iter_swap_if(first + 10, first + 16, compare, projection); - iter_swap_if(first + 11, first + 17, compare, projection); - iter_swap_if(first + 13, first + 20, compare, projection); - iter_swap_if(first + 15, first + 19, compare, projection); - iter_swap_if(first + 18, first + 21, compare, projection); - iter_swap_if(first + 23, first + 24, compare, projection); - iter_swap_if(first + 5, first + 6, compare, projection); - iter_swap_if(first + 7, first + 10, compare, projection); - iter_swap_if(first + 9, first + 12, compare, projection); - iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); iter_swap_if(first + 14, first + 16, compare, projection); - iter_swap_if(first + 15, first + 18, compare, projection); - iter_swap_if(first + 17, first + 20, compare, projection); - iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); iter_swap_if(first + 3, first + 5, compare, projection); iter_swap_if(first + 6, first + 8, compare, projection); iter_swap_if(first + 7, first + 9, compare, projection); iter_swap_if(first + 10, first + 12, compare, projection); iter_swap_if(first + 11, first + 14, compare, projection); iter_swap_if(first + 13, first + 16, compare, projection); - iter_swap_if(first + 15, first + 17, compare, projection); - iter_swap_if(first + 18, first + 20, compare, projection); - iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); iter_swap_if(first + 3, first + 4, compare, projection); iter_swap_if(first + 5, first + 6, compare, projection); iter_swap_if(first + 7, first + 8, compare, projection); @@ -171,30 +171,30 @@ namespace detail iter_swap_if(first + 15, first + 16, compare, projection); iter_swap_if(first + 17, first + 18, compare, projection); iter_swap_if(first + 19, first + 20, compare, projection); - iter_swap_if(first + 21, first + 22, compare, projection); } template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() - -> std::array, 148> + static constexpr auto index_pairs() noexcept + -> std::array, 147> { return {{ - {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, - {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, - {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {25, 26}, - {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {18, 24}, {20, 26}, {22, 25}, - {2, 8}, {3, 12}, {5, 10}, {6, 9}, {7, 13}, {11, 14}, {16, 18}, {17, 22}, {19, 26}, {21, 25}, - {0, 16}, {1, 8}, {5, 22}, {10, 24}, {11, 25}, {23, 26}, - {1, 18}, {4, 8}, {5, 19}, {9, 26}, {10, 20}, {12, 23}, {21, 24}, - {2, 10}, {3, 21}, {4, 17}, {6, 20}, {7, 24}, {8, 19}, {12, 18}, {14, 23}, {15, 26}, - {2, 4}, {6, 10}, {7, 11}, {8, 16}, {9, 17}, {13, 19}, {14, 22}, {15, 23}, {20, 21}, - {1, 8}, {3, 10}, {5, 9}, {12, 16}, {13, 18}, {14, 17}, {15, 24}, {19, 25}, - {1, 2}, {3, 12}, {4, 8}, {7, 13}, {9, 16}, {11, 18}, {14, 20}, {17, 21}, {19, 22}, {23, 25}, - {2, 4}, {3, 8}, {5, 12}, {6, 9}, {7, 14}, {10, 16}, {11, 17}, {13, 20}, {15, 19}, {18, 21}, {23, 24}, - {5, 6}, {7, 10}, {9, 12}, {11, 13}, {14, 16}, {15, 18}, {17, 20}, {21, 22}, - {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 23}, - {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 13}, {15, 17}, {16, 18}, {19, 21}, {20, 22}, {23, 25}, {24, 26}, + {0, 23}, {1, 24}, {2, 25}, {3, 26}, {4, 8}, {5, 9}, {6, 10}, {7, 11}, {13, 14}, {15, 19}, {16, 20}, {17, 21}, {18, 22}, + {0, 4}, {1, 6}, {2, 19}, {3, 20}, {5, 13}, {9, 21}, {11, 14}, {12, 16}, {17, 23}, {18, 24}, {22, 26}, + {5, 17}, {6, 16}, {7, 22}, {9, 25}, {10, 24}, {12, 15}, {13, 20}, {14, 26}, + {1, 12}, {4, 15}, {7, 23}, {10, 19}, {11, 16}, {13, 18}, {20, 24}, {22, 25}, + {0, 1}, {6, 12}, {8, 11}, {9, 15}, {10, 17}, {14, 24}, {16, 21}, {18, 19}, + {1, 4}, {2, 8}, {3, 11}, {12, 15}, {14, 20}, {16, 22}, {21, 25}, + {2, 5}, {3, 17}, {8, 13}, {11, 23}, {21, 22}, {24, 25}, + {1, 2}, {3, 10}, {5, 6}, {7, 13}, {11, 15}, {14, 21}, {18, 23}, {20, 22}, + {4, 5}, {6, 9}, {7, 8}, {13, 17}, {14, 16}, {19, 23}, {22, 24}, + {2, 4}, {3, 6}, {5, 7}, {8, 12}, {9, 10}, {11, 13}, {14, 18}, {15, 17}, {16, 19}, {21, 23}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 18}, {17, 19}, {20, 21}, {22, 23}, + {5, 6}, {8, 11}, {9, 10}, {12, 14}, {13, 15}, {17, 18}, {19, 21}, + {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 20}, {21, 22}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, }}; } }; diff --git a/include/cpp-sort/detail/sorting_network/sort28.h b/include/cpp-sort/detail/sorting_network/sort28.h index af801916..3eac7532 100644 --- a/include/cpp-sort/detail/sorting_network/sort28.h +++ b/include/cpp-sort/detail/sorting_network/sort28.h @@ -24,150 +24,150 @@ namespace detail Compare compare={}, Projection projection={}) const -> void { - iter_swap_if(first, first + 9, compare, projection); - iter_swap_if(first + 1, first + 20, compare, projection); - iter_swap_if(first + 2, first + 21, compare, projection); - iter_swap_if(first + 3, first + 22, compare, projection); - iter_swap_if(first + 4, first + 19, compare, projection); - iter_swap_if(first + 5, first + 24, compare, projection); - iter_swap_if(first + 6, first + 25, compare, projection); - iter_swap_if(first + 7, first + 26, compare, projection); - iter_swap_if(first + 8, first + 23, compare, projection); - iter_swap_if(first + 10, first + 15, compare, projection); - iter_swap_if(first + 11, first + 13, compare, projection); - iter_swap_if(first + 12, first + 17, compare, projection); - iter_swap_if(first + 14, first + 16, compare, projection); - iter_swap_if(first + 18, first + 27, compare, projection); - iter_swap_if(first, first + 18, compare, projection); - iter_swap_if(first + 1, first + 7, compare, projection); - iter_swap_if(first + 2, first + 6, compare, projection); - iter_swap_if(first + 3, first + 5, compare, projection); - iter_swap_if(first + 4, first + 8, compare, projection); - iter_swap_if(first + 9, first + 27, compare, projection); - iter_swap_if(first + 10, first + 12, compare, projection); - iter_swap_if(first + 11, first + 14, compare, projection); - iter_swap_if(first + 13, first + 16, compare, projection); - iter_swap_if(first + 15, first + 17, compare, projection); - iter_swap_if(first + 19, first + 23, compare, projection); - iter_swap_if(first + 20, first + 26, compare, projection); - iter_swap_if(first + 21, first + 25, compare, projection); - iter_swap_if(first + 22, first + 24, compare, projection); - iter_swap_if(first + 1, first + 2, compare, projection); - iter_swap_if(first + 3, first + 4, compare, projection); - iter_swap_if(first + 5, first + 19, compare, projection); - iter_swap_if(first + 6, first + 20, compare, projection); - iter_swap_if(first + 7, first + 21, compare, projection); - iter_swap_if(first + 8, first + 22, compare, projection); - iter_swap_if(first + 9, first + 18, compare, projection); - iter_swap_if(first + 10, first + 11, compare, projection); - iter_swap_if(first + 12, first + 14, compare, projection); - iter_swap_if(first + 13, first + 15, compare, projection); - iter_swap_if(first + 16, first + 17, compare, projection); - iter_swap_if(first + 23, first + 24, compare, projection); - iter_swap_if(first + 25, first + 26, compare, projection); - iter_swap_if(first, first + 3, compare, projection); - iter_swap_if(first + 1, first + 10, compare, projection); - iter_swap_if(first + 5, first + 8, compare, projection); - iter_swap_if(first + 6, first + 7, compare, projection); - iter_swap_if(first + 11, first + 13, compare, projection); - iter_swap_if(first + 14, first + 16, compare, projection); - iter_swap_if(first + 17, first + 26, compare, projection); - iter_swap_if(first + 19, first + 22, compare, projection); - iter_swap_if(first + 20, first + 21, compare, projection); - iter_swap_if(first + 24, first + 27, compare, projection); iter_swap_if(first, first + 1, compare, projection); - iter_swap_if(first + 2, first + 7, compare, projection); - iter_swap_if(first + 3, first + 10, compare, projection); - iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); iter_swap_if(first + 12, first + 13, compare, projection); iter_swap_if(first + 14, first + 15, compare, projection); - iter_swap_if(first + 17, first + 24, compare, projection); - iter_swap_if(first + 19, first + 23, compare, projection); - iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first, first + 2, compare, projection); iter_swap_if(first + 1, first + 3, compare, projection); - iter_swap_if(first + 2, first + 6, compare, projection); - iter_swap_if(first + 4, first + 5, compare, projection); - iter_swap_if(first + 7, first + 19, compare, projection); - iter_swap_if(first + 8, first + 20, compare, projection); - iter_swap_if(first + 11, first + 12, compare, projection); - iter_swap_if(first + 13, first + 14, compare, projection); - iter_swap_if(first + 15, first + 16, compare, projection); - iter_swap_if(first + 21, first + 25, compare, projection); - iter_swap_if(first + 22, first + 23, compare, projection); - iter_swap_if(first + 24, first + 26, compare, projection); - iter_swap_if(first + 2, first + 4, compare, projection); - iter_swap_if(first + 5, first + 12, compare, projection); - iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); iter_swap_if(first + 9, first + 11, compare, projection); - iter_swap_if(first + 10, first + 14, compare, projection); - iter_swap_if(first + 13, first + 17, compare, projection); - iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); iter_swap_if(first + 16, first + 18, compare, projection); - iter_swap_if(first + 19, first + 20, compare, projection); - iter_swap_if(first + 23, first + 25, compare, projection); - iter_swap_if(first + 2, first + 9, compare, projection); - iter_swap_if(first + 4, first + 11, compare, projection); - iter_swap_if(first + 5, first + 6, compare, projection); - iter_swap_if(first + 7, first + 13, compare, projection); - iter_swap_if(first + 8, first + 10, compare, projection); - iter_swap_if(first + 14, first + 20, compare, projection); - iter_swap_if(first + 16, first + 23, compare, projection); iter_swap_if(first + 17, first + 19, compare, projection); - iter_swap_if(first + 18, first + 25, compare, projection); - iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first, first + 20, compare, projection); + iter_swap_if(first + 1, first + 21, compare, projection); + iter_swap_if(first + 2, first + 22, compare, projection); + iter_swap_if(first + 3, first + 23, compare, projection); + iter_swap_if(first + 4, first + 24, compare, projection); + iter_swap_if(first + 5, first + 25, compare, projection); + iter_swap_if(first + 6, first + 26, compare, projection); + iter_swap_if(first + 7, first + 27, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); iter_swap_if(first + 1, first + 2, compare, projection); - iter_swap_if(first + 3, first + 16, compare, projection); - iter_swap_if(first + 4, first + 9, compare, projection); - iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); iter_swap_if(first + 10, first + 14, compare, projection); - iter_swap_if(first + 11, first + 24, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); iter_swap_if(first + 13, first + 17, compare, projection); - iter_swap_if(first + 15, first + 21, compare, projection); - iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); iter_swap_if(first + 25, first + 26, compare, projection); - iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 12, compare, projection); iter_swap_if(first + 3, first + 5, compare, projection); - iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); iter_swap_if(first + 6, first + 16, compare, projection); - iter_swap_if(first + 9, first + 15, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); iter_swap_if(first + 11, first + 21, compare, projection); - iter_swap_if(first + 12, first + 18, compare, projection); - iter_swap_if(first + 19, first + 25, compare, projection); - iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); iter_swap_if(first + 22, first + 24, compare, projection); - iter_swap_if(first + 2, first + 3, compare, projection); - iter_swap_if(first + 5, first + 8, compare, projection); - iter_swap_if(first + 7, first + 9, compare, projection); - iter_swap_if(first + 11, first + 15, compare, projection); - iter_swap_if(first + 12, first + 16, compare, projection); - iter_swap_if(first + 18, first + 20, compare, projection); - iter_swap_if(first + 19, first + 22, compare, projection); - iter_swap_if(first + 24, first + 25, compare, projection); - iter_swap_if(first + 6, first + 8, compare, projection); - iter_swap_if(first + 10, first + 12, compare, projection); - iter_swap_if(first + 11, first + 13, compare, projection); - iter_swap_if(first + 14, first + 16, compare, projection); - iter_swap_if(first + 15, first + 17, compare, projection); - iter_swap_if(first + 19, first + 21, compare, projection); - iter_swap_if(first + 5, first + 6, compare, projection); - iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); iter_swap_if(first + 9, first + 11, compare, projection); - iter_swap_if(first + 12, first + 13, compare, projection); - iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); iter_swap_if(first + 16, first + 18, compare, projection); - iter_swap_if(first + 17, first + 19, compare, projection); - iter_swap_if(first + 21, first + 22, compare, projection); - iter_swap_if(first + 4, first + 5, compare, projection); - iter_swap_if(first + 6, first + 7, compare, projection); - iter_swap_if(first + 8, first + 9, compare, projection); - iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 1, first + 8, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); iter_swap_if(first + 12, first + 14, compare, projection); iter_swap_if(first + 13, first + 15, compare, projection); - iter_swap_if(first + 16, first + 17, compare, projection); - iter_swap_if(first + 18, first + 19, compare, projection); - iter_swap_if(first + 20, first + 21, compare, projection); - iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 16, compare, projection); + iter_swap_if(first + 9, first + 14, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 5, first + 12, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); iter_swap_if(first + 3, first + 4, compare, projection); iter_swap_if(first + 5, first + 6, compare, projection); iter_swap_if(first + 7, first + 8, compare, projection); @@ -183,24 +183,23 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 155> { return {{ - {0, 9}, {1, 20}, {2, 21}, {3, 22}, {4, 19}, {5, 24}, {6, 25}, {7, 26}, {8, 23}, {10, 15}, {11, 13}, {12, 17}, {14, 16}, {18, 27}, - {0, 18}, {1, 7}, {2, 6}, {3, 5}, {4, 8}, {9, 27}, {10, 12}, {11, 14}, {13, 16}, {15, 17}, {19, 23}, {20, 26}, {21, 25}, {22, 24}, - {1, 2}, {3, 4}, {5, 19}, {6, 20}, {7, 21}, {8, 22}, {9, 18}, {10, 11}, {12, 14}, {13, 15}, {16, 17}, {23, 24}, {25, 26}, - {0, 3}, {1, 10}, {5, 8}, {6, 7}, {11, 13}, {14, 16}, {17, 26}, {19, 22}, {20, 21}, {24, 27}, - {0, 1}, {2, 7}, {3, 10}, {4, 8}, {12, 13}, {14, 15}, {17, 24}, {19, 23}, {20, 25}, {26, 27}, - {1, 3}, {2, 6}, {4, 5}, {7, 19}, {8, 20}, {11, 12}, {13, 14}, {15, 16}, {21, 25}, {22, 23}, {24, 26}, - {2, 4}, {5, 12}, {7, 8}, {9, 11}, {10, 14}, {13, 17}, {15, 22}, {16, 18}, {19, 20}, {23, 25}, - {2, 9}, {4, 11}, {5, 6}, {7, 13}, {8, 10}, {14, 20}, {16, 23}, {17, 19}, {18, 25}, {21, 22}, - {1, 2}, {3, 16}, {4, 9}, {6, 12}, {10, 14}, {11, 24}, {13, 17}, {15, 21}, {18, 23}, {25, 26}, - {2, 8}, {3, 5}, {4, 7}, {6, 16}, {9, 15}, {11, 21}, {12, 18}, {19, 25}, {20, 23}, {22, 24}, - {2, 3}, {5, 8}, {7, 9}, {11, 15}, {12, 16}, {18, 20}, {19, 22}, {24, 25}, - {6, 8}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {19, 21}, - {5, 6}, {8, 10}, {9, 11}, {12, 13}, {14, 15}, {16, 18}, {17, 19}, {21, 22}, - {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 14}, {13, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {14, 18}, {15, 19}, {20, 24}, {21, 25}, {22, 26}, {23, 27}, + {0, 20}, {1, 21}, {2, 22}, {3, 23}, {4, 24}, {5, 25}, {6, 26}, {7, 27}, {9, 17}, {10, 18}, {11, 15}, {12, 16}, + {1, 2}, {4, 20}, {5, 6}, {7, 23}, {8, 12}, {9, 16}, {10, 14}, {11, 18}, {13, 17}, {15, 19}, {21, 22}, {25, 26}, + {0, 8}, {1, 9}, {2, 12}, {3, 5}, {4, 10}, {6, 16}, {7, 13}, {11, 21}, {14, 20}, {15, 25}, {17, 23}, {18, 26}, {19, 27}, {22, 24}, + {2, 4}, {3, 7}, {5, 17}, {8, 14}, {9, 11}, {10, 22}, {13, 19}, {16, 18}, {20, 24}, {23, 25}, + {1, 8}, {3, 9}, {5, 11}, {6, 10}, {7, 15}, {12, 20}, {16, 22}, {17, 21}, {18, 24}, {19, 26}, + {1, 2}, {4, 6}, {5, 9}, {10, 16}, {11, 17}, {12, 14}, {13, 15}, {18, 22}, {21, 23}, {25, 26}, + {4, 8}, {6, 12}, {7, 11}, {10, 14}, {13, 17}, {15, 21}, {16, 20}, {19, 23}, + {2, 4}, {6, 8}, {7, 16}, {9, 14}, {10, 12}, {11, 20}, {13, 18}, {15, 17}, {19, 21}, {23, 25}, + {3, 10}, {5, 12}, {7, 9}, {11, 13}, {14, 16}, {15, 22}, {17, 24}, {18, 20}, + {3, 6}, {5, 8}, {7, 10}, {9, 12}, {11, 14}, {13, 16}, {15, 18}, {17, 20}, {19, 22}, {21, 24}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, }}; } diff --git a/include/cpp-sort/detail/sorting_network/sort29.h b/include/cpp-sort/detail/sorting_network/sort29.h index d9ef117e..6edb3a72 100644 --- a/include/cpp-sort/detail/sorting_network/sort29.h +++ b/include/cpp-sort/detail/sorting_network/sort29.h @@ -192,7 +192,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 164> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort3.h b/include/cpp-sort/detail/sorting_network/sort3.h index 7e0d6609..8549df0d 100644 --- a/include/cpp-sort/detail/sorting_network/sort3.h +++ b/include/cpp-sort/detail/sorting_network/sort3.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2022 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT3_H_ @@ -7,40 +7,48 @@ namespace cppsort { -namespace detail -{ - template<> - struct sorting_network_sorter_impl<3> + namespace detail { - template< - typename RandomAccessIterator, - typename Compare = std::less<>, - typename Projection = utility::identity, - typename = detail::enable_if_t> - > - auto operator()(RandomAccessIterator first, RandomAccessIterator, - Compare compare={}, Projection projection={}) const - -> void + template<> + struct sorting_network_sorter_impl<3> { - iter_swap_if(first, first + 2, compare, projection); - iter_swap_if(first, first + 1, compare, projection); - iter_swap_if(first + 1, first + 2, compare, projection); - } + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + } - template - CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() - -> std::array, 3> - { - return {{ - {0, 2}, - {0, 1}, - {1, 2}, - }}; - } + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 3> + { + return {{ + {0, 1}, + {1, 2}, + {0, 1}, + }}; + } + }; + } + + template<> + struct sorter_traits> + { + using iterator_category = std::random_access_iterator_tag; + using is_always_stable = std::true_type; }; -}} +} #endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT3_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort30.h b/include/cpp-sort/detail/sorting_network/sort30.h index ee6e31e8..0db99ef5 100644 --- a/include/cpp-sort/detail/sorting_network/sort30.h +++ b/include/cpp-sort/detail/sorting_network/sort30.h @@ -91,7 +91,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 172> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort31.h b/include/cpp-sort/detail/sorting_network/sort31.h index a91f2a2c..da4b9d70 100644 --- a/include/cpp-sort/detail/sorting_network/sort31.h +++ b/include/cpp-sort/detail/sorting_network/sort31.h @@ -208,7 +208,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 180> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort32.h b/include/cpp-sort/detail/sorting_network/sort32.h index 7ffcf6db..39aff278 100644 --- a/include/cpp-sort/detail/sorting_network/sort32.h +++ b/include/cpp-sort/detail/sorting_network/sort32.h @@ -213,7 +213,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 185> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort33.h b/include/cpp-sort/detail/sorting_network/sort33.h new file mode 100644 index 00000000..864a6999 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort33.h @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT33_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT33_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<33> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 3, first + 20, compare, projection); + iter_swap_if(first + 5, first + 18, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 7, first + 22, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 28, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 13, first + 23, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 18, compare, projection); + iter_swap_if(first + 10, first + 20, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 199> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {16, 24}, {17, 25}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31}, + {0, 16}, {1, 17}, {2, 18}, {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 23}, {8, 24}, {9, 25}, {10, 26}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {15, 31}, + {1, 4}, {2, 16}, {3, 20}, {5, 18}, {6, 17}, {7, 22}, {9, 24}, {10, 12}, {11, 28}, {13, 26}, {14, 25}, {15, 29}, {19, 21}, {23, 32}, {27, 30}, + {1, 2}, {3, 9}, {4, 16}, {6, 10}, {7, 19}, {11, 17}, {12, 24}, {13, 23}, {15, 27}, {22, 26}, {25, 28}, {29, 30}, + {3, 6}, {7, 12}, {9, 18}, {10, 20}, {13, 14}, {15, 28}, {17, 22}, {21, 25}, {27, 32}, + {5, 13}, {6, 16}, {9, 10}, {12, 20}, {14, 19}, {15, 23}, {25, 26}, {30, 32}, + {5, 8}, {11, 13}, {14, 18}, {15, 21}, {19, 22}, {23, 27}, {31, 32}, + {4, 5}, {7, 11}, {8, 16}, {12, 14}, {13, 24}, {15, 17}, {18, 20}, {19, 21}, {22, 28}, {23, 25}, {27, 29}, + {1, 4}, {3, 5}, {6, 8}, {7, 9}, {10, 11}, {13, 15}, {17, 24}, {22, 23}, {26, 27}, {29, 30}, + {0, 1}, {2, 6}, {8, 9}, {11, 16}, {12, 13}, {14, 17}, {15, 18}, {19, 22}, {20, 24}, {25, 26}, + {2, 4}, {5, 8}, {6, 7}, {9, 11}, {10, 12}, {13, 16}, {14, 15}, {17, 20}, {18, 19}, {21, 24}, {23, 25}, {26, 28}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, + {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {28, 29}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT33_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort34.h b/include/cpp-sort/detail/sorting_network/sort34.h new file mode 100644 index 00000000..edb0ee0b --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort34.h @@ -0,0 +1,266 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT34_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT34_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<34> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 33, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 4, first + 13, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 29, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 26, first + 33, compare, projection); + iter_swap_if(first, first + 9, compare, projection); + iter_swap_if(first + 4, first + 18, compare, projection); + iter_swap_if(first + 7, first + 21, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 10, first + 20, compare, projection); + iter_swap_if(first + 12, first + 26, compare, projection); + iter_swap_if(first + 13, first + 23, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 17, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 26, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 4, first + 9, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 209> + { + return {{ + {0, 33}, {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, + {1, 3}, {2, 4}, {5, 7}, {6, 8}, {9, 11}, {10, 12}, {13, 15}, {14, 16}, {17, 19}, {18, 20}, {21, 23}, {22, 24}, {25, 27}, {26, 28}, {29, 31}, {30, 32}, + {1, 5}, {2, 6}, {3, 7}, {4, 8}, {9, 13}, {10, 14}, {11, 15}, {12, 16}, {17, 21}, {18, 22}, {19, 23}, {20, 24}, {25, 29}, {26, 30}, {27, 31}, {28, 32}, + {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {8, 16}, {17, 25}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31}, {24, 32}, + {1, 17}, {2, 18}, {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 23}, {8, 24}, {9, 25}, {10, 26}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {15, 31}, {16, 32}, + {0, 4}, {2, 3}, {5, 17}, {6, 11}, {7, 10}, {8, 12}, {14, 15}, {16, 28}, {18, 19}, {21, 25}, {22, 27}, {23, 26}, {29, 33}, {30, 31}, + {0, 7}, {2, 9}, {4, 13}, {8, 14}, {19, 25}, {20, 29}, {24, 31}, {26, 33}, + {0, 9}, {4, 18}, {7, 21}, {8, 19}, {10, 20}, {12, 26}, {13, 23}, {14, 25}, {15, 29}, {24, 33}, + {0, 5}, {3, 7}, {6, 10}, {9, 17}, {11, 20}, {12, 15}, {13, 22}, {16, 24}, {18, 21}, {23, 27}, {26, 30}, {28, 33}, + {0, 1}, {3, 5}, {4, 6}, {7, 17}, {10, 13}, {11, 18}, {15, 22}, {16, 26}, {20, 23}, {27, 29}, {28, 30}, {32, 33}, + {4, 9}, {6, 11}, {8, 10}, {12, 15}, {13, 19}, {14, 20}, {18, 21}, {22, 27}, {23, 25}, {24, 29}, + {2, 4}, {5, 9}, {6, 7}, {11, 17}, {12, 18}, {13, 14}, {15, 21}, {16, 22}, {19, 20}, {24, 28}, {26, 27}, {29, 31}, + {1, 2}, {3, 4}, {7, 8}, {10, 17}, {12, 13}, {14, 18}, {15, 19}, {16, 23}, {20, 21}, {25, 26}, {29, 30}, {31, 32}, + {2, 3}, {4, 5}, {7, 9}, {8, 11}, {10, 12}, {13, 17}, {14, 15}, {16, 20}, {18, 19}, {21, 23}, {22, 25}, {24, 26}, {28, 29}, {30, 31}, + {6, 7}, {8, 9}, {11, 12}, {13, 14}, {16, 17}, {19, 20}, {21, 22}, {24, 25}, {26, 27}, + {5, 6}, {7, 8}, {10, 11}, {12, 13}, {15, 16}, {17, 18}, {20, 21}, {22, 23}, {25, 26}, {27, 28}, + {9, 10}, {14, 15}, {16, 17}, {18, 19}, {23, 24}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT34_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort35.h b/include/cpp-sort/detail/sorting_network/sort35.h new file mode 100644 index 00000000..0c09c80f --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort35.h @@ -0,0 +1,278 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT35_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT35_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<35> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 5, first + 18, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 32, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 24, first + 34, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 20, first + 34, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 11, first + 25, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 14, first + 34, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 26, first + 33, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 7, first + 24, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 32, compare, projection); + iter_swap_if(first + 15, first + 33, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 9, first + 18, compare, projection); + iter_swap_if(first + 10, first + 20, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 24, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 220> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {33, 34}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {32, 33}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {16, 24}, {17, 25}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31}, + {0, 16}, {1, 4}, {2, 8}, {3, 12}, {5, 10}, {6, 9}, {7, 13}, {11, 14}, {15, 31}, {17, 20}, {18, 24}, {19, 28}, {21, 26}, {22, 25}, {23, 29}, {27, 30}, + {1, 17}, {2, 18}, {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 23}, {8, 24}, {9, 25}, {10, 26}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {16, 32}, + {2, 16}, {5, 18}, {7, 11}, {8, 32}, {17, 33}, {19, 21}, {24, 34}, {25, 28}, + {0, 2}, {6, 17}, {8, 16}, {10, 32}, {12, 19}, {20, 34}, {25, 33}, + {3, 10}, {5, 6}, {11, 25}, {12, 17}, {14, 34}, {20, 24}, {22, 32}, {26, 33}, + {3, 5}, {4, 20}, {7, 24}, {9, 11}, {13, 26}, {14, 32}, {15, 33}, {19, 22}, {25, 28}, {31, 34}, + {1, 3}, {4, 8}, {9, 18}, {10, 20}, {11, 21}, {13, 24}, {14, 22}, {15, 28}, {23, 31}, {25, 32}, {29, 33}, + {1, 2}, {5, 10}, {6, 9}, {8, 16}, {11, 20}, {14, 19}, {17, 18}, {21, 22}, {23, 27}, {24, 25}, {26, 32}, {30, 31}, + {2, 4}, {3, 8}, {5, 6}, {7, 11}, {9, 10}, {12, 16}, {13, 20}, {14, 17}, {15, 23}, {18, 19}, {22, 25}, {27, 32}, {29, 30}, {31, 33}, + {3, 4}, {7, 14}, {8, 12}, {9, 16}, {11, 18}, {13, 17}, {15, 21}, {19, 20}, {23, 27}, {28, 29}, {30, 32}, + {5, 8}, {6, 12}, {10, 16}, {11, 13}, {15, 24}, {17, 18}, {21, 26}, {23, 28}, {29, 30}, {31, 32}, + {6, 8}, {7, 12}, {14, 16}, {15, 19}, {20, 21}, {22, 24}, {25, 26}, {27, 28}, {30, 31}, + {7, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 17}, {18, 19}, {20, 22}, {21, 24}, {23, 25}, {26, 27}, {28, 29}, + {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT35_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort36.h b/include/cpp-sort/detail/sorting_network/sort36.h new file mode 100644 index 00000000..b51be060 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort36.h @@ -0,0 +1,285 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT36_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT36_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<36> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first, first + 34, compare, projection); + iter_swap_if(first + 1, first + 35, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 8, first + 26, compare, projection); + iter_swap_if(first + 9, first + 27, compare, projection); + iter_swap_if(first + 12, first + 22, compare, projection); + iter_swap_if(first + 13, first + 23, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 1, first + 10, compare, projection); + iter_swap_if(first + 2, first + 12, compare, projection); + iter_swap_if(first + 3, first + 22, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 13, first + 32, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 25, first + 34, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 5, first + 23, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 12, first + 30, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 29, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 5, first + 14, compare, projection); + iter_swap_if(first + 8, first + 20, compare, projection); + iter_swap_if(first + 9, first + 23, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 12, first + 26, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 21, first + 30, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 15, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 8, first + 18, compare, projection); + iter_swap_if(first + 9, first + 22, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 24, compare, projection); + iter_swap_if(first + 17, first + 27, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 9, first + 14, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 227> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, + {0, 34}, {1, 35}, {2, 4}, {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 24}, {23, 25}, {26, 28}, {27, 29}, {30, 32}, {31, 33}, + {2, 6}, {3, 7}, {4, 8}, {5, 9}, {10, 14}, {11, 15}, {12, 16}, {13, 17}, {18, 22}, {19, 23}, {20, 24}, {21, 25}, {26, 30}, {27, 31}, {28, 32}, {29, 33}, + {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {8, 16}, {9, 17}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31}, {24, 32}, {25, 33}, + {2, 18}, {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 23}, {8, 24}, {9, 25}, {10, 26}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {15, 31}, {16, 32}, {17, 33}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {8, 26}, {9, 27}, {12, 22}, {13, 23}, {14, 20}, {15, 21}, {24, 30}, {25, 31}, {32, 34}, {33, 35}, + {1, 10}, {2, 12}, {3, 22}, {11, 19}, {13, 32}, {16, 24}, {23, 33}, {25, 34}, + {2, 18}, {3, 12}, {7, 13}, {17, 33}, {22, 28}, {23, 32}, + {3, 8}, {5, 23}, {6, 18}, {7, 11}, {12, 30}, {13, 19}, {16, 22}, {17, 29}, {24, 28}, {27, 32}, + {1, 6}, {4, 7}, {5, 14}, {8, 20}, {9, 23}, {10, 18}, {11, 13}, {12, 26}, {15, 27}, {17, 25}, {21, 30}, {22, 24}, {28, 31}, {29, 34}, + {2, 4}, {3, 5}, {7, 8}, {9, 15}, {12, 14}, {20, 26}, {21, 23}, {27, 28}, {30, 32}, {31, 33}, + {1, 2}, {4, 6}, {7, 10}, {8, 18}, {9, 22}, {11, 20}, {13, 26}, {14, 16}, {15, 24}, {17, 27}, {19, 21}, {25, 28}, {29, 31}, {33, 34}, + {2, 4}, {3, 7}, {5, 8}, {9, 14}, {11, 12}, {13, 18}, {15, 16}, {17, 22}, {19, 20}, {21, 26}, {23, 24}, {27, 30}, {28, 32}, {31, 33}, + {3, 4}, {5, 11}, {6, 7}, {8, 12}, {9, 13}, {14, 18}, {15, 19}, {16, 20}, {17, 21}, {22, 26}, {23, 27}, {24, 30}, {28, 29}, {31, 32}, + {4, 6}, {7, 10}, {9, 11}, {12, 15}, {13, 14}, {16, 17}, {18, 19}, {20, 23}, {21, 22}, {24, 26}, {25, 28}, {29, 31}, + {5, 7}, {8, 10}, {12, 13}, {14, 15}, {16, 18}, {17, 19}, {20, 21}, {22, 23}, {25, 27}, {28, 30}, + {5, 6}, {8, 9}, {10, 11}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {24, 25}, {26, 27}, {29, 30}, + {7, 8}, {9, 10}, {11, 12}, {23, 24}, {25, 26}, {27, 28}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT36_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort37.h b/include/cpp-sort/detail/sorting_network/sort37.h new file mode 100644 index 00000000..a54c360d --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort37.h @@ -0,0 +1,298 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT37_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT37_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<37> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first, first + 32, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 1, first + 33, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 28, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 35, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 17, first + 34, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 32, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 8, first + 17, compare, projection); + iter_swap_if(first + 9, first + 34, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 20, first + 33, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 20, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 13, first + 33, compare, projection); + iter_swap_if(first + 14, first + 34, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 20, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 25, first + 34, compare, projection); + iter_swap_if(first + 26, first + 33, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 15, first + 26, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 12, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 241> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 35}, {33, 36}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {32, 33}, {34, 36}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {16, 24}, {17, 25}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31}, {33, 34}, {35, 36}, + {0, 16}, {1, 17}, {2, 18}, {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 23}, {8, 24}, {9, 25}, {10, 26}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {15, 31}, {34, 35}, + {0, 32}, {1, 2}, {3, 12}, {4, 8}, {5, 10}, {6, 9}, {7, 11}, {13, 14}, {17, 18}, {19, 28}, {20, 24}, {21, 26}, {22, 25}, {23, 27}, {29, 30}, {31, 36}, + {1, 33}, {5, 6}, {7, 28}, {9, 10}, {11, 35}, {16, 32}, {17, 34}, {21, 22}, {24, 31}, {25, 26}, + {1, 4}, {2, 32}, {7, 13}, {8, 17}, {9, 34}, {11, 21}, {15, 31}, {18, 24}, {20, 33}, {23, 35}, + {2, 8}, {3, 20}, {4, 16}, {11, 19}, {12, 24}, {13, 33}, {14, 34}, {15, 25}, {18, 32}, {23, 29}, {27, 31}, {30, 35}, + {1, 4}, {5, 11}, {6, 18}, {7, 15}, {8, 16}, {9, 20}, {10, 32}, {12, 13}, {14, 19}, {21, 24}, {25, 34}, {26, 33}, {27, 29}, {31, 35}, + {2, 4}, {3, 5}, {6, 16}, {7, 11}, {10, 17}, {12, 18}, {13, 22}, {14, 24}, {15, 26}, {21, 32}, {25, 28}, {30, 33}, + {3, 8}, {9, 16}, {10, 12}, {13, 18}, {14, 17}, {19, 24}, {20, 21}, {22, 23}, {25, 32}, {28, 34}, + {3, 4}, {5, 12}, {6, 8}, {7, 20}, {10, 16}, {11, 18}, {13, 14}, {15, 22}, {17, 21}, {19, 25}, {23, 26}, {24, 32}, {28, 30}, {29, 34}, + {4, 6}, {5, 9}, {7, 13}, {8, 10}, {11, 17}, {12, 16}, {14, 20}, {15, 19}, {18, 21}, {22, 25}, {23, 24}, {26, 32}, {27, 28}, {29, 33}, {31, 34}, + {5, 8}, {7, 9}, {11, 13}, {14, 16}, {15, 18}, {17, 20}, {19, 22}, {21, 23}, {24, 27}, {25, 26}, {28, 30}, {29, 32}, {31, 33}, + {5, 6}, {7, 10}, {9, 12}, {11, 14}, {13, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 32}, + {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT37_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort38.h b/include/cpp-sort/detail/sorting_network/sort38.h new file mode 100644 index 00000000..4642d1ff --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort38.h @@ -0,0 +1,307 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT38_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT38_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<38> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first, first + 22, compare, projection); + iter_swap_if(first + 1, first + 23, compare, projection); + iter_swap_if(first + 2, first + 24, compare, projection); + iter_swap_if(first + 3, first + 25, compare, projection); + iter_swap_if(first + 4, first + 26, compare, projection); + iter_swap_if(first + 5, first + 27, compare, projection); + iter_swap_if(first + 6, first + 28, compare, projection); + iter_swap_if(first + 7, first + 29, compare, projection); + iter_swap_if(first + 8, first + 30, compare, projection); + iter_swap_if(first + 9, first + 31, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 11, first + 33, compare, projection); + iter_swap_if(first + 12, first + 34, compare, projection); + iter_swap_if(first + 13, first + 35, compare, projection); + iter_swap_if(first + 14, first + 36, compare, projection); + iter_swap_if(first + 15, first + 37, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 34, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 4, first + 17, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 20, first + 33, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 23, compare, projection); + iter_swap_if(first + 14, first + 28, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 1, first + 8, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 11, first + 22, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 15, first + 26, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 11, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 35, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 27, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 250> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 20}, {17, 21}, {22, 24}, {23, 25}, {26, 28}, {27, 29}, {30, 32}, {31, 33}, {34, 36}, {35, 37}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 18}, {19, 21}, {22, 26}, {23, 27}, {24, 28}, {25, 29}, {30, 34}, {31, 35}, {32, 36}, {33, 37}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {17, 19}, {18, 20}, {22, 30}, {23, 31}, {24, 32}, {25, 33}, {26, 34}, {27, 35}, {28, 36}, {29, 37}, + {0, 22}, {1, 23}, {2, 24}, {3, 25}, {4, 26}, {5, 27}, {6, 28}, {7, 29}, {8, 30}, {9, 31}, {10, 32}, {11, 33}, {12, 34}, {13, 35}, {14, 36}, {15, 37}, {17, 18}, {19, 20}, + {1, 2}, {3, 12}, {4, 8}, {5, 10}, {6, 9}, {7, 11}, {13, 14}, {23, 24}, {25, 34}, {26, 30}, {27, 32}, {28, 31}, {29, 33}, {35, 36}, + {4, 17}, {5, 6}, {7, 13}, {9, 10}, {11, 18}, {14, 21}, {16, 23}, {19, 26}, {20, 33}, {24, 30}, {27, 28}, {31, 32}, + {3, 19}, {5, 17}, {6, 22}, {8, 16}, {9, 23}, {14, 28}, {15, 31}, {18, 34}, {20, 32}, {21, 29}, + {1, 8}, {4, 6}, {11, 22}, {12, 14}, {13, 20}, {15, 26}, {17, 24}, {23, 25}, {29, 36}, {31, 33}, + {0, 1}, {2, 11}, {3, 8}, {7, 15}, {10, 12}, {13, 19}, {18, 24}, {22, 30}, {25, 27}, {26, 35}, {29, 34}, {36, 37}, + {1, 4}, {2, 6}, {9, 13}, {10, 17}, {11, 16}, {12, 18}, {14, 22}, {15, 23}, {19, 25}, {20, 27}, {21, 26}, {24, 28}, {31, 35}, {33, 36}, + {2, 3}, {5, 11}, {7, 15}, {8, 9}, {12, 17}, {13, 16}, {14, 19}, {18, 23}, {20, 25}, {21, 24}, {22, 30}, {26, 32}, {28, 29}, {34, 35}, + {2, 4}, {3, 5}, {6, 11}, {7, 12}, {9, 10}, {13, 14}, {15, 17}, {16, 19}, {18, 21}, {20, 22}, {23, 24}, {25, 30}, {26, 31}, {27, 28}, {32, 34}, {33, 35}, + {3, 4}, {5, 9}, {6, 8}, {7, 13}, {10, 11}, {12, 16}, {14, 15}, {17, 19}, {18, 20}, {21, 25}, {22, 23}, {24, 30}, {26, 27}, {28, 32}, {29, 31}, {33, 34}, + {4, 6}, {7, 10}, {8, 9}, {11, 13}, {12, 14}, {15, 18}, {16, 17}, {19, 22}, {20, 21}, {23, 25}, {24, 26}, {27, 30}, {28, 29}, {31, 33}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, + {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT38_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort39.h b/include/cpp-sort/detail/sorting_network/sort39.h new file mode 100644 index 00000000..3af3de8b --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort39.h @@ -0,0 +1,316 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT39_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT39_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<39> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 38, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 36, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 15, first + 32, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 1, first + 10, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 15, first + 24, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 26, compare, projection); + iter_swap_if(first + 2, first + 25, compare, projection); + iter_swap_if(first + 3, first + 28, compare, projection); + iter_swap_if(first + 4, first + 30, compare, projection); + iter_swap_if(first + 5, first + 29, compare, projection); + iter_swap_if(first + 6, first + 27, compare, projection); + iter_swap_if(first + 7, first + 24, compare, projection); + iter_swap_if(first + 8, first + 32, compare, projection); + iter_swap_if(first + 9, first + 33, compare, projection); + iter_swap_if(first + 10, first + 34, compare, projection); + iter_swap_if(first + 11, first + 35, compare, projection); + iter_swap_if(first + 12, first + 36, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 14, first + 31, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 9, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 16, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 25, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 13, first + 34, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 21, first + 35, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 4, first + 17, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 20, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 18, first + 28, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 22, first + 33, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 14, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 12, first + 25, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 20, first + 30, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 34, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 8, first + 17, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 2, first + 7, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 9, first + 15, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 259> + { + return {{ + {1, 2}, {3, 6}, {4, 5}, {7, 14}, {8, 9}, {10, 11}, {12, 13}, {15, 38}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, + {0, 1}, {3, 4}, {5, 6}, {7, 12}, {8, 10}, {9, 11}, {13, 14}, {15, 36}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {37, 38}, + {0, 3}, {1, 4}, {2, 5}, {7, 8}, {9, 13}, {10, 12}, {11, 14}, {15, 32}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {33, 37}, {34, 36}, {35, 38}, + {0, 7}, {1, 10}, {2, 9}, {3, 8}, {4, 12}, {5, 13}, {6, 11}, {15, 24}, {17, 20}, {19, 22}, {25, 33}, {26, 34}, {27, 35}, {28, 32}, {29, 37}, {30, 36}, {31, 38}, + {0, 15}, {1, 26}, {2, 25}, {3, 28}, {4, 30}, {5, 29}, {6, 27}, {7, 24}, {8, 32}, {9, 33}, {10, 34}, {11, 35}, {12, 36}, {13, 37}, {14, 31}, + {1, 2}, {4, 9}, {5, 10}, {6, 8}, {7, 16}, {12, 13}, {14, 21}, {18, 24}, {23, 31}, {25, 26}, {27, 32}, {29, 34}, {30, 33}, {36, 37}, + {3, 18}, {4, 6}, {5, 25}, {8, 9}, {10, 24}, {13, 34}, {14, 29}, {15, 16}, {21, 35}, {23, 38}, {27, 30}, {32, 33}, + {4, 17}, {7, 15}, {9, 20}, {10, 16}, {11, 21}, {18, 28}, {19, 27}, {22, 33}, {23, 29}, {31, 38}, + {0, 7}, {1, 4}, {3, 15}, {6, 9}, {10, 18}, {11, 12}, {13, 22}, {14, 19}, {17, 25}, {20, 24}, {21, 29}, {26, 28}, {27, 32}, {31, 35}, {33, 37}, + {2, 6}, {3, 7}, {5, 14}, {8, 19}, {9, 16}, {10, 15}, {12, 25}, {13, 26}, {20, 30}, {23, 27}, {24, 34}, {29, 31}, {32, 36}, {35, 38}, + {1, 3}, {2, 15}, {4, 5}, {6, 18}, {8, 17}, {9, 13}, {11, 23}, {12, 19}, {16, 28}, {20, 26}, {21, 32}, {22, 30}, {25, 27}, {29, 36}, {33, 34}, {37, 38}, + {2, 7}, {4, 10}, {5, 8}, {6, 9}, {11, 17}, {12, 14}, {13, 20}, {16, 18}, {19, 25}, {21, 23}, {22, 28}, {24, 26}, {27, 32}, {30, 33}, {31, 34}, {35, 36}, + {2, 3}, {6, 10}, {9, 15}, {11, 12}, {13, 16}, {14, 17}, {18, 20}, {19, 21}, {22, 24}, {23, 25}, {26, 28}, {27, 29}, {31, 32}, {36, 37}, + {3, 4}, {5, 9}, {8, 15}, {11, 13}, {12, 18}, {14, 16}, {17, 20}, {19, 22}, {21, 26}, {23, 24}, {25, 28}, {27, 30}, {29, 33}, {34, 36}, + {4, 7}, {5, 6}, {8, 9}, {10, 11}, {12, 14}, {13, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 26}, {25, 27}, {28, 31}, {29, 30}, {32, 33}, {34, 35}, + {6, 7}, {8, 10}, {9, 11}, {12, 13}, {14, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 34}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT39_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort4.h b/include/cpp-sort/detail/sorting_network/sort4.h index 74a7ff77..dc2fc73d 100644 --- a/include/cpp-sort/detail/sorting_network/sort4.h +++ b/include/cpp-sort/detail/sorting_network/sort4.h @@ -33,7 +33,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 5> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort40.h b/include/cpp-sort/detail/sorting_network/sort40.h new file mode 100644 index 00000000..667f3b30 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort40.h @@ -0,0 +1,322 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT40_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT40_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<40> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first, first + 24, compare, projection); + iter_swap_if(first + 1, first + 25, compare, projection); + iter_swap_if(first + 2, first + 26, compare, projection); + iter_swap_if(first + 3, first + 27, compare, projection); + iter_swap_if(first + 4, first + 28, compare, projection); + iter_swap_if(first + 5, first + 29, compare, projection); + iter_swap_if(first + 6, first + 30, compare, projection); + iter_swap_if(first + 7, first + 31, compare, projection); + iter_swap_if(first + 8, first + 32, compare, projection); + iter_swap_if(first + 9, first + 33, compare, projection); + iter_swap_if(first + 10, first + 34, compare, projection); + iter_swap_if(first + 11, first + 35, compare, projection); + iter_swap_if(first + 12, first + 36, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 14, first + 38, compare, projection); + iter_swap_if(first + 15, first + 39, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 21, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 36, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 4, first + 18, compare, projection); + iter_swap_if(first + 5, first + 25, compare, projection); + iter_swap_if(first + 7, first + 29, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 14, first + 34, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 21, first + 35, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 3, first + 17, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 18, first + 28, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 22, first + 36, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 9, first + 19, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 20, first + 30, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 37, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 12, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 265> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 38}, {37, 39}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {32, 36}, {33, 37}, {34, 38}, {35, 39}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {17, 20}, {19, 22}, {24, 32}, {25, 33}, {26, 34}, {27, 35}, {28, 36}, {29, 37}, {30, 38}, {31, 39}, + {0, 24}, {1, 25}, {2, 26}, {3, 27}, {4, 28}, {5, 29}, {6, 30}, {7, 31}, {8, 32}, {9, 33}, {10, 34}, {11, 35}, {12, 36}, {13, 37}, {14, 38}, {15, 39}, + {1, 2}, {3, 12}, {5, 10}, {6, 9}, {7, 21}, {8, 16}, {13, 14}, {18, 32}, {23, 31}, {25, 26}, {27, 36}, {29, 34}, {30, 33}, {37, 38}, + {3, 6}, {4, 18}, {5, 25}, {7, 29}, {9, 12}, {10, 32}, {14, 34}, {15, 23}, {16, 24}, {21, 35}, {27, 30}, {33, 36}, + {3, 17}, {8, 16}, {10, 24}, {11, 21}, {12, 20}, {15, 29}, {18, 28}, {19, 27}, {22, 36}, {23, 31}, + {0, 8}, {1, 3}, {4, 16}, {6, 12}, {7, 19}, {10, 18}, {11, 13}, {14, 22}, {17, 25}, {20, 32}, {21, 29}, {23, 35}, {26, 28}, {27, 33}, {31, 39}, {36, 38}, + {2, 6}, {4, 8}, {5, 7}, {9, 19}, {10, 16}, {12, 24}, {13, 25}, {14, 26}, {15, 27}, {20, 30}, {23, 29}, {31, 35}, {32, 34}, {33, 37}, + {1, 4}, {2, 16}, {3, 5}, {6, 18}, {9, 17}, {11, 15}, {12, 14}, {13, 19}, {20, 26}, {21, 33}, {22, 30}, {23, 37}, {24, 28}, {25, 27}, {34, 36}, {35, 38}, + {2, 8}, {3, 10}, {5, 9}, {6, 12}, {7, 13}, {11, 17}, {14, 20}, {15, 21}, {18, 24}, {19, 25}, {22, 28}, {26, 32}, {27, 33}, {29, 36}, {30, 34}, {31, 37}, + {2, 4}, {6, 10}, {7, 11}, {12, 16}, {13, 17}, {14, 18}, {15, 19}, {20, 24}, {21, 25}, {22, 26}, {23, 27}, {28, 32}, {29, 33}, {35, 37}, + {3, 4}, {5, 12}, {7, 14}, {9, 16}, {11, 20}, {13, 18}, {15, 22}, {17, 24}, {19, 28}, {21, 26}, {23, 30}, {25, 32}, {27, 34}, {35, 36}, + {4, 8}, {5, 6}, {7, 10}, {9, 12}, {11, 13}, {14, 16}, {15, 20}, {17, 18}, {19, 24}, {21, 22}, {23, 25}, {26, 28}, {27, 30}, {29, 32}, {31, 35}, {33, 34}, + {6, 8}, {7, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 24}, {23, 26}, {25, 28}, {27, 29}, {30, 32}, {31, 33}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT40_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort41.h b/include/cpp-sort/detail/sorting_network/sort41.h new file mode 100644 index 00000000..7d97e564 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort41.h @@ -0,0 +1,341 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT41_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT41_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<41> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first, first + 32, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 40, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 39, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 1, first + 36, compare, projection); + iter_swap_if(first + 2, first + 33, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 10, first + 21, compare, projection); + iter_swap_if(first + 11, first + 22, compare, projection); + iter_swap_if(first + 12, first + 37, compare, projection); + iter_swap_if(first + 14, first + 38, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 30, first + 39, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 28, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 8, first + 33, compare, projection); + iter_swap_if(first + 14, first + 34, compare, projection); + iter_swap_if(first + 15, first + 36, compare, projection); + iter_swap_if(first + 19, first + 29, compare, projection); + iter_swap_if(first + 26, first + 37, compare, projection); + iter_swap_if(first + 27, first + 38, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 20, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 28, compare, projection); + iter_swap_if(first + 11, first + 34, compare, projection); + iter_swap_if(first + 12, first + 33, compare, projection); + iter_swap_if(first + 15, first + 32, compare, projection); + iter_swap_if(first + 17, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 25, first + 36, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 15, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 24, first + 34, compare, projection); + iter_swap_if(first + 27, first + 36, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 25, first + 34, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 13, first + 23, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 32, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 9, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 26, first + 33, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 282> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 35}, {33, 39}, {34, 37}, {36, 40}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 39}, {34, 36}, {35, 40}, {37, 38}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {32, 34}, {33, 35}, {36, 37}, {39, 40}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {16, 24}, {17, 25}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31}, {33, 36}, {35, 38}, {37, 39}, + {0, 16}, {1, 17}, {2, 18}, {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 23}, {8, 24}, {9, 25}, {10, 26}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {15, 31}, {32, 33}, {34, 36}, {35, 37}, {38, 40}, + {0, 32}, {1, 2}, {3, 12}, {4, 8}, {5, 10}, {6, 9}, {7, 11}, {13, 14}, {17, 18}, {19, 28}, {20, 24}, {21, 26}, {22, 25}, {23, 27}, {29, 30}, {31, 40}, {34, 35}, {36, 37}, {38, 39}, + {5, 6}, {7, 13}, {9, 10}, {11, 39}, {15, 31}, {16, 32}, {18, 24}, {21, 22}, {23, 29}, {25, 26}, {33, 34}, {35, 36}, {37, 38}, + {1, 36}, {2, 33}, {6, 17}, {10, 21}, {11, 22}, {12, 37}, {14, 38}, {15, 19}, {18, 34}, {23, 25}, {28, 35}, {30, 39}, + {1, 16}, {2, 4}, {3, 28}, {6, 18}, {8, 33}, {14, 34}, {15, 36}, {19, 29}, {26, 37}, {27, 38}, {30, 35}, + {1, 2}, {3, 20}, {7, 14}, {8, 16}, {9, 28}, {11, 34}, {12, 33}, {15, 32}, {17, 26}, {19, 27}, {22, 30}, {25, 36}, {31, 38}, + {3, 4}, {5, 15}, {7, 18}, {10, 32}, {11, 20}, {12, 17}, {13, 25}, {21, 33}, {24, 34}, {27, 36}, {31, 35}, {38, 39}, + {4, 16}, {5, 6}, {9, 11}, {10, 15}, {14, 24}, {20, 28}, {23, 32}, {25, 34}, {29, 35}, + {5, 8}, {7, 10}, {9, 12}, {11, 17}, {13, 23}, {15, 21}, {18, 20}, {19, 32}, {22, 28}, {24, 25}, {27, 34}, {29, 37}, {35, 38}, + {2, 5}, {3, 8}, {7, 9}, {12, 16}, {13, 14}, {15, 18}, {19, 26}, {20, 21}, {22, 24}, {23, 33}, {25, 28}, {29, 30}, {31, 32}, {35, 37}, + {3, 5}, {4, 9}, {6, 12}, {10, 16}, {11, 13}, {14, 17}, {19, 23}, {26, 33}, {27, 29}, {30, 34}, {32, 36}, + {4, 7}, {6, 8}, {10, 12}, {11, 15}, {13, 20}, {14, 18}, {17, 21}, {19, 22}, {23, 25}, {24, 26}, {27, 31}, {28, 33}, {29, 32}, {35, 36}, + {4, 6}, {7, 8}, {9, 11}, {13, 15}, {14, 16}, {17, 19}, {18, 20}, {21, 23}, {22, 24}, {25, 26}, {27, 28}, {29, 33}, {30, 31}, {32, 34}, + {4, 5}, {6, 7}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 27}, {26, 28}, {29, 30}, {31, 33}, {34, 35}, + {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT41_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort42.h b/include/cpp-sort/detail/sorting_network/sort42.h new file mode 100644 index 00000000..f565135b --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort42.h @@ -0,0 +1,351 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT42_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT42_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<42> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first, first + 26, compare, projection); + iter_swap_if(first + 1, first + 27, compare, projection); + iter_swap_if(first + 2, first + 28, compare, projection); + iter_swap_if(first + 3, first + 29, compare, projection); + iter_swap_if(first + 4, first + 30, compare, projection); + iter_swap_if(first + 5, first + 31, compare, projection); + iter_swap_if(first + 6, first + 32, compare, projection); + iter_swap_if(first + 7, first + 33, compare, projection); + iter_swap_if(first + 8, first + 34, compare, projection); + iter_swap_if(first + 9, first + 35, compare, projection); + iter_swap_if(first + 10, first + 36, compare, projection); + iter_swap_if(first + 11, first + 37, compare, projection); + iter_swap_if(first + 12, first + 38, compare, projection); + iter_swap_if(first + 13, first + 39, compare, projection); + iter_swap_if(first + 14, first + 40, compare, projection); + iter_swap_if(first + 15, first + 41, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 38, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 16, first + 26, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 6, first + 26, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 15, first + 35, compare, projection); + iter_swap_if(first + 17, first + 27, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 5, first + 19, compare, projection); + iter_swap_if(first + 7, first + 27, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 12, first + 21, compare, projection); + iter_swap_if(first + 14, first + 34, compare, projection); + iter_swap_if(first + 20, first + 29, compare, projection); + iter_swap_if(first + 22, first + 36, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 3, first + 16, compare, projection); + iter_swap_if(first + 4, first + 9, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 34, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 38, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 23, compare, projection); + iter_swap_if(first + 11, first + 28, compare, projection); + iter_swap_if(first + 13, first + 30, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 19, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 18, first + 30, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 27, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 292> + { + return {{ + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 24}, {17, 25}, {18, 23}, {19, 21}, {20, 22}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 20}, {21, 24}, {23, 25}, {26, 28}, {27, 29}, {30, 32}, {31, 33}, {34, 36}, {35, 37}, {38, 40}, {39, 41}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 19}, {18, 20}, {21, 23}, {22, 25}, {26, 30}, {27, 31}, {28, 32}, {29, 33}, {34, 38}, {35, 39}, {36, 40}, {37, 41}, + {0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {16, 17}, {19, 22}, {24, 25}, {26, 34}, {27, 35}, {28, 36}, {29, 37}, {30, 38}, {31, 39}, {32, 40}, {33, 41}, + {0, 26}, {1, 27}, {2, 28}, {3, 29}, {4, 30}, {5, 31}, {6, 32}, {7, 33}, {8, 34}, {9, 35}, {10, 36}, {11, 37}, {12, 38}, {13, 39}, {14, 40}, {15, 41}, {17, 21}, {18, 19}, {20, 24}, {22, 23}, + {0, 16}, {1, 2}, {3, 12}, {4, 8}, {5, 10}, {6, 9}, {7, 11}, {13, 14}, {17, 18}, {19, 21}, {20, 22}, {23, 24}, {25, 41}, {27, 28}, {29, 38}, {30, 34}, {31, 36}, {32, 35}, {33, 37}, {39, 40}, + {2, 8}, {5, 6}, {7, 13}, {9, 10}, {11, 14}, {15, 25}, {16, 26}, {18, 19}, {20, 21}, {22, 23}, {27, 30}, {28, 34}, {31, 32}, {33, 39}, {35, 36}, + {1, 16}, {3, 18}, {6, 26}, {10, 12}, {14, 24}, {15, 35}, {17, 27}, {19, 20}, {21, 22}, {23, 38}, {25, 40}, {29, 31}, + {2, 6}, {4, 16}, {5, 19}, {7, 27}, {9, 17}, {12, 21}, {14, 34}, {20, 29}, {22, 36}, {24, 32}, {25, 37}, {35, 39}, + {3, 16}, {4, 9}, {5, 6}, {7, 20}, {8, 12}, {13, 22}, {14, 26}, {15, 27}, {17, 18}, {19, 28}, {21, 34}, {23, 24}, {25, 38}, {29, 33}, {32, 37}, {35, 36}, + {2, 3}, {6, 8}, {10, 23}, {11, 28}, {13, 30}, {15, 20}, {18, 31}, {21, 26}, {33, 35}, {38, 39}, + {3, 5}, {6, 9}, {8, 14}, {10, 19}, {11, 23}, {13, 16}, {18, 30}, {22, 31}, {25, 28}, {27, 33}, {32, 35}, {36, 38}, + {3, 6}, {5, 13}, {7, 10}, {11, 19}, {12, 14}, {16, 17}, {22, 30}, {24, 25}, {27, 29}, {28, 36}, {31, 34}, {35, 38}, + {1, 7}, {8, 16}, {10, 13}, {11, 15}, {14, 21}, {17, 18}, {20, 27}, {23, 24}, {25, 33}, {26, 30}, {28, 31}, {34, 40}, + {1, 4}, {7, 8}, {9, 10}, {12, 17}, {13, 16}, {14, 18}, {19, 20}, {21, 22}, {23, 27}, {24, 29}, {25, 28}, {31, 32}, {33, 34}, {37, 40}, + {2, 4}, {5, 7}, {8, 10}, {11, 12}, {14, 19}, {15, 17}, {18, 20}, {21, 23}, {22, 27}, {24, 26}, {29, 30}, {31, 33}, {34, 36}, {37, 39}, + {3, 4}, {5, 6}, {7, 9}, {11, 13}, {12, 14}, {15, 16}, {17, 18}, {19, 21}, {20, 22}, {23, 24}, {25, 26}, {27, 29}, {28, 30}, {32, 34}, {35, 36}, {37, 38}, + {6, 7}, {8, 11}, {10, 13}, {12, 15}, {14, 16}, {17, 19}, {18, 21}, {20, 23}, {22, 24}, {25, 27}, {26, 29}, {28, 31}, {30, 33}, {34, 35}, + {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT42_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort43.h b/include/cpp-sort/detail/sorting_network/sort43.h new file mode 100644 index 00000000..3402f8c2 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort43.h @@ -0,0 +1,363 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT43_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT43_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<43> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first, first + 31, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 24, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 42, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 32, compare, projection); + iter_swap_if(first + 12, first + 23, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 30, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 38, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 36, compare, projection); + iter_swap_if(first + 3, first + 27, compare, projection); + iter_swap_if(first + 5, first + 25, compare, projection); + iter_swap_if(first + 6, first + 41, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 10, first + 21, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 39, compare, projection); + iter_swap_if(first + 18, first + 37, compare, projection); + iter_swap_if(first + 20, first + 33, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 26, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 4, first + 11, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 7, first + 30, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 17, first + 40, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 25, first + 36, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 9, first + 20, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 12, first + 31, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 28, compare, projection); + iter_swap_if(first + 21, first + 34, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 41, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 24, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 19, first + 38, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 18, first + 29, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 42, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 32, compare, projection); + iter_swap_if(first + 7, first + 36, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 33, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 7, first + 32, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 39, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 36, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 30, first + 41, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 31, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 9, first + 23, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 15, first + 39, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 10, first + 23, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 22, first + 33, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 8, first + 17, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 30, first + 39, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 304> + { + return {{ + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {9, 10}, {11, 21}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {23, 29}, {24, 26}, {25, 27}, {28, 30}, {31, 37}, {32, 34}, {33, 35}, {36, 38}, {39, 41}, {40, 42}, + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {11, 20}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {21, 22}, {23, 28}, {24, 25}, {26, 27}, {29, 30}, {31, 36}, {32, 33}, {34, 35}, {37, 38}, {39, 40}, {41, 42}, + {0, 31}, {1, 2}, {4, 24}, {5, 6}, {7, 42}, {8, 16}, {9, 10}, {11, 32}, {12, 23}, {13, 14}, {15, 30}, {17, 18}, {19, 38}, {20, 21}, {25, 26}, {27, 35}, {28, 29}, {33, 34}, {36, 37}, {40, 41}, + {0, 4}, {1, 36}, {3, 27}, {5, 25}, {6, 41}, {7, 19}, {9, 17}, {10, 21}, {11, 12}, {13, 28}, {14, 29}, {15, 22}, {16, 39}, {18, 37}, {20, 33}, {23, 32}, {24, 31}, {26, 34}, {30, 35}, {38, 42}, + {1, 5}, {2, 26}, {3, 15}, {4, 11}, {6, 18}, {7, 30}, {8, 12}, {10, 14}, {13, 20}, {16, 23}, {17, 40}, {21, 29}, {22, 27}, {25, 36}, {28, 33}, {32, 39}, {37, 41}, + {0, 16}, {2, 10}, {3, 7}, {4, 8}, {5, 13}, {9, 20}, {11, 23}, {12, 31}, {14, 26}, {15, 19}, {17, 28}, {21, 34}, {22, 38}, {24, 32}, {27, 42}, {29, 37}, {33, 40}, + {0, 4}, {1, 17}, {5, 9}, {6, 21}, {8, 24}, {10, 18}, {12, 16}, {13, 28}, {14, 29}, {15, 22}, {19, 35}, {20, 36}, {23, 32}, {25, 33}, {26, 41}, {27, 30}, {31, 39}, {34, 37}, + {1, 5}, {2, 6}, {7, 15}, {8, 12}, {9, 25}, {10, 14}, {11, 24}, {16, 23}, {17, 20}, {18, 34}, {19, 38}, {21, 26}, {22, 27}, {28, 33}, {30, 35}, {31, 32}, {36, 40}, {37, 41}, + {4, 8}, {6, 10}, {9, 17}, {11, 12}, {13, 25}, {14, 21}, {15, 22}, {16, 24}, {18, 29}, {19, 27}, {20, 28}, {23, 31}, {26, 34}, {30, 38}, {33, 36}, {35, 42}, + {1, 4}, {5, 9}, {6, 32}, {7, 36}, {8, 11}, {10, 14}, {12, 16}, {13, 17}, {18, 21}, {19, 22}, {20, 25}, {23, 24}, {26, 29}, {27, 30}, {28, 33}, {34, 37}, {35, 38}, {41, 42}, + {2, 8}, {3, 33}, {4, 12}, {5, 11}, {6, 16}, {7, 32}, {9, 13}, {10, 39}, {14, 18}, {17, 20}, {21, 26}, {25, 28}, {27, 36}, {29, 34}, {30, 41}, {35, 37}, {38, 40}, + {2, 4}, {3, 31}, {6, 11}, {7, 20}, {9, 23}, {14, 24}, {15, 39}, {19, 28}, {21, 32}, {22, 34}, {35, 36}, {40, 41}, + {3, 8}, {7, 14}, {10, 23}, {15, 25}, {18, 31}, {19, 20}, {21, 24}, {22, 33}, {28, 32}, {38, 39}, + {3, 12}, {7, 13}, {8, 17}, {15, 23}, {19, 21}, {20, 24}, {22, 31}, {26, 38}, {29, 32}, {30, 39}, + {3, 5}, {7, 11}, {8, 12}, {13, 16}, {17, 18}, {25, 26}, {27, 29}, {30, 38}, {32, 35}, {37, 39}, + {3, 4}, {8, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 23}, {22, 25}, {26, 31}, {27, 28}, {29, 32}, {30, 33}, {34, 38}, {39, 40}, + {5, 8}, {9, 10}, {12, 15}, {16, 19}, {17, 18}, {20, 22}, {21, 23}, {24, 27}, {25, 26}, {30, 31}, {33, 34}, {37, 38}, + {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 30}, {29, 31}, {32, 33}, {34, 35}, {36, 37}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT43_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort44.h b/include/cpp-sort/detail/sorting_network/sort44.h new file mode 100644 index 00000000..cb6d4555 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort44.h @@ -0,0 +1,369 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT44_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT44_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<44> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 13, compare, projection); + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 28, first + 41, compare, projection); + iter_swap_if(first + 29, first + 40, compare, projection); + iter_swap_if(first + 30, first + 43, compare, projection); + iter_swap_if(first + 31, first + 42, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 37, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 34, first + 41, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 40, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first, first + 28, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 31, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 12, first + 40, compare, projection); + iter_swap_if(first + 15, first + 43, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 29, compare, projection); + iter_swap_if(first + 3, first + 17, compare, projection); + iter_swap_if(first + 4, first + 30, compare, projection); + iter_swap_if(first + 5, first + 33, compare, projection); + iter_swap_if(first + 6, first + 34, compare, projection); + iter_swap_if(first + 7, first + 35, compare, projection); + iter_swap_if(first + 8, first + 36, compare, projection); + iter_swap_if(first + 9, first + 37, compare, projection); + iter_swap_if(first + 10, first + 38, compare, projection); + iter_swap_if(first + 11, first + 25, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 39, compare, projection); + iter_swap_if(first + 14, first + 42, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 26, first + 40, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 32, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 11, first + 41, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 24, first + 35, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 29, compare, projection); + iter_swap_if(first + 10, first + 23, compare, projection); + iter_swap_if(first + 11, first + 24, compare, projection); + iter_swap_if(first + 14, first + 36, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 19, first + 32, compare, projection); + iter_swap_if(first + 20, first + 33, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 41, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 5, first + 15, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 8, first + 18, compare, projection); + iter_swap_if(first + 10, first + 19, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 25, first + 35, compare, projection); + iter_swap_if(first + 27, first + 37, compare, projection); + iter_swap_if(first + 28, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 23, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 29, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 33, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 311> + { + return {{ + {0, 13}, {1, 12}, {2, 15}, {3, 14}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {16, 24}, {17, 23}, {18, 22}, {19, 27}, {20, 26}, {21, 25}, {28, 41}, {29, 40}, {30, 43}, {31, 42}, {32, 36}, {33, 34}, {35, 39}, {37, 38}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {6, 13}, {8, 14}, {10, 15}, {11, 12}, {16, 17}, {18, 21}, {19, 20}, {22, 25}, {23, 24}, {26, 27}, {28, 33}, {29, 35}, {30, 37}, {31, 32}, {34, 41}, {36, 42}, {38, 43}, {39, 40}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 18}, {17, 22}, {21, 26}, {25, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 36}, {35, 37}, {38, 39}, {40, 41}, {42, 43}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {12, 14}, {13, 15}, {16, 19}, {17, 18}, {20, 22}, {21, 23}, {24, 27}, {25, 26}, {28, 30}, {29, 31}, {32, 38}, {33, 39}, {34, 35}, {36, 37}, {40, 42}, {41, 43}, + {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 14}, {15, 27}, {16, 28}, {17, 20}, {19, 21}, {22, 24}, {23, 26}, {29, 30}, {31, 40}, {32, 34}, {33, 35}, {36, 38}, {37, 39}, {41, 42}, + {0, 28}, {1, 4}, {2, 6}, {3, 31}, {5, 8}, {7, 10}, {9, 13}, {11, 14}, {12, 40}, {15, 43}, {17, 19}, {18, 21}, {22, 25}, {24, 26}, {29, 32}, {30, 34}, {33, 36}, {35, 38}, {37, 41}, {39, 42}, + {0, 16}, {1, 29}, {3, 17}, {4, 30}, {5, 33}, {6, 34}, {7, 35}, {8, 36}, {9, 37}, {10, 38}, {11, 25}, {12, 28}, {13, 39}, {14, 42}, {15, 31}, {18, 32}, {20, 22}, {21, 23}, {26, 40}, {27, 43}, + {1, 3}, {2, 32}, {6, 22}, {7, 20}, {8, 19}, {11, 41}, {21, 37}, {23, 36}, {24, 35}, {40, 42}, + {2, 18}, {4, 8}, {6, 12}, {7, 29}, {10, 23}, {11, 24}, {14, 36}, {15, 21}, {19, 32}, {20, 33}, {22, 28}, {25, 41}, {31, 37}, {35, 39}, + {2, 16}, {3, 7}, {9, 11}, {10, 22}, {12, 18}, {13, 24}, {15, 17}, {19, 30}, {21, 33}, {25, 31}, {26, 28}, {27, 41}, {32, 34}, {36, 40}, + {1, 2}, {5, 15}, {6, 16}, {8, 18}, {10, 19}, {11, 21}, {13, 29}, {14, 30}, {17, 20}, {22, 32}, {23, 26}, {24, 33}, {25, 35}, {27, 37}, {28, 38}, {41, 42}, + {5, 7}, {8, 16}, {9, 17}, {10, 12}, {13, 15}, {14, 23}, {18, 19}, {20, 29}, {24, 25}, {26, 34}, {27, 35}, {28, 30}, {31, 33}, {36, 38}, + {3, 5}, {4, 8}, {7, 13}, {11, 20}, {12, 16}, {14, 22}, {15, 17}, {21, 29}, {23, 32}, {26, 28}, {27, 31}, {30, 36}, {35, 39}, {38, 40}, + {4, 6}, {7, 12}, {8, 10}, {9, 13}, {11, 15}, {14, 18}, {17, 20}, {19, 22}, {21, 24}, {23, 26}, {25, 29}, {28, 32}, {30, 34}, {31, 36}, {33, 35}, {37, 39}, + {2, 4}, {3, 6}, {5, 10}, {9, 16}, {11, 18}, {12, 14}, {13, 19}, {15, 23}, {17, 22}, {20, 28}, {21, 26}, {24, 30}, {25, 32}, {27, 34}, {29, 31}, {33, 38}, {37, 40}, {39, 41}, + {3, 4}, {5, 8}, {9, 10}, {11, 14}, {13, 16}, {15, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 28}, {27, 30}, {29, 32}, {33, 34}, {35, 38}, {39, 40}, + {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 28}, {27, 29}, {30, 32}, {31, 33}, {34, 36}, {35, 37}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT44_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort45.h b/include/cpp-sort/detail/sorting_network/sort45.h new file mode 100644 index 00000000..49a1477d --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort45.h @@ -0,0 +1,383 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT45_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT45_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<45> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 13, first + 32, compare, projection); + iter_swap_if(first + 14, first + 35, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 17, first + 28, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 44, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 14, first + 36, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 29, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 31, first + 41, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 13, first + 33, compare, projection); + iter_swap_if(first + 14, first + 31, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 34, first + 43, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 44, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 31, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 44, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 38, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first, first + 13, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 14, first + 32, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 1, first + 14, compare, projection); + iter_swap_if(first + 2, first + 31, compare, projection); + iter_swap_if(first + 3, first + 33, compare, projection); + iter_swap_if(first + 5, first + 35, compare, projection); + iter_swap_if(first + 8, first + 21, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 39, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 38, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 28, first + 41, compare, projection); + iter_swap_if(first + 29, first + 43, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 4, first + 18, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 36, compare, projection); + iter_swap_if(first + 8, first + 37, compare, projection); + iter_swap_if(first + 12, first + 26, compare, projection); + iter_swap_if(first + 17, first + 31, compare, projection); + iter_swap_if(first + 19, first + 33, compare, projection); + iter_swap_if(first + 24, first + 39, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 4, first + 13, compare, projection); + iter_swap_if(first + 5, first + 15, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 20, first + 35, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 26, first + 36, compare, projection); + iter_swap_if(first + 30, first + 39, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 31, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 28, first + 37, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 9, first + 14, compare, projection); + iter_swap_if(first + 11, first + 31, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 24, first + 38, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 27, first + 37, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 35, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 324> + { + return {{ + {3, 12}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {13, 32}, {14, 35}, {15, 18}, {16, 29}, {17, 28}, {19, 30}, {20, 24}, {21, 22}, {23, 27}, {25, 26}, {31, 34}, {33, 44}, {36, 40}, {37, 38}, {39, 43}, {41, 42}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {8, 12}, {10, 11}, {13, 37}, {14, 36}, {15, 25}, {16, 21}, {17, 23}, {18, 26}, {19, 20}, {22, 29}, {24, 30}, {27, 28}, {31, 41}, {32, 38}, {33, 39}, {34, 42}, {35, 40}, {43, 44}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {13, 33}, {14, 31}, {15, 19}, {16, 17}, {18, 27}, {20, 21}, {22, 24}, {23, 25}, {26, 30}, {28, 29}, {32, 35}, {34, 43}, {36, 37}, {38, 44}, {39, 41}, {40, 42}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {13, 14}, {15, 16}, {17, 19}, {18, 20}, {21, 27}, {22, 23}, {24, 25}, {26, 28}, {29, 30}, {31, 33}, {32, 39}, {34, 36}, {35, 41}, {37, 43}, {38, 40}, {42, 44}, + {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 15}, {14, 31}, {16, 17}, {18, 22}, {19, 26}, {20, 24}, {21, 23}, {25, 27}, {28, 29}, {30, 44}, {32, 34}, {33, 38}, {35, 36}, {37, 39}, {40, 42}, {41, 43}, + {0, 13}, {1, 4}, {2, 6}, {3, 19}, {5, 8}, {7, 10}, {14, 32}, {16, 18}, {17, 22}, {20, 21}, {23, 24}, {25, 28}, {26, 38}, {27, 29}, {31, 34}, {35, 37}, {36, 39}, {40, 41}, {42, 43}, + {1, 14}, {2, 31}, {3, 33}, {5, 35}, {8, 21}, {9, 25}, {10, 39}, {11, 27}, {12, 38}, {13, 15}, {18, 32}, {22, 34}, {23, 36}, {28, 41}, {29, 43}, + {1, 16}, {4, 18}, {5, 20}, {6, 22}, {7, 36}, {8, 37}, {12, 26}, {17, 31}, {19, 33}, {24, 39}, {25, 40}, {27, 42}, + {2, 17}, {4, 13}, {5, 15}, {7, 23}, {8, 19}, {9, 25}, {10, 24}, {11, 27}, {14, 16}, {18, 32}, {20, 35}, {21, 37}, {22, 34}, {26, 36}, {30, 39}, {40, 43}, {42, 44}, + {1, 4}, {2, 5}, {3, 13}, {6, 14}, {7, 31}, {9, 16}, {12, 15}, {19, 21}, {23, 26}, {28, 37}, {29, 34}, {30, 33}, {38, 42}, + {2, 4}, {3, 6}, {7, 18}, {9, 14}, {11, 31}, {12, 17}, {13, 20}, {15, 22}, {16, 23}, {21, 29}, {24, 38}, {25, 30}, {27, 37}, {28, 32}, {33, 41}, {34, 40}, {42, 43}, + {3, 4}, {5, 6}, {7, 13}, {9, 12}, {10, 22}, {11, 20}, {15, 28}, {16, 21}, {23, 29}, {24, 32}, {25, 35}, {30, 31}, {37, 38}, {39, 42}, {40, 41}, {43, 44}, + {4, 5}, {6, 7}, {8, 15}, {10, 25}, {11, 16}, {13, 14}, {19, 28}, {20, 21}, {22, 35}, {23, 24}, {26, 30}, {29, 32}, {31, 36}, {34, 37}, {38, 39}, {42, 43}, + {7, 12}, {8, 13}, {10, 17}, {14, 18}, {15, 19}, {20, 23}, {21, 24}, {22, 26}, {25, 28}, {27, 34}, {30, 31}, {33, 35}, {36, 37}, {38, 40}, + {8, 9}, {10, 15}, {11, 14}, {12, 13}, {16, 18}, {17, 19}, {22, 25}, {26, 28}, {27, 29}, {30, 33}, {31, 35}, {32, 34}, {36, 38}, {37, 41}, + {6, 8}, {10, 11}, {14, 15}, {16, 17}, {18, 19}, {20, 22}, {21, 26}, {23, 25}, {24, 28}, {27, 30}, {29, 33}, {31, 32}, {34, 35}, {39, 41}, + {5, 6}, {9, 10}, {11, 14}, {13, 16}, {15, 17}, {18, 20}, {19, 22}, {21, 23}, {24, 27}, {25, 26}, {28, 30}, {29, 31}, {32, 34}, {33, 36}, {35, 37}, {41, 42}, + {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 18}, {17, 20}, {19, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 36}, {35, 38}, {37, 40}, + {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT45_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort46.h b/include/cpp-sort/detail/sorting_network/sort46.h new file mode 100644 index 00000000..99eba76e --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort46.h @@ -0,0 +1,391 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT46_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT46_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<46> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 2, first + 13, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 14, first + 35, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 17, first + 28, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 45, compare, projection); + iter_swap_if(first + 33, first + 44, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 14, first + 36, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 29, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 31, first + 41, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 38, first + 45, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 31, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 43, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 14, first + 32, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 41, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 45, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first, first + 14, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 26, first + 40, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 1, first + 31, compare, projection); + iter_swap_if(first + 2, first + 32, compare, projection); + iter_swap_if(first + 3, first + 33, compare, projection); + iter_swap_if(first + 5, first + 36, compare, projection); + iter_swap_if(first + 8, first + 21, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 39, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 40, compare, projection); + iter_swap_if(first + 13, first + 42, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 4, first + 18, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 38, compare, projection); + iter_swap_if(first + 8, first + 37, compare, projection); + iter_swap_if(first + 12, first + 26, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 17, first + 32, compare, projection); + iter_swap_if(first + 19, first + 33, compare, projection); + iter_swap_if(first + 24, first + 39, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 4, first + 14, compare, projection); + iter_swap_if(first + 5, first + 15, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 16, first + 31, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 28, first + 42, compare, projection); + iter_swap_if(first + 30, first + 39, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 7, first + 32, compare, projection); + iter_swap_if(first + 9, first + 31, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 11, first + 32, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 13, first + 34, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 27, first + 37, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 34, compare, projection); + iter_swap_if(first + 25, first + 36, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 36, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 38, first + 41, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 332> + { + return {{ + {2, 13}, {3, 12}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {14, 35}, {15, 18}, {16, 29}, {17, 28}, {19, 30}, {20, 24}, {21, 22}, {23, 27}, {25, 26}, {31, 34}, {32, 45}, {33, 44}, {36, 40}, {37, 38}, {39, 43}, {41, 42}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {8, 12}, {10, 13}, {14, 36}, {15, 25}, {16, 21}, {17, 23}, {18, 26}, {19, 20}, {22, 29}, {24, 30}, {27, 28}, {31, 41}, {32, 37}, {33, 39}, {34, 42}, {35, 40}, {38, 45}, {43, 44}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 31}, {15, 19}, {16, 17}, {18, 27}, {20, 21}, {22, 24}, {23, 25}, {26, 30}, {28, 29}, {32, 33}, {34, 43}, {35, 38}, {36, 37}, {39, 41}, {40, 42}, {44, 45}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {14, 32}, {15, 16}, {17, 19}, {18, 20}, {21, 27}, {22, 23}, {24, 25}, {26, 28}, {29, 30}, {31, 33}, {34, 36}, {35, 39}, {37, 43}, {38, 41}, {40, 44}, {42, 45}, + {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {14, 15}, {16, 17}, {18, 22}, {19, 26}, {20, 24}, {21, 23}, {25, 27}, {28, 29}, {30, 45}, {31, 32}, {33, 40}, {34, 35}, {36, 38}, {37, 39}, {41, 43}, {42, 44}, + {0, 14}, {1, 4}, {2, 6}, {3, 19}, {5, 8}, {7, 10}, {9, 13}, {16, 18}, {17, 22}, {20, 21}, {23, 24}, {25, 28}, {26, 40}, {27, 29}, {31, 34}, {32, 35}, {36, 37}, {38, 39}, {41, 42}, {43, 44}, + {1, 31}, {2, 32}, {3, 33}, {5, 36}, {8, 21}, {9, 25}, {10, 39}, {11, 27}, {12, 40}, {13, 42}, {14, 15}, {18, 34}, {22, 35}, {23, 38}, {29, 44}, + {1, 16}, {4, 18}, {5, 20}, {6, 22}, {7, 38}, {8, 37}, {12, 26}, {13, 28}, {17, 32}, {19, 33}, {24, 39}, {25, 41}, {27, 43}, + {2, 17}, {4, 14}, {5, 15}, {7, 23}, {8, 19}, {9, 25}, {10, 24}, {11, 27}, {16, 31}, {18, 34}, {20, 36}, {21, 37}, {22, 35}, {26, 38}, {28, 42}, {30, 39}, {41, 44}, {43, 45}, + {1, 4}, {2, 5}, {3, 14}, {6, 16}, {7, 32}, {9, 31}, {12, 15}, {13, 37}, {19, 21}, {23, 26}, {29, 35}, {30, 33}, {39, 42}, {40, 43}, + {2, 4}, {3, 6}, {7, 18}, {9, 16}, {11, 32}, {12, 17}, {13, 34}, {14, 20}, {15, 22}, {21, 29}, {23, 31}, {24, 40}, {25, 30}, {27, 37}, {28, 33}, {35, 41}, {42, 45}, {43, 44}, + {3, 4}, {5, 6}, {7, 14}, {9, 12}, {10, 22}, {11, 20}, {13, 15}, {21, 23}, {24, 34}, {25, 36}, {29, 31}, {30, 32}, {33, 41}, {37, 40}, {39, 43}, {42, 44}, + {4, 5}, {6, 7}, {8, 13}, {10, 25}, {11, 21}, {14, 16}, {15, 19}, {20, 23}, {22, 36}, {24, 29}, {26, 30}, {31, 34}, {32, 38}, {35, 37}, {39, 40}, {42, 43}, + {7, 12}, {8, 14}, {10, 17}, {13, 15}, {16, 18}, {19, 25}, {20, 24}, {22, 26}, {23, 29}, {27, 35}, {28, 36}, {30, 32}, {33, 39}, {37, 38}, + {8, 9}, {10, 13}, {11, 16}, {12, 14}, {15, 17}, {18, 21}, {19, 22}, {25, 26}, {27, 31}, {28, 30}, {32, 36}, {33, 37}, {34, 35}, {38, 41}, + {6, 8}, {10, 11}, {13, 16}, {15, 18}, {17, 21}, {19, 20}, {22, 24}, {23, 25}, {26, 29}, {27, 28}, {30, 31}, {32, 34}, {35, 36}, {40, 41}, + {5, 6}, {9, 10}, {11, 13}, {14, 15}, {16, 18}, {17, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 32}, {31, 33}, {34, 35}, {36, 38}, {41, 42}, + {7, 9}, {10, 12}, {11, 14}, {13, 15}, {16, 17}, {18, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 32}, {31, 34}, {33, 35}, {36, 37}, {38, 39}, + {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT46_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort47.h b/include/cpp-sort/detail/sorting_network/sort47.h new file mode 100644 index 00000000..0ed2057f --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort47.h @@ -0,0 +1,399 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT47_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT47_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<47> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 13, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 17, first + 28, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 45, compare, projection); + iter_swap_if(first + 33, first + 44, compare, projection); + iter_swap_if(first + 35, first + 46, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 29, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 31, first + 41, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 38, first + 45, compare, projection); + iter_swap_if(first + 40, first + 46, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 43, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 42, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 38, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 1, first + 32, compare, projection); + iter_swap_if(first + 2, first + 33, compare, projection); + iter_swap_if(first + 3, first + 35, compare, projection); + iter_swap_if(first + 5, first + 36, compare, projection); + iter_swap_if(first + 8, first + 21, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 40, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 42, compare, projection); + iter_swap_if(first + 13, first + 44, compare, projection); + iter_swap_if(first + 14, first + 45, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 4, first + 18, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 39, compare, projection); + iter_swap_if(first + 8, first + 37, compare, projection); + iter_swap_if(first + 12, first + 26, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 4, first + 15, compare, projection); + iter_swap_if(first + 5, first + 31, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 26, first + 39, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 30, first + 40, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 7, first + 33, compare, projection); + iter_swap_if(first + 9, first + 32, compare, projection); + iter_swap_if(first + 12, first + 31, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 14, first + 38, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 29, first + 41, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 11, first + 33, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 13, first + 34, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 42, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 27, first + 37, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 29, first + 38, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 10, first + 31, compare, projection); + iter_swap_if(first + 11, first + 20, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 23, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 24, first + 34, compare, projection); + iter_swap_if(first + 25, first + 36, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 340> + { + return {{ + {1, 12}, {2, 13}, {3, 14}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {15, 18}, {16, 29}, {17, 28}, {19, 30}, {20, 24}, {21, 22}, {23, 27}, {25, 26}, {31, 34}, {32, 45}, {33, 44}, {35, 46}, {36, 40}, {37, 38}, {39, 43}, {41, 42}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {8, 14}, {10, 13}, {11, 12}, {15, 25}, {16, 21}, {17, 23}, {18, 26}, {19, 20}, {22, 29}, {24, 30}, {27, 28}, {31, 41}, {32, 37}, {33, 39}, {34, 42}, {35, 36}, {38, 45}, {40, 46}, {43, 44}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {13, 14}, {15, 19}, {16, 17}, {18, 27}, {20, 21}, {22, 24}, {23, 25}, {26, 30}, {28, 29}, {31, 35}, {32, 33}, {34, 43}, {36, 37}, {38, 40}, {39, 41}, {42, 46}, {44, 45}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {12, 13}, {15, 16}, {17, 19}, {18, 20}, {21, 27}, {22, 23}, {24, 25}, {26, 28}, {29, 30}, {31, 32}, {33, 35}, {34, 36}, {37, 43}, {38, 39}, {40, 41}, {42, 44}, {45, 46}, + {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 14}, {15, 31}, {16, 17}, {18, 22}, {19, 26}, {20, 24}, {21, 23}, {25, 27}, {28, 29}, {30, 46}, {32, 33}, {34, 38}, {35, 42}, {36, 40}, {37, 39}, {41, 43}, {44, 45}, + {0, 15}, {1, 4}, {2, 6}, {3, 19}, {5, 8}, {7, 10}, {9, 13}, {11, 14}, {16, 18}, {17, 22}, {20, 21}, {23, 24}, {25, 28}, {26, 42}, {27, 29}, {32, 34}, {33, 38}, {36, 37}, {39, 40}, {41, 44}, {43, 45}, + {1, 32}, {2, 33}, {3, 35}, {5, 36}, {8, 21}, {9, 25}, {10, 40}, {11, 27}, {12, 42}, {13, 44}, {14, 45}, {15, 31}, {18, 34}, {22, 38}, {23, 39}, + {1, 16}, {4, 18}, {5, 20}, {6, 22}, {7, 39}, {8, 37}, {12, 26}, {13, 28}, {17, 33}, {19, 35}, {24, 40}, {25, 41}, {27, 43}, {29, 45}, + {2, 17}, {4, 15}, {5, 31}, {7, 23}, {8, 19}, {9, 25}, {10, 24}, {11, 27}, {14, 29}, {16, 32}, {18, 34}, {20, 36}, {21, 37}, {22, 38}, {26, 39}, {28, 44}, {30, 40}, {43, 46}, + {1, 4}, {2, 5}, {3, 15}, {6, 16}, {7, 33}, {9, 32}, {12, 31}, {13, 37}, {14, 38}, {19, 21}, {23, 26}, {29, 41}, {30, 35}, {40, 44}, {42, 43}, {45, 46}, + {2, 4}, {3, 6}, {7, 18}, {9, 16}, {11, 33}, {12, 17}, {13, 34}, {14, 21}, {15, 20}, {22, 31}, {23, 32}, {24, 42}, {25, 30}, {27, 37}, {28, 35}, {29, 38}, {41, 43}, {44, 45}, + {3, 4}, {5, 6}, {7, 15}, {9, 12}, {10, 31}, {11, 20}, {13, 22}, {14, 23}, {21, 32}, {24, 34}, {25, 36}, {30, 33}, {35, 38}, {37, 42}, {40, 41}, {43, 44}, + {4, 5}, {6, 7}, {8, 13}, {10, 25}, {11, 14}, {15, 16}, {19, 22}, {20, 23}, {21, 24}, {26, 30}, {29, 37}, {31, 36}, {32, 34}, {33, 39}, {40, 42}, {41, 43}, + {7, 12}, {8, 15}, {10, 17}, {13, 19}, {16, 18}, {20, 21}, {22, 25}, {23, 24}, {26, 31}, {27, 29}, {28, 36}, {30, 33}, {35, 40}, {37, 39}, + {8, 9}, {10, 13}, {11, 16}, {12, 15}, {14, 18}, {17, 19}, {22, 26}, {25, 31}, {27, 32}, {28, 30}, {29, 34}, {33, 36}, {35, 37}, {38, 39}, + {6, 8}, {10, 11}, {13, 16}, {14, 17}, {18, 19}, {20, 22}, {21, 26}, {23, 25}, {24, 31}, {27, 28}, {29, 33}, {30, 32}, {34, 36}, {39, 42}, + {5, 6}, {9, 10}, {11, 13}, {14, 15}, {16, 17}, {18, 20}, {19, 22}, {21, 23}, {24, 27}, {25, 26}, {28, 31}, {29, 30}, {32, 35}, {33, 34}, {36, 38}, {41, 42}, + {7, 9}, {10, 12}, {11, 14}, {13, 15}, {16, 18}, {17, 20}, {19, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 40}, + {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT47_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort48.h b/include/cpp-sort/detail/sorting_network/sort48.h new file mode 100644 index 00000000..54e3577c --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort48.h @@ -0,0 +1,405 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT48_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT48_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<48> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 13, compare, projection); + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 17, first + 28, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 32, first + 45, compare, projection); + iter_swap_if(first + 33, first + 44, compare, projection); + iter_swap_if(first + 34, first + 47, compare, projection); + iter_swap_if(first + 35, first + 46, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 25, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 29, compare, projection); + iter_swap_if(first + 24, first + 30, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 41, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 38, first + 45, compare, projection); + iter_swap_if(first + 40, first + 46, compare, projection); + iter_swap_if(first + 42, first + 47, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 44, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 1, first + 33, compare, projection); + iter_swap_if(first + 2, first + 34, compare, projection); + iter_swap_if(first + 3, first + 35, compare, projection); + iter_swap_if(first + 5, first + 37, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 42, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 44, compare, projection); + iter_swap_if(first + 13, first + 45, compare, projection); + iter_swap_if(first + 14, first + 46, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 39, compare, projection); + iter_swap_if(first + 8, first + 40, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 5, first + 32, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 42, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 28, first + 39, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 16, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 7, first + 34, compare, projection); + iter_swap_if(first + 9, first + 33, compare, projection); + iter_swap_if(first + 12, first + 32, compare, projection); + iter_swap_if(first + 13, first + 40, compare, projection); + iter_swap_if(first + 14, first + 38, compare, projection); + iter_swap_if(first + 15, first + 35, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 30, first + 41, compare, projection); + iter_swap_if(first + 31, first + 44, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 11, first + 34, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 13, first + 36, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 40, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 16, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 11, first + 21, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 23, compare, projection); + iter_swap_if(first + 15, first + 37, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 25, first + 34, compare, projection); + iter_swap_if(first + 26, first + 36, compare, projection); + iter_swap_if(first + 31, first + 40, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 34, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 25, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 346> + { + return {{ + {0, 13}, {1, 12}, {2, 15}, {3, 14}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {16, 29}, {17, 28}, {18, 31}, {19, 30}, {20, 24}, {21, 22}, {23, 27}, {25, 26}, {32, 45}, {33, 44}, {34, 47}, {35, 46}, {36, 40}, {37, 38}, {39, 43}, {41, 42}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {6, 13}, {8, 14}, {10, 15}, {11, 12}, {16, 21}, {17, 23}, {18, 25}, {19, 20}, {22, 29}, {24, 30}, {26, 31}, {27, 28}, {32, 37}, {33, 39}, {34, 41}, {35, 36}, {38, 45}, {40, 46}, {42, 47}, {43, 44}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 24}, {23, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 40}, {39, 41}, {42, 43}, {44, 45}, {46, 47}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 26}, {21, 27}, {22, 23}, {24, 25}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 42}, {37, 43}, {38, 39}, {40, 41}, {44, 46}, {45, 47}, + {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 14}, {15, 31}, {16, 32}, {17, 18}, {19, 28}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {29, 30}, {33, 34}, {35, 44}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {45, 46}, + {0, 16}, {1, 4}, {2, 6}, {3, 19}, {5, 8}, {7, 10}, {9, 13}, {11, 14}, {17, 20}, {18, 22}, {21, 24}, {23, 26}, {25, 29}, {27, 30}, {28, 44}, {31, 47}, {33, 36}, {34, 38}, {37, 40}, {39, 42}, {41, 45}, {43, 46}, + {1, 33}, {2, 34}, {3, 35}, {5, 37}, {8, 24}, {9, 25}, {10, 42}, {11, 27}, {12, 44}, {13, 45}, {14, 46}, {15, 31}, {16, 32}, {20, 36}, {22, 38}, {23, 39}, + {1, 17}, {4, 20}, {5, 21}, {6, 22}, {7, 39}, {8, 40}, {12, 28}, {13, 29}, {18, 34}, {19, 35}, {25, 41}, {26, 42}, {27, 43}, {30, 46}, + {2, 18}, {4, 16}, {5, 32}, {7, 23}, {8, 19}, {9, 25}, {10, 26}, {11, 27}, {14, 30}, {15, 42}, {17, 33}, {20, 36}, {21, 37}, {22, 38}, {24, 40}, {28, 39}, {29, 45}, {31, 43}, + {1, 4}, {2, 5}, {3, 16}, {6, 17}, {7, 34}, {9, 33}, {12, 32}, {13, 40}, {14, 38}, {15, 35}, {19, 24}, {23, 28}, {30, 41}, {31, 44}, {42, 45}, {43, 46}, + {2, 4}, {3, 6}, {7, 20}, {9, 17}, {11, 34}, {12, 18}, {13, 36}, {14, 24}, {15, 25}, {16, 21}, {22, 32}, {23, 33}, {26, 31}, {27, 40}, {29, 35}, {30, 38}, {41, 44}, {43, 45}, + {3, 4}, {5, 6}, {7, 16}, {9, 12}, {10, 32}, {11, 21}, {13, 22}, {14, 23}, {15, 37}, {24, 33}, {25, 34}, {26, 36}, {31, 40}, {35, 38}, {41, 42}, {43, 44}, + {4, 5}, {6, 7}, {8, 13}, {10, 15}, {11, 14}, {16, 17}, {19, 22}, {21, 23}, {24, 26}, {25, 28}, {30, 31}, {32, 37}, {33, 36}, {34, 39}, {40, 41}, {42, 43}, + {7, 12}, {8, 16}, {10, 18}, {13, 19}, {15, 22}, {17, 20}, {21, 24}, {23, 26}, {25, 32}, {27, 30}, {28, 34}, {29, 37}, {31, 39}, {35, 40}, + {8, 9}, {10, 13}, {11, 17}, {12, 16}, {14, 20}, {15, 25}, {18, 19}, {22, 32}, {27, 33}, {28, 29}, {30, 36}, {31, 35}, {34, 37}, {38, 39}, + {6, 8}, {10, 11}, {13, 17}, {14, 18}, {15, 21}, {19, 20}, {22, 23}, {24, 25}, {26, 32}, {27, 28}, {29, 33}, {30, 34}, {36, 37}, {39, 41}, + {5, 6}, {9, 10}, {11, 13}, {14, 16}, {15, 19}, {17, 18}, {20, 21}, {22, 24}, {23, 25}, {26, 27}, {28, 32}, {29, 30}, {31, 33}, {34, 36}, {37, 38}, {41, 42}, + {7, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 17}, {18, 19}, {20, 22}, {21, 24}, {23, 26}, {25, 27}, {28, 29}, {30, 32}, {31, 34}, {33, 36}, {35, 37}, {38, 40}, + {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT48_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort49.h b/include/cpp-sort/detail/sorting_network/sort49.h new file mode 100644 index 00000000..601d483f --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort49.h @@ -0,0 +1,426 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT49_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT49_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<49> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 36, first + 48, compare, projection); + iter_swap_if(first + 37, first + 46, compare, projection); + iter_swap_if(first + 38, first + 45, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 47, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first, first + 24, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 36, first + 41, compare, projection); + iter_swap_if(first + 39, first + 44, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 42, first + 47, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 41, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 1, first + 13, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 12, first + 36, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 35, first + 47, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first, first + 12, compare, projection); + iter_swap_if(first + 2, first + 14, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 11, first + 35, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 24, first + 36, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 34, first + 46, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 34, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 46, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 1, first + 25, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 4, first + 28, compare, projection); + iter_swap_if(first + 5, first + 29, compare, projection); + iter_swap_if(first + 6, first + 30, compare, projection); + iter_swap_if(first + 7, first + 31, compare, projection); + iter_swap_if(first + 8, first + 32, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 19, first + 43, compare, projection); + iter_swap_if(first + 20, first + 48, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 33, first + 45, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 2, first + 26, compare, projection); + iter_swap_if(first + 4, first + 40, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 8, first + 20, compare, projection); + iter_swap_if(first + 9, first + 33, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 14, first + 38, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 17, first + 41, compare, projection); + iter_swap_if(first + 18, first + 42, compare, projection); + iter_swap_if(first + 21, first + 45, compare, projection); + iter_swap_if(first + 27, first + 39, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 3, first + 27, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 9, first + 37, compare, projection); + iter_swap_if(first + 10, first + 38, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 15, first + 39, compare, projection); + iter_swap_if(first + 19, first + 31, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 29, first + 41, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 8, first + 28, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 39, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 16, first + 36, compare, projection); + iter_swap_if(first + 17, first + 29, compare, projection); + iter_swap_if(first + 18, first + 30, compare, projection); + iter_swap_if(first + 20, first + 40, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 32, first + 44, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 38, first + 44, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 365> + { + return {{ + {0, 8}, {1, 7}, {2, 6}, {3, 11}, {4, 10}, {5, 9}, {12, 20}, {13, 19}, {14, 18}, {15, 23}, {16, 22}, {17, 21}, {24, 32}, {25, 31}, {26, 30}, {27, 35}, {28, 34}, {29, 33}, {36, 48}, {37, 46}, {38, 45}, {39, 43}, {41, 47}, {42, 44}, + {0, 1}, {2, 5}, {3, 4}, {6, 9}, {7, 8}, {10, 11}, {12, 13}, {14, 17}, {15, 16}, {18, 21}, {19, 20}, {22, 23}, {24, 25}, {26, 29}, {27, 28}, {30, 33}, {31, 32}, {34, 35}, {37, 42}, {38, 39}, {40, 47}, {43, 45}, {44, 46}, + {0, 2}, {1, 6}, {5, 10}, {9, 11}, {12, 14}, {13, 18}, {17, 22}, {21, 23}, {24, 26}, {25, 30}, {29, 34}, {33, 35}, {36, 40}, {37, 38}, {39, 42}, {43, 44}, {45, 46}, {47, 48}, + {0, 3}, {1, 2}, {4, 6}, {5, 7}, {8, 11}, {9, 10}, {12, 15}, {13, 14}, {16, 18}, {17, 19}, {20, 23}, {21, 22}, {24, 27}, {25, 26}, {28, 30}, {29, 31}, {32, 35}, {33, 34}, {40, 42}, {41, 45}, {44, 47}, {46, 48}, + {0, 24}, {1, 4}, {3, 5}, {6, 8}, {7, 10}, {11, 23}, {13, 16}, {15, 17}, {18, 20}, {19, 22}, {25, 28}, {27, 29}, {30, 32}, {31, 34}, {36, 41}, {39, 44}, {40, 43}, {42, 47}, {45, 46}, + {1, 3}, {2, 5}, {6, 9}, {8, 10}, {13, 15}, {14, 17}, {18, 21}, {20, 22}, {25, 27}, {26, 29}, {30, 33}, {32, 34}, {36, 37}, {38, 41}, {42, 45}, {43, 44}, {46, 47}, + {1, 13}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 22}, {12, 36}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {35, 47}, {37, 39}, {38, 40}, {41, 42}, {45, 46}, + {0, 12}, {2, 14}, {4, 6}, {5, 7}, {9, 21}, {11, 35}, {16, 18}, {17, 19}, {23, 47}, {24, 36}, {28, 30}, {29, 31}, {34, 46}, {37, 38}, {39, 40}, {41, 43}, {42, 44}, + {3, 4}, {5, 6}, {7, 8}, {10, 34}, {12, 24}, {15, 16}, {17, 18}, {19, 20}, {22, 46}, {23, 35}, {25, 37}, {27, 28}, {29, 30}, {31, 32}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, + {1, 25}, {3, 15}, {4, 28}, {5, 29}, {6, 30}, {7, 31}, {8, 32}, {13, 37}, {19, 43}, {20, 48}, {22, 34}, {26, 38}, {33, 45}, {39, 40}, {41, 42}, + {2, 26}, {4, 40}, {7, 19}, {8, 20}, {9, 33}, {13, 25}, {14, 38}, {16, 28}, {17, 41}, {18, 42}, {21, 45}, {27, 39}, {31, 43}, {32, 48}, + {3, 27}, {5, 17}, {6, 18}, {9, 37}, {10, 38}, {14, 26}, {15, 39}, {19, 31}, {20, 32}, {21, 33}, {28, 44}, {29, 41}, {30, 42}, {35, 43}, {36, 40}, + {5, 13}, {6, 14}, {8, 28}, {9, 25}, {10, 26}, {11, 39}, {15, 27}, {16, 36}, {17, 29}, {18, 30}, {20, 40}, {21, 37}, {22, 38}, {32, 44}, {33, 41}, {34, 42}, {43, 46}, + {4, 16}, {7, 15}, {8, 24}, {9, 13}, {10, 14}, {11, 27}, {17, 25}, {18, 26}, {21, 29}, {22, 30}, {23, 39}, {28, 36}, {32, 40}, {33, 37}, {34, 38}, {42, 48}, + {3, 9}, {4, 12}, {11, 15}, {13, 17}, {14, 18}, {19, 27}, {21, 25}, {22, 26}, {23, 31}, {24, 28}, {29, 33}, {30, 34}, {32, 36}, {35, 39}, {38, 44}, {43, 48}, + {1, 4}, {3, 5}, {7, 13}, {8, 12}, {11, 17}, {15, 19}, {16, 24}, {20, 28}, {23, 27}, {30, 36}, {31, 35}, {34, 40}, {39, 45}, + {2, 8}, {7, 9}, {12, 16}, {15, 21}, {19, 25}, {20, 24}, {23, 29}, {27, 33}, {28, 32}, {31, 37}, {34, 36}, {35, 41}, {39, 42}, {45, 48}, + {2, 4}, {6, 12}, {10, 16}, {14, 20}, {18, 24}, {19, 21}, {22, 28}, {23, 25}, {26, 32}, {29, 30}, {31, 33}, {35, 38}, {37, 40}, {39, 44}, {43, 45}, {46, 48}, + {6, 8}, {10, 12}, {11, 14}, {13, 16}, {15, 20}, {17, 18}, {22, 24}, {26, 28}, {27, 32}, {31, 34}, {33, 36}, {35, 37}, {38, 40}, {41, 44}, {47, 48}, + {3, 6}, {5, 8}, {7, 10}, {9, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 22}, {21, 24}, {23, 26}, {25, 28}, {27, 29}, {30, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 41}, {42, 44}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {39, 40}, {43, 44}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT49_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort5.h b/include/cpp-sort/detail/sorting_network/sort5.h index ca7ac7f2..12ef2f41 100644 --- a/include/cpp-sort/detail/sorting_network/sort5.h +++ b/include/cpp-sort/detail/sorting_network/sort5.h @@ -37,7 +37,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 9> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort50.h b/include/cpp-sort/detail/sorting_network/sort50.h new file mode 100644 index 00000000..01a307ae --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort50.h @@ -0,0 +1,437 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT50_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT50_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<50> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 37, first + 49, compare, projection); + iter_swap_if(first + 38, first + 47, compare, projection); + iter_swap_if(first + 39, first + 46, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 48, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first, first + 25, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 40, first + 45, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 12, first + 37, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 48, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 11, first + 36, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 23, first + 48, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 35, first + 47, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 1, first + 13, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 35, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 47, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 1, first + 26, compare, projection); + iter_swap_if(first + 2, first + 14, compare, projection); + iter_swap_if(first + 4, first + 29, compare, projection); + iter_swap_if(first + 5, first + 30, compare, projection); + iter_swap_if(first + 6, first + 31, compare, projection); + iter_swap_if(first + 7, first + 32, compare, projection); + iter_swap_if(first + 8, first + 49, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 13, first + 38, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 44, compare, projection); + iter_swap_if(first + 20, first + 45, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 27, first + 39, compare, projection); + iter_swap_if(first + 34, first + 46, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 2, first + 27, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 4, first + 37, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 34, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 39, compare, projection); + iter_swap_if(first + 16, first + 41, compare, projection); + iter_swap_if(first + 17, first + 42, compare, projection); + iter_swap_if(first + 18, first + 43, compare, projection); + iter_swap_if(first + 21, first + 46, compare, projection); + iter_swap_if(first + 28, first + 40, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 32, first + 44, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first + 3, first + 28, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 9, first + 38, compare, projection); + iter_swap_if(first + 10, first + 39, compare, projection); + iter_swap_if(first + 14, first + 27, compare, projection); + iter_swap_if(first + 15, first + 40, compare, projection); + iter_swap_if(first + 16, first + 25, compare, projection); + iter_swap_if(first + 19, first + 32, compare, projection); + iter_swap_if(first + 20, first + 29, compare, projection); + iter_swap_if(first + 21, first + 34, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 26, compare, projection); + iter_swap_if(first + 10, first + 27, compare, projection); + iter_swap_if(first + 11, first + 40, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 21, first + 38, compare, projection); + iter_swap_if(first + 22, first + 39, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 33, first + 45, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 28, compare, projection); + iter_swap_if(first + 16, first + 25, compare, projection); + iter_swap_if(first + 17, first + 26, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 20, first + 29, compare, projection); + iter_swap_if(first + 21, first + 30, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 23, first + 40, compare, projection); + iter_swap_if(first + 24, first + 41, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 46, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 376> + { + return {{ + {0, 8}, {1, 7}, {2, 6}, {3, 11}, {4, 10}, {5, 9}, {12, 24}, {13, 22}, {14, 21}, {15, 19}, {17, 23}, {18, 20}, {25, 33}, {26, 32}, {27, 31}, {28, 36}, {29, 35}, {30, 34}, {37, 49}, {38, 47}, {39, 46}, {40, 44}, {42, 48}, {43, 45}, + {0, 1}, {2, 5}, {3, 4}, {6, 9}, {7, 8}, {10, 11}, {13, 18}, {14, 15}, {16, 23}, {19, 21}, {20, 22}, {25, 26}, {27, 30}, {28, 29}, {31, 34}, {32, 33}, {35, 36}, {38, 43}, {39, 40}, {41, 48}, {44, 46}, {45, 47}, + {0, 2}, {1, 6}, {5, 10}, {9, 11}, {12, 16}, {13, 14}, {15, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 27}, {26, 31}, {30, 35}, {34, 36}, {37, 41}, {38, 39}, {40, 43}, {44, 45}, {46, 47}, {48, 49}, + {0, 3}, {1, 2}, {4, 6}, {5, 7}, {8, 11}, {9, 10}, {16, 18}, {17, 21}, {20, 23}, {22, 24}, {25, 28}, {26, 27}, {29, 31}, {30, 32}, {33, 36}, {34, 35}, {41, 43}, {42, 46}, {45, 48}, {47, 49}, + {0, 25}, {1, 4}, {3, 5}, {6, 8}, {7, 10}, {12, 17}, {15, 20}, {16, 19}, {18, 23}, {21, 22}, {26, 29}, {28, 30}, {31, 33}, {32, 35}, {37, 42}, {40, 45}, {41, 44}, {43, 48}, {46, 47}, + {1, 3}, {2, 5}, {6, 9}, {8, 10}, {12, 13}, {14, 17}, {18, 21}, {19, 20}, {22, 23}, {26, 28}, {27, 30}, {31, 34}, {33, 35}, {37, 38}, {39, 42}, {43, 46}, {44, 45}, {47, 48}, + {2, 3}, {4, 5}, {6, 7}, {8, 9}, {11, 23}, {12, 37}, {13, 15}, {14, 16}, {17, 18}, {21, 22}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {36, 48}, {38, 40}, {39, 41}, {42, 43}, {46, 47}, + {0, 12}, {4, 6}, {5, 7}, {10, 22}, {11, 36}, {13, 14}, {15, 16}, {17, 19}, {18, 20}, {23, 48}, {29, 31}, {30, 32}, {35, 47}, {38, 39}, {40, 41}, {42, 44}, {43, 45}, + {1, 13}, {3, 4}, {5, 6}, {7, 8}, {10, 35}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 47}, {23, 36}, {26, 38}, {28, 29}, {30, 31}, {32, 33}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, + {1, 26}, {2, 14}, {4, 29}, {5, 30}, {6, 31}, {7, 32}, {8, 49}, {9, 21}, {13, 38}, {15, 16}, {17, 18}, {19, 44}, {20, 45}, {22, 35}, {24, 33}, {27, 39}, {34, 46}, {40, 41}, {42, 43}, + {2, 27}, {3, 15}, {4, 37}, {7, 19}, {8, 24}, {9, 34}, {13, 26}, {14, 39}, {16, 41}, {17, 42}, {18, 43}, {21, 46}, {28, 40}, {29, 45}, {32, 44}, {33, 49}, + {3, 28}, {4, 12}, {5, 17}, {6, 18}, {9, 38}, {10, 39}, {14, 27}, {15, 40}, {16, 25}, {19, 32}, {20, 29}, {21, 34}, {24, 33}, {30, 42}, {31, 43}, {36, 44}, {48, 49}, + {5, 13}, {6, 14}, {8, 16}, {9, 26}, {10, 27}, {11, 40}, {12, 20}, {15, 28}, {17, 30}, {18, 31}, {21, 38}, {22, 39}, {25, 41}, {29, 37}, {33, 45}, {34, 42}, {35, 43}, {47, 48}, + {4, 8}, {7, 15}, {9, 13}, {10, 14}, {11, 28}, {16, 25}, {17, 26}, {18, 27}, {20, 29}, {21, 30}, {22, 31}, {23, 40}, {24, 41}, {34, 38}, {35, 39}, {43, 45}, + {1, 4}, {3, 9}, {8, 12}, {11, 15}, {13, 17}, {14, 18}, {16, 20}, {19, 28}, {21, 26}, {22, 27}, {23, 32}, {24, 25}, {30, 34}, {31, 35}, {33, 41}, {36, 40}, + {2, 8}, {7, 13}, {11, 17}, {12, 16}, {15, 19}, {23, 28}, {24, 29}, {25, 37}, {32, 36}, {39, 41}, {40, 46}, + {2, 4}, {5, 8}, {6, 12}, {10, 16}, {11, 13}, {15, 21}, {19, 26}, {20, 24}, {23, 30}, {25, 29}, {28, 34}, {32, 38}, {33, 37}, {36, 42}, {40, 43}, {45, 46}, + {6, 8}, {7, 10}, {9, 12}, {14, 20}, {18, 24}, {22, 25}, {27, 29}, {31, 33}, {35, 37}, {36, 39}, {41, 42}, {44, 46}, + {3, 6}, {7, 12}, {14, 16}, {15, 18}, {17, 20}, {19, 24}, {21, 22}, {23, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 35}, {33, 34}, {37, 38}, {40, 41}, {42, 43}, {44, 47}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 24}, {23, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {41, 42}, {44, 45}, {46, 47}, + {3, 4}, {7, 8}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {43, 44}, {47, 48}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT50_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort51.h b/include/cpp-sort/detail/sorting_network/sort51.h new file mode 100644 index 00000000..5f615df3 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort51.h @@ -0,0 +1,449 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT51_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT51_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<51> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 26, first + 35, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 38, first + 50, compare, projection); + iter_swap_if(first + 39, first + 48, compare, projection); + iter_swap_if(first + 40, first + 47, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 39, first + 44, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 49, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 46, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 28, first + 33, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 37, first + 50, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 41, first + 46, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 44, first + 49, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 12, first + 38, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 49, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 11, first + 36, compare, projection); + iter_swap_if(first + 12, first + 25, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 23, first + 49, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 35, first + 48, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 1, first + 13, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 35, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 48, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 26, first + 39, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 1, first + 26, compare, projection); + iter_swap_if(first + 2, first + 14, compare, projection); + iter_swap_if(first + 4, first + 33, compare, projection); + iter_swap_if(first + 7, first + 32, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 13, first + 39, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 45, compare, projection); + iter_swap_if(first + 20, first + 46, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 27, first + 40, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 34, first + 47, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first, first + 29, compare, projection); + iter_swap_if(first + 2, first + 27, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 4, first + 38, compare, projection); + iter_swap_if(first + 5, first + 30, compare, projection); + iter_swap_if(first + 6, first + 31, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 8, first + 37, compare, projection); + iter_swap_if(first + 9, first + 34, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 40, compare, projection); + iter_swap_if(first + 16, first + 42, compare, projection); + iter_swap_if(first + 17, first + 43, compare, projection); + iter_swap_if(first + 18, first + 44, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 21, first + 47, compare, projection); + iter_swap_if(first + 24, first + 50, compare, projection); + iter_swap_if(first + 28, first + 41, compare, projection); + iter_swap_if(first + 32, first + 45, compare, projection); + iter_swap_if(first + 33, first + 46, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 3, first + 28, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 9, first + 39, compare, projection); + iter_swap_if(first + 10, first + 40, compare, projection); + iter_swap_if(first + 14, first + 27, compare, projection); + iter_swap_if(first + 15, first + 41, compare, projection); + iter_swap_if(first + 19, first + 32, compare, projection); + iter_swap_if(first + 21, first + 34, compare, projection); + iter_swap_if(first + 24, first + 37, compare, projection); + iter_swap_if(first + 29, first + 42, compare, projection); + iter_swap_if(first + 30, first + 43, compare, projection); + iter_swap_if(first + 31, first + 44, compare, projection); + iter_swap_if(first + 33, first + 38, compare, projection); + iter_swap_if(first + 36, first + 45, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first, first + 12, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 8, first + 29, compare, projection); + iter_swap_if(first + 9, first + 26, compare, projection); + iter_swap_if(first + 10, first + 27, compare, projection); + iter_swap_if(first + 11, first + 41, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 21, first + 39, compare, projection); + iter_swap_if(first + 22, first + 40, compare, projection); + iter_swap_if(first + 24, first + 42, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 34, first + 43, compare, projection); + iter_swap_if(first + 35, first + 44, compare, projection); + iter_swap_if(first + 37, first + 46, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 28, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 17, first + 26, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 21, first + 30, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 23, first + 41, compare, projection); + iter_swap_if(first + 33, first + 38, compare, projection); + iter_swap_if(first + 34, first + 39, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 36, first + 41, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 8, first + 20, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 25, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 29, first + 38, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 36, first + 43, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 387> + { + return {{ + {0, 8}, {1, 7}, {2, 6}, {3, 11}, {4, 10}, {5, 9}, {12, 24}, {13, 22}, {14, 21}, {15, 19}, {17, 23}, {18, 20}, {25, 37}, {26, 35}, {27, 34}, {28, 32}, {30, 36}, {31, 33}, {38, 50}, {39, 48}, {40, 47}, {41, 45}, {43, 49}, {44, 46}, + {0, 1}, {2, 5}, {3, 4}, {6, 9}, {7, 8}, {10, 11}, {13, 18}, {14, 15}, {16, 23}, {19, 21}, {20, 22}, {26, 31}, {27, 28}, {29, 36}, {32, 34}, {33, 35}, {39, 44}, {40, 41}, {42, 49}, {45, 47}, {46, 48}, + {0, 2}, {1, 6}, {5, 10}, {9, 11}, {12, 16}, {13, 14}, {15, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 29}, {26, 27}, {28, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 42}, {39, 40}, {41, 44}, {45, 46}, {47, 48}, {49, 50}, + {0, 3}, {1, 2}, {4, 6}, {5, 7}, {8, 11}, {9, 10}, {16, 18}, {17, 21}, {20, 23}, {22, 24}, {29, 31}, {30, 34}, {33, 36}, {35, 37}, {42, 44}, {43, 47}, {46, 49}, {48, 50}, + {1, 4}, {3, 5}, {6, 8}, {7, 10}, {12, 17}, {15, 20}, {16, 19}, {18, 23}, {21, 22}, {25, 30}, {28, 33}, {29, 32}, {31, 36}, {34, 35}, {37, 50}, {38, 43}, {41, 46}, {42, 45}, {44, 49}, {47, 48}, + {1, 3}, {2, 5}, {6, 9}, {8, 10}, {12, 13}, {14, 17}, {18, 21}, {19, 20}, {22, 23}, {25, 26}, {27, 30}, {31, 34}, {32, 33}, {35, 36}, {38, 39}, {40, 43}, {44, 47}, {45, 46}, {48, 49}, + {2, 3}, {4, 5}, {6, 7}, {8, 9}, {11, 23}, {12, 38}, {13, 15}, {14, 16}, {17, 18}, {21, 22}, {26, 28}, {27, 29}, {30, 31}, {34, 35}, {36, 49}, {39, 41}, {40, 42}, {43, 44}, {47, 48}, + {4, 6}, {5, 7}, {10, 22}, {11, 36}, {12, 25}, {13, 14}, {15, 16}, {17, 19}, {18, 20}, {23, 49}, {26, 27}, {28, 29}, {30, 32}, {31, 33}, {35, 48}, {39, 40}, {41, 42}, {43, 45}, {44, 46}, + {1, 13}, {3, 4}, {5, 6}, {7, 8}, {10, 35}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 48}, {23, 36}, {26, 39}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {40, 41}, {42, 43}, {44, 45}, {46, 47}, + {1, 26}, {2, 14}, {4, 33}, {7, 32}, {8, 24}, {9, 21}, {13, 39}, {15, 16}, {17, 18}, {19, 45}, {20, 46}, {22, 35}, {27, 40}, {28, 29}, {30, 31}, {34, 47}, {41, 42}, {43, 44}, + {0, 29}, {2, 27}, {3, 15}, {4, 38}, {5, 30}, {6, 31}, {7, 19}, {8, 37}, {9, 34}, {13, 26}, {14, 40}, {16, 42}, {17, 43}, {18, 44}, {20, 25}, {21, 47}, {24, 50}, {28, 41}, {32, 45}, {33, 46}, + {0, 16}, {3, 28}, {4, 20}, {5, 17}, {6, 18}, {9, 39}, {10, 40}, {14, 27}, {15, 41}, {19, 32}, {21, 34}, {24, 37}, {29, 42}, {30, 43}, {31, 44}, {33, 38}, {36, 45}, {49, 50}, + {0, 12}, {5, 13}, {6, 14}, {8, 29}, {9, 26}, {10, 27}, {11, 41}, {15, 28}, {17, 30}, {18, 31}, {21, 39}, {22, 40}, {24, 42}, {25, 33}, {34, 43}, {35, 44}, {37, 46}, + {4, 12}, {7, 15}, {9, 13}, {10, 14}, {11, 28}, {16, 29}, {17, 26}, {18, 27}, {20, 25}, {21, 30}, {22, 31}, {23, 41}, {33, 38}, {34, 39}, {35, 40}, {37, 42}, {46, 48}, + {1, 4}, {3, 9}, {8, 16}, {11, 15}, {13, 17}, {14, 18}, {19, 28}, {21, 26}, {22, 27}, {23, 32}, {24, 29}, {30, 34}, {31, 35}, {36, 41}, {42, 45}, {48, 49}, + {7, 13}, {8, 20}, {11, 17}, {15, 19}, {16, 25}, {23, 28}, {24, 33}, {29, 38}, {32, 36}, {41, 47}, {42, 44}, + {8, 12}, {15, 21}, {16, 20}, {19, 26}, {23, 30}, {24, 25}, {28, 34}, {29, 33}, {32, 39}, {36, 43}, {37, 38}, {46, 47}, + {2, 8}, {6, 12}, {10, 16}, {14, 20}, {18, 24}, {22, 25}, {27, 29}, {31, 33}, {32, 34}, {35, 37}, {38, 40}, {41, 43}, {44, 46}, {45, 47}, + {2, 4}, {3, 8}, {5, 6}, {7, 10}, {9, 12}, {11, 14}, {13, 16}, {15, 20}, {17, 18}, {19, 22}, {21, 24}, {23, 27}, {25, 26}, {28, 31}, {29, 30}, {33, 35}, {36, 38}, {37, 39}, {40, 42}, {45, 46}, {47, 48}, + {3, 5}, {6, 8}, {7, 12}, {11, 16}, {15, 17}, {18, 20}, {19, 24}, {23, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 39}, {40, 41}, {42, 43}, + {3, 4}, {5, 6}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {17, 18}, {19, 21}, {22, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {36, 37}, {38, 39}, {41, 42}, {43, 44}, + {7, 8}, {11, 12}, {15, 16}, {19, 20}, {23, 24}, {35, 36}, {39, 40}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT51_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort52.h b/include/cpp-sort/detail/sorting_network/sort52.h new file mode 100644 index 00000000..07bc60ff --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort52.h @@ -0,0 +1,455 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT52_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT52_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<52> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first, first + 48, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 51, compare, projection); + iter_swap_if(first + 4, first + 40, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 31, compare, projection); + iter_swap_if(first + 8, first + 36, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 47, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 43, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 44, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 1, first + 49, compare, projection); + iter_swap_if(first + 2, first + 50, compare, projection); + iter_swap_if(first + 4, first + 24, compare, projection); + iter_swap_if(first + 5, first + 41, compare, projection); + iter_swap_if(first + 6, first + 30, compare, projection); + iter_swap_if(first + 7, first + 35, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 37, compare, projection); + iter_swap_if(first + 10, first + 46, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 42, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 16, first + 44, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 21, first + 45, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 27, first + 47, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 25, compare, projection); + iter_swap_if(first + 6, first + 34, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 17, first + 45, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 26, first + 46, compare, projection); + iter_swap_if(first + 27, first + 39, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 32, first + 44, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first, first + 20, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 7, first + 27, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 12, first + 32, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 19, first + 39, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 24, first + 44, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 31, first + 51, compare, projection); + iter_swap_if(first + 33, first + 45, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 21, compare, projection); + iter_swap_if(first + 6, first + 26, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 20, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 13, first + 33, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 17, first + 29, compare, projection); + iter_swap_if(first + 18, first + 38, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 24, first + 36, compare, projection); + iter_swap_if(first + 25, first + 45, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 30, first + 50, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 10, first + 40, compare, projection); + iter_swap_if(first + 11, first + 41, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 2, first + 32, compare, projection); + iter_swap_if(first + 7, first + 36, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 40, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 44, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 19, first + 49, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 3, first + 33, compare, projection); + iter_swap_if(first + 5, first + 12, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 18, first + 48, compare, projection); + iter_swap_if(first + 19, first + 41, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 50, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 39, first + 46, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 11, first + 25, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 17, first + 32, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 22, first + 36, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 26, first + 40, compare, projection); + iter_swap_if(first + 30, first + 45, compare, projection); + iter_swap_if(first + 33, first + 48, compare, projection); + iter_swap_if(first + 35, first + 49, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 24, compare, projection); + iter_swap_if(first + 6, first + 20, compare, projection); + iter_swap_if(first + 7, first + 21, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 28, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 19, first + 33, compare, projection); + iter_swap_if(first + 23, first + 37, compare, projection); + iter_swap_if(first + 27, first + 48, compare, projection); + iter_swap_if(first + 30, first + 44, compare, projection); + iter_swap_if(first + 31, first + 45, compare, projection); + iter_swap_if(first + 34, first + 41, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 16, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 11, first + 24, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 40, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 44, compare, projection); + iter_swap_if(first + 35, first + 48, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 38, first + 44, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 395> + { + return {{ + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {44, 46}, {45, 47}, {48, 50}, {49, 51}, + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, + {0, 48}, {1, 2}, {3, 51}, {4, 40}, {5, 6}, {7, 31}, {8, 36}, {9, 10}, {11, 47}, {12, 28}, {13, 14}, {15, 43}, {17, 18}, {19, 27}, {20, 44}, {21, 22}, {23, 39}, {24, 32}, {25, 26}, {29, 30}, {33, 34}, {37, 38}, {41, 42}, {45, 46}, {49, 50}, + {1, 49}, {2, 50}, {4, 24}, {5, 41}, {6, 30}, {7, 35}, {8, 12}, {9, 37}, {10, 46}, {11, 19}, {13, 29}, {14, 42}, {15, 23}, {16, 44}, {18, 26}, {21, 45}, {22, 38}, {25, 33}, {27, 47}, {28, 36}, {32, 40}, {39, 43}, + {0, 16}, {3, 7}, {4, 8}, {5, 25}, {6, 34}, {9, 13}, {10, 18}, {11, 15}, {12, 24}, {14, 22}, {17, 45}, {19, 23}, {26, 46}, {27, 39}, {28, 32}, {29, 37}, {33, 41}, {35, 51}, {36, 40}, {38, 42}, {43, 47}, {44, 48}, + {1, 17}, {2, 6}, {3, 11}, {5, 9}, {7, 19}, {10, 14}, {13, 25}, {15, 31}, {16, 24}, {18, 22}, {20, 36}, {26, 38}, {27, 35}, {29, 33}, {32, 44}, {34, 50}, {37, 41}, {40, 48}, {42, 46}, {45, 49}, + {0, 20}, {2, 10}, {6, 18}, {7, 27}, {11, 15}, {12, 32}, {14, 30}, {16, 28}, {17, 25}, {19, 39}, {21, 37}, {23, 35}, {24, 44}, {26, 34}, {31, 51}, {33, 45}, {36, 40}, {41, 49}, + {0, 4}, {1, 21}, {6, 26}, {7, 11}, {8, 20}, {10, 14}, {13, 33}, {15, 27}, {17, 29}, {18, 38}, {19, 23}, {22, 34}, {24, 36}, {25, 45}, {28, 32}, {30, 50}, {31, 43}, {37, 41}, {40, 44}, {47, 51}, + {1, 5}, {4, 12}, {6, 10}, {8, 16}, {9, 21}, {11, 15}, {14, 26}, {18, 22}, {20, 24}, {25, 37}, {27, 31}, {29, 33}, {30, 42}, {35, 43}, {36, 40}, {39, 47}, {41, 45}, {46, 50}, + {4, 8}, {5, 13}, {9, 17}, {10, 14}, {12, 16}, {19, 27}, {20, 28}, {21, 25}, {23, 31}, {24, 32}, {26, 30}, {34, 42}, {35, 39}, {37, 41}, {38, 46}, {43, 47}, + {5, 9}, {8, 12}, {10, 40}, {11, 41}, {13, 17}, {15, 19}, {16, 20}, {18, 26}, {21, 29}, {22, 30}, {23, 27}, {24, 28}, {25, 33}, {31, 35}, {32, 36}, {34, 38}, {39, 43}, {42, 46}, + {2, 32}, {7, 36}, {9, 13}, {11, 40}, {12, 16}, {14, 18}, {15, 44}, {17, 21}, {19, 49}, {20, 24}, {22, 26}, {25, 29}, {27, 31}, {30, 34}, {33, 37}, {35, 39}, {38, 42}, + {1, 16}, {3, 33}, {5, 12}, {9, 24}, {10, 32}, {13, 17}, {14, 15}, {18, 48}, {19, 41}, {21, 25}, {26, 30}, {27, 42}, {34, 38}, {35, 50}, {36, 37}, {39, 46}, + {1, 4}, {2, 16}, {3, 18}, {6, 21}, {11, 25}, {13, 28}, {15, 29}, {17, 32}, {19, 34}, {22, 36}, {23, 38}, {26, 40}, {30, 45}, {33, 48}, {35, 49}, {47, 50}, + {2, 8}, {3, 24}, {6, 20}, {7, 21}, {10, 17}, {12, 13}, {14, 28}, {18, 32}, {19, 33}, {23, 37}, {27, 48}, {30, 44}, {31, 45}, {34, 41}, {38, 39}, {43, 49}, + {2, 4}, {3, 16}, {6, 12}, {7, 20}, {11, 24}, {15, 28}, {19, 25}, {21, 22}, {23, 36}, {26, 32}, {27, 40}, {29, 30}, {31, 44}, {35, 48}, {39, 45}, {47, 49}, + {3, 9}, {7, 13}, {10, 16}, {11, 17}, {14, 20}, {15, 21}, {18, 24}, {19, 26}, {22, 28}, {23, 29}, {25, 32}, {27, 33}, {30, 36}, {31, 37}, {34, 40}, {35, 41}, {38, 44}, {42, 48}, + {3, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 22}, {21, 24}, {23, 25}, {26, 28}, {27, 30}, {29, 32}, {31, 33}, {34, 36}, {35, 37}, {38, 40}, {39, 41}, {42, 44}, {43, 48}, + {3, 5}, {6, 8}, {7, 10}, {9, 12}, {11, 14}, {13, 16}, {15, 18}, {17, 20}, {19, 21}, {22, 24}, {23, 26}, {25, 28}, {27, 29}, {30, 32}, {31, 34}, {33, 36}, {35, 38}, {37, 40}, {39, 42}, {41, 44}, {43, 45}, {46, 48}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT52_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort53.h b/include/cpp-sort/detail/sorting_network/sort53.h new file mode 100644 index 00000000..19a0b118 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort53.h @@ -0,0 +1,473 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT53_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT53_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<53> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 12, compare, projection); + iter_swap_if(first + 1, first + 10, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 14, first + 23, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 27, first + 36, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 40, first + 50, compare, projection); + iter_swap_if(first + 41, first + 51, compare, projection); + iter_swap_if(first + 42, first + 49, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 11, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 37, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 52, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 48, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 43, first + 50, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 38, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first, first + 26, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 24, compare, projection); + iter_swap_if(first + 13, first + 39, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first, first + 13, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 23, compare, projection); + iter_swap_if(first + 12, first + 51, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 26, first + 39, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 1, first + 27, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 25, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 40, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 37, first + 50, compare, projection); + iter_swap_if(first + 38, first + 51, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 1, first + 14, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 33, compare, projection); + iter_swap_if(first + 8, first + 34, compare, projection); + iter_swap_if(first + 9, first + 35, compare, projection); + iter_swap_if(first + 11, first + 37, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 22, first + 52, compare, projection); + iter_swap_if(first + 24, first + 50, compare, projection); + iter_swap_if(first + 25, first + 38, compare, projection); + iter_swap_if(first + 27, first + 40, compare, projection); + iter_swap_if(first + 28, first + 41, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 2, first + 28, compare, projection); + iter_swap_if(first + 3, first + 16, compare, projection); + iter_swap_if(first + 4, first + 43, compare, projection); + iter_swap_if(first + 5, first + 31, compare, projection); + iter_swap_if(first + 6, first + 32, compare, projection); + iter_swap_if(first + 9, first + 22, compare, projection); + iter_swap_if(first + 14, first + 27, compare, projection); + iter_swap_if(first + 15, first + 41, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 19, first + 45, compare, projection); + iter_swap_if(first + 20, first + 46, compare, projection); + iter_swap_if(first + 21, first + 47, compare, projection); + iter_swap_if(first + 24, first + 37, compare, projection); + iter_swap_if(first + 29, first + 42, compare, projection); + iter_swap_if(first + 35, first + 52, compare, projection); + iter_swap_if(first + 36, first + 49, compare, projection); + iter_swap_if(first + 3, first + 29, compare, projection); + iter_swap_if(first + 4, first + 17, compare, projection); + iter_swap_if(first + 5, first + 44, compare, projection); + iter_swap_if(first + 6, first + 19, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 8, first + 21, compare, projection); + iter_swap_if(first + 10, first + 36, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 16, first + 42, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 23, first + 49, compare, projection); + iter_swap_if(first + 30, first + 43, compare, projection); + iter_swap_if(first + 32, first + 45, compare, projection); + iter_swap_if(first + 33, first + 46, compare, projection); + iter_swap_if(first + 34, first + 47, compare, projection); + iter_swap_if(first + 4, first + 13, compare, projection); + iter_swap_if(first + 6, first + 15, compare, projection); + iter_swap_if(first + 8, first + 26, compare, projection); + iter_swap_if(first + 10, first + 41, compare, projection); + iter_swap_if(first + 11, first + 42, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 19, first + 32, compare, projection); + iter_swap_if(first + 20, first + 33, compare, projection); + iter_swap_if(first + 21, first + 34, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 25, first + 43, compare, projection); + iter_swap_if(first + 31, first + 48, compare, projection); + iter_swap_if(first + 37, first + 46, compare, projection); + iter_swap_if(first + 38, first + 47, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 7, first + 16, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 9, first + 31, compare, projection); + iter_swap_if(first + 10, first + 28, compare, projection); + iter_swap_if(first + 11, first + 29, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 18, first + 40, compare, projection); + iter_swap_if(first + 21, first + 39, compare, projection); + iter_swap_if(first + 22, first + 44, compare, projection); + iter_swap_if(first + 23, first + 41, compare, projection); + iter_swap_if(first + 24, first + 42, compare, projection); + iter_swap_if(first + 35, first + 48, compare, projection); + iter_swap_if(first + 36, first + 45, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 47, first + 52, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 5, first + 18, compare, projection); + iter_swap_if(first + 9, first + 27, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 12, first + 21, compare, projection); + iter_swap_if(first + 17, first + 26, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 20, first + 29, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 25, first + 39, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 40, compare, projection); + iter_swap_if(first + 35, first + 44, compare, projection); + iter_swap_if(first + 36, first + 41, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 14, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 39, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 9, first + 14, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 37, first + 44, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 38, first + 41, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 20, first + 27, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 411> + { + return {{ + {0, 12}, {1, 10}, {2, 9}, {3, 7}, {5, 11}, {6, 8}, {13, 25}, {14, 23}, {15, 22}, {16, 20}, {18, 24}, {19, 21}, {26, 38}, {27, 36}, {28, 35}, {29, 33}, {31, 37}, {32, 34}, {39, 45}, {40, 50}, {41, 51}, {42, 49}, {43, 44}, {46, 52}, {47, 48}, + {1, 6}, {2, 3}, {4, 11}, {7, 9}, {8, 10}, {14, 19}, {15, 16}, {17, 24}, {20, 22}, {21, 23}, {27, 32}, {28, 29}, {30, 37}, {33, 35}, {34, 36}, {40, 41}, {42, 46}, {43, 47}, {44, 48}, {45, 49}, {50, 51}, + {0, 4}, {1, 2}, {3, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 17}, {14, 15}, {16, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 30}, {27, 28}, {29, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 43}, {40, 42}, {44, 45}, {46, 47}, {48, 52}, {49, 51}, + {4, 6}, {5, 9}, {8, 11}, {10, 12}, {17, 19}, {18, 22}, {21, 24}, {23, 25}, {30, 32}, {31, 35}, {34, 37}, {36, 38}, {39, 40}, {41, 48}, {42, 46}, {43, 50}, {45, 49}, {51, 52}, + {0, 5}, {3, 8}, {4, 7}, {6, 11}, {9, 10}, {13, 18}, {16, 21}, {17, 20}, {19, 24}, {22, 23}, {25, 38}, {26, 31}, {29, 34}, {30, 33}, {32, 37}, {35, 36}, {41, 44}, {43, 46}, {45, 48}, {47, 50}, + {0, 1}, {2, 5}, {6, 9}, {7, 8}, {10, 11}, {13, 14}, {15, 18}, {19, 22}, {20, 21}, {23, 24}, {26, 27}, {28, 31}, {32, 35}, {33, 34}, {36, 37}, {40, 41}, {42, 43}, {45, 46}, {48, 49}, {50, 51}, + {0, 26}, {1, 3}, {2, 4}, {5, 6}, {9, 10}, {11, 24}, {13, 39}, {14, 16}, {15, 17}, {18, 19}, {22, 23}, {27, 29}, {28, 30}, {31, 32}, {35, 36}, {40, 42}, {41, 43}, {44, 45}, {46, 47}, {48, 50}, {49, 51}, + {0, 13}, {1, 2}, {3, 4}, {5, 7}, {6, 8}, {10, 23}, {12, 51}, {14, 15}, {16, 17}, {18, 20}, {19, 21}, {26, 39}, {27, 28}, {29, 30}, {31, 33}, {32, 34}, {41, 42}, {43, 46}, {45, 48}, {49, 50}, + {1, 27}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {12, 25}, {13, 26}, {14, 40}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {37, 50}, {38, 51}, {43, 44}, {45, 46}, {47, 48}, + {1, 14}, {2, 15}, {3, 4}, {5, 6}, {7, 33}, {8, 34}, {9, 35}, {11, 37}, {16, 17}, {18, 19}, {22, 52}, {24, 50}, {25, 38}, {27, 40}, {28, 41}, {29, 30}, {31, 32}, {42, 43}, {44, 45}, {46, 47}, {48, 49}, + {2, 28}, {3, 16}, {4, 43}, {5, 31}, {6, 32}, {9, 22}, {14, 27}, {15, 41}, {17, 30}, {19, 45}, {20, 46}, {21, 47}, {24, 37}, {29, 42}, {35, 52}, {36, 49}, + {3, 29}, {4, 17}, {5, 44}, {6, 19}, {7, 20}, {8, 21}, {10, 36}, {15, 28}, {16, 42}, {18, 31}, {22, 35}, {23, 49}, {30, 43}, {32, 45}, {33, 46}, {34, 47}, + {4, 13}, {6, 15}, {8, 26}, {10, 41}, {11, 42}, {12, 17}, {16, 29}, {19, 32}, {20, 33}, {21, 34}, {23, 36}, {25, 43}, {31, 48}, {37, 46}, {38, 47}, {40, 44}, + {1, 4}, {7, 16}, {8, 13}, {9, 31}, {10, 28}, {11, 29}, {17, 30}, {18, 40}, {21, 39}, {22, 44}, {23, 41}, {24, 42}, {35, 48}, {36, 45}, {38, 43}, {47, 52}, + {2, 8}, {5, 18}, {9, 27}, {10, 15}, {11, 16}, {12, 21}, {17, 26}, {19, 28}, {20, 29}, {23, 32}, {24, 33}, {25, 39}, {30, 34}, {31, 40}, {35, 44}, {36, 41}, {37, 42}, {43, 49}, {46, 47}, + {2, 4}, {5, 14}, {12, 17}, {15, 19}, {16, 20}, {21, 26}, {23, 28}, {24, 29}, {25, 30}, {27, 31}, {32, 36}, {33, 37}, {34, 39}, {35, 40}, {42, 48}, {49, 50}, + {5, 8}, {9, 14}, {12, 13}, {17, 21}, {18, 27}, {22, 31}, {25, 26}, {30, 34}, {33, 40}, {37, 44}, {38, 39}, {43, 48}, {47, 49}, {50, 52}, + {3, 9}, {6, 12}, {10, 13}, {14, 18}, {15, 17}, {19, 21}, {22, 27}, {23, 25}, {26, 28}, {30, 32}, {31, 35}, {34, 36}, {38, 41}, {39, 45}, {49, 50}, {51, 52}, + {3, 6}, {7, 14}, {10, 12}, {11, 18}, {16, 22}, {20, 27}, {24, 31}, {25, 26}, {29, 35}, {32, 33}, {36, 37}, {38, 40}, {39, 42}, {41, 44}, {45, 46}, + {3, 8}, {7, 9}, {11, 15}, {13, 14}, {16, 19}, {17, 18}, {20, 23}, {21, 22}, {24, 27}, {28, 31}, {29, 30}, {34, 35}, {36, 38}, {37, 40}, {39, 44}, {43, 45}, {46, 48}, + {3, 5}, {6, 8}, {7, 10}, {9, 12}, {11, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 34}, {33, 35}, {37, 38}, {39, 41}, {42, 44}, {45, 46}, {47, 48}, + {3, 4}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {39, 40}, {43, 44}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT53_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort54.h b/include/cpp-sort/detail/sorting_network/sort54.h new file mode 100644 index 00000000..62b7a327 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort54.h @@ -0,0 +1,482 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT54_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT54_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<54> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 13, compare, projection); + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 34, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 19, first + 37, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 35, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 38, first + 51, compare, projection); + iter_swap_if(first + 39, first + 50, compare, projection); + iter_swap_if(first + 40, first + 53, compare, projection); + iter_swap_if(first + 41, first + 52, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 40, first + 47, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 44, first + 51, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 48, first + 53, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 32, compare, projection); + iter_swap_if(first + 21, first + 36, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 50, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first, first + 22, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 15, first + 37, compare, projection); + iter_swap_if(first + 16, first + 38, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 53, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 36, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 39, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 40, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 51, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 14, first + 36, compare, projection); + iter_swap_if(first + 17, first + 39, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 5, first + 43, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 48, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 37, first + 51, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 3, first + 27, compare, projection); + iter_swap_if(first + 6, first + 24, compare, projection); + iter_swap_if(first + 8, first + 38, compare, projection); + iter_swap_if(first + 9, first + 39, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 11, first + 33, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 14, first + 44, compare, projection); + iter_swap_if(first + 15, first + 45, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 42, compare, projection); + iter_swap_if(first + 21, first + 43, compare, projection); + iter_swap_if(first + 26, first + 50, compare, projection); + iter_swap_if(first + 28, first + 40, compare, projection); + iter_swap_if(first + 29, first + 47, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 42, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 9, first + 29, compare, projection); + iter_swap_if(first + 11, first + 49, compare, projection); + iter_swap_if(first + 12, first + 26, compare, projection); + iter_swap_if(first + 18, first + 28, compare, projection); + iter_swap_if(first + 24, first + 44, compare, projection); + iter_swap_if(first + 25, first + 35, compare, projection); + iter_swap_if(first + 27, first + 41, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 30, compare, projection); + iter_swap_if(first + 10, first + 28, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 45, compare, projection); + iter_swap_if(first + 25, first + 43, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first + 35, first + 47, compare, projection); + iter_swap_if(first + 36, first + 48, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 28, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 25, first + 39, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 31, first + 40, compare, projection); + iter_swap_if(first + 32, first + 44, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 4, first + 9, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 21, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 22, first + 29, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 34, first + 46, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 44, first + 49, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 20, first + 30, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 39, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 3, first + 13, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 50, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 40, first + 46, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 50, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 421> + { + return {{ + {0, 13}, {1, 12}, {2, 15}, {3, 14}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {16, 34}, {17, 33}, {18, 32}, {19, 37}, {20, 36}, {21, 35}, {22, 30}, {23, 31}, {24, 29}, {25, 27}, {26, 28}, {38, 51}, {39, 50}, {40, 53}, {41, 52}, {42, 46}, {43, 44}, {45, 49}, {47, 48}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {6, 13}, {8, 14}, {10, 15}, {11, 12}, {16, 17}, {18, 21}, {19, 20}, {22, 24}, {23, 26}, {27, 30}, {29, 31}, {32, 35}, {33, 34}, {36, 37}, {38, 43}, {39, 45}, {40, 47}, {41, 42}, {44, 51}, {46, 52}, {48, 53}, {49, 50}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 18}, {17, 32}, {21, 36}, {22, 25}, {24, 26}, {27, 29}, {28, 31}, {35, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 46}, {45, 47}, {48, 49}, {50, 51}, {52, 53}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {12, 14}, {13, 15}, {16, 19}, {17, 18}, {20, 32}, {21, 33}, {22, 23}, {25, 28}, {30, 31}, {34, 37}, {35, 36}, {38, 40}, {39, 41}, {42, 48}, {43, 49}, {44, 45}, {46, 47}, {50, 52}, {51, 53}, + {0, 16}, {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 14}, {15, 31}, {17, 20}, {19, 21}, {22, 38}, {23, 27}, {24, 25}, {26, 30}, {28, 29}, {32, 34}, {33, 36}, {37, 53}, {39, 40}, {41, 50}, {42, 44}, {43, 45}, {46, 48}, {47, 49}, {51, 52}, + {0, 22}, {1, 4}, {2, 6}, {5, 8}, {7, 10}, {9, 13}, {11, 14}, {15, 37}, {16, 38}, {17, 19}, {18, 21}, {23, 24}, {25, 27}, {26, 28}, {29, 30}, {31, 53}, {32, 35}, {34, 36}, {39, 42}, {40, 44}, {43, 46}, {45, 48}, {47, 51}, {49, 52}, + {2, 4}, {3, 6}, {9, 12}, {11, 13}, {14, 36}, {16, 22}, {17, 39}, {18, 19}, {20, 21}, {24, 25}, {26, 27}, {28, 29}, {31, 37}, {32, 33}, {34, 35}, {40, 42}, {41, 44}, {47, 50}, {49, 51}, + {1, 17}, {2, 40}, {3, 5}, {6, 8}, {7, 9}, {10, 12}, {13, 51}, {18, 24}, {20, 32}, {21, 33}, {25, 26}, {27, 28}, {29, 35}, {36, 52}, {41, 43}, {44, 46}, {45, 47}, {48, 50}, + {2, 18}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {14, 36}, {17, 39}, {19, 20}, {21, 32}, {33, 34}, {35, 51}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, + {2, 16}, {5, 43}, {6, 7}, {8, 9}, {10, 48}, {17, 23}, {20, 26}, {21, 25}, {27, 33}, {28, 32}, {30, 36}, {37, 51}, {44, 45}, {46, 47}, + {3, 27}, {6, 24}, {8, 38}, {9, 39}, {10, 32}, {11, 33}, {13, 25}, {14, 44}, {15, 45}, {17, 22}, {19, 23}, {20, 42}, {21, 43}, {26, 50}, {28, 40}, {29, 47}, {30, 34}, {31, 36}, + {1, 17}, {3, 19}, {4, 42}, {5, 21}, {6, 14}, {7, 23}, {9, 29}, {11, 49}, {12, 26}, {18, 28}, {24, 44}, {25, 35}, {27, 41}, {30, 46}, {32, 48}, {34, 50}, {36, 52}, {39, 47}, + {1, 2}, {4, 20}, {5, 17}, {6, 18}, {7, 15}, {8, 30}, {10, 28}, {19, 27}, {21, 22}, {23, 45}, {25, 43}, {26, 34}, {31, 32}, {33, 49}, {35, 47}, {36, 48}, {38, 46}, {51, 52}, + {3, 19}, {8, 16}, {9, 21}, {10, 18}, {11, 27}, {12, 20}, {13, 22}, {14, 28}, {15, 23}, {25, 39}, {26, 42}, {30, 38}, {31, 40}, {32, 44}, {33, 41}, {34, 50}, {35, 43}, {37, 45}, + {4, 9}, {7, 19}, {12, 16}, {13, 21}, {20, 26}, {22, 29}, {24, 31}, {27, 33}, {32, 40}, {34, 46}, {37, 41}, {44, 49}, + {4, 8}, {9, 12}, {11, 19}, {13, 17}, {14, 24}, {15, 27}, {20, 30}, {22, 25}, {23, 33}, {26, 38}, {28, 31}, {29, 39}, {34, 42}, {36, 40}, {41, 44}, {45, 49}, + {3, 13}, {6, 9}, {10, 12}, {11, 17}, {14, 16}, {15, 22}, {18, 20}, {19, 21}, {23, 25}, {24, 26}, {27, 29}, {28, 30}, {31, 38}, {32, 34}, {33, 35}, {36, 42}, {37, 39}, {40, 50}, {41, 43}, {44, 47}, + {3, 8}, {7, 13}, {9, 10}, {14, 18}, {15, 19}, {16, 20}, {21, 22}, {23, 27}, {24, 28}, {25, 29}, {26, 30}, {31, 32}, {33, 37}, {34, 38}, {35, 39}, {40, 46}, {43, 44}, {45, 50}, + {3, 5}, {6, 8}, {7, 9}, {11, 13}, {12, 14}, {15, 17}, {16, 18}, {19, 21}, {20, 24}, {22, 23}, {25, 27}, {26, 28}, {29, 33}, {30, 31}, {32, 34}, {35, 37}, {36, 38}, {39, 41}, {40, 42}, {44, 46}, {45, 47}, {48, 50}, + {3, 4}, {5, 6}, {7, 8}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 24}, {23, 26}, {25, 28}, {27, 30}, {29, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {45, 46}, {47, 48}, {49, 50}, + {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT54_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort55.h b/include/cpp-sort/detail/sorting_network/sort55.h new file mode 100644 index 00000000..b76b5b40 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort55.h @@ -0,0 +1,492 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT55_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT55_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<55> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 13, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 37, compare, projection); + iter_swap_if(first + 17, first + 36, compare, projection); + iter_swap_if(first + 19, first + 38, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 40, first + 53, compare, projection); + iter_swap_if(first + 41, first + 52, compare, projection); + iter_swap_if(first + 43, first + 54, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 15, first + 33, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 37, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 39, first + 49, compare, projection); + iter_swap_if(first + 40, first + 45, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 46, first + 53, compare, projection); + iter_swap_if(first + 48, first + 54, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 35, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 51, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 35, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first, first + 24, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 39, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 31, first + 54, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 43, first + 50, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 39, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 46, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 24, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 1, first + 25, compare, projection); + iter_swap_if(first + 2, first + 26, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 36, compare, projection); + iter_swap_if(first + 14, first + 37, compare, projection); + iter_swap_if(first + 16, first + 40, compare, projection); + iter_swap_if(first + 17, first + 41, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 29, first + 52, compare, projection); + iter_swap_if(first + 30, first + 53, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 16, first + 25, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 26, first + 41, compare, projection); + iter_swap_if(first + 30, first + 37, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 3, first + 27, compare, projection); + iter_swap_if(first + 4, first + 43, compare, projection); + iter_swap_if(first + 5, first + 44, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 49, compare, projection); + iter_swap_if(first + 11, first + 50, compare, projection); + iter_swap_if(first + 12, first + 35, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 17, first + 26, compare, projection); + iter_swap_if(first + 18, first + 42, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 28, first + 51, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 30, first + 41, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 4, first + 19, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 7, first + 31, compare, projection); + iter_swap_if(first + 8, first + 23, compare, projection); + iter_swap_if(first + 9, first + 40, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 14, first + 45, compare, projection); + iter_swap_if(first + 22, first + 46, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 22, compare, projection); + iter_swap_if(first + 8, first + 39, compare, projection); + iter_swap_if(first + 9, first + 32, compare, projection); + iter_swap_if(first + 10, first + 33, compare, projection); + iter_swap_if(first + 11, first + 34, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 19, first + 43, compare, projection); + iter_swap_if(first + 20, first + 44, compare, projection); + iter_swap_if(first + 21, first + 45, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 31, first + 46, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 28, first + 43, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 47, compare, projection); + iter_swap_if(first + 36, first + 48, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 39, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 23, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 25, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 30, first + 35, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 432> + { + return {{ + {1, 12}, {2, 13}, {3, 14}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {15, 18}, {16, 37}, {17, 36}, {19, 38}, {20, 32}, {21, 22}, {23, 35}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {33, 34}, {39, 42}, {40, 53}, {41, 52}, {43, 54}, {44, 48}, {45, 46}, {47, 51}, {49, 50}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {8, 14}, {10, 13}, {11, 12}, {15, 33}, {16, 21}, {17, 23}, {18, 34}, {19, 20}, {22, 37}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {32, 38}, {35, 36}, {39, 49}, {40, 45}, {41, 47}, {42, 50}, {43, 44}, {46, 53}, {48, 54}, {51, 52}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {13, 14}, {15, 19}, {16, 17}, {18, 35}, {20, 21}, {22, 32}, {23, 33}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {34, 38}, {36, 37}, {39, 43}, {40, 41}, {42, 51}, {44, 45}, {46, 48}, {47, 49}, {50, 54}, {52, 53}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {12, 13}, {15, 16}, {17, 19}, {18, 20}, {21, 35}, {22, 23}, {26, 28}, {27, 29}, {32, 33}, {34, 36}, {37, 38}, {39, 40}, {41, 43}, {42, 44}, {45, 51}, {46, 47}, {48, 49}, {50, 52}, {53, 54}, + {0, 24}, {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 14}, {15, 39}, {16, 17}, {18, 22}, {19, 34}, {20, 32}, {21, 23}, {25, 28}, {27, 30}, {31, 54}, {33, 35}, {36, 37}, {40, 41}, {42, 46}, {43, 50}, {44, 48}, {45, 47}, {49, 51}, {52, 53}, + {0, 15}, {1, 4}, {2, 6}, {5, 8}, {7, 10}, {9, 13}, {11, 14}, {16, 18}, {17, 22}, {20, 21}, {23, 32}, {24, 39}, {25, 26}, {27, 28}, {29, 30}, {31, 38}, {33, 36}, {35, 37}, {40, 42}, {41, 46}, {44, 45}, {47, 48}, {49, 52}, {51, 53}, + {1, 16}, {2, 4}, {3, 6}, {9, 12}, {11, 13}, {14, 30}, {15, 24}, {17, 18}, {19, 22}, {25, 40}, {33, 34}, {35, 36}, {37, 53}, {38, 54}, {41, 42}, {43, 46}, {49, 50}, {51, 52}, + {1, 25}, {2, 26}, {3, 5}, {6, 8}, {7, 9}, {10, 12}, {13, 36}, {14, 37}, {16, 40}, {17, 41}, {19, 20}, {21, 22}, {23, 33}, {29, 52}, {30, 53}, {32, 34}, {43, 44}, {45, 46}, {47, 49}, {48, 50}, + {2, 17}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 29}, {16, 25}, {18, 19}, {20, 21}, {22, 23}, {26, 41}, {30, 37}, {32, 33}, {34, 35}, {36, 52}, {42, 43}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, + {2, 15}, {3, 27}, {4, 43}, {5, 44}, {6, 7}, {8, 9}, {10, 49}, {11, 50}, {12, 35}, {13, 25}, {17, 26}, {18, 42}, {21, 22}, {23, 32}, {28, 51}, {29, 36}, {30, 41}, {45, 46}, {47, 48}, {52, 54}, + {3, 18}, {4, 19}, {5, 20}, {6, 21}, {7, 31}, {8, 23}, {9, 40}, {12, 28}, {14, 45}, {22, 46}, {27, 42}, {32, 48}, {33, 49}, {34, 50}, {35, 51}, {39, 47}, + {5, 13}, {6, 14}, {7, 22}, {8, 39}, {9, 32}, {10, 33}, {11, 34}, {12, 24}, {18, 27}, {19, 43}, {20, 44}, {21, 45}, {23, 47}, {28, 35}, {31, 46}, {38, 42}, {40, 48}, {41, 49}, + {4, 12}, {6, 17}, {7, 18}, {8, 15}, {9, 16}, {10, 26}, {11, 27}, {19, 24}, {20, 25}, {22, 31}, {23, 39}, {28, 43}, {29, 44}, {30, 33}, {34, 38}, {35, 47}, {36, 48}, {37, 45}, {42, 50}, {46, 52}, + {1, 4}, {3, 9}, {10, 17}, {11, 18}, {12, 19}, {14, 30}, {16, 20}, {21, 26}, {24, 28}, {25, 40}, {27, 34}, {29, 32}, {33, 37}, {35, 43}, {36, 44}, {38, 42}, {45, 51}, {50, 53}, + {1, 2}, {4, 8}, {5, 9}, {13, 20}, {14, 21}, {15, 19}, {22, 27}, {23, 24}, {25, 29}, {26, 30}, {28, 39}, {31, 34}, {32, 40}, {33, 41}, {38, 46}, {45, 49}, {50, 52}, {53, 54}, + {3, 4}, {12, 15}, {13, 16}, {14, 23}, {17, 19}, {18, 25}, {20, 22}, {21, 26}, {24, 28}, {27, 31}, {29, 32}, {30, 35}, {33, 39}, {34, 40}, {36, 38}, {37, 41}, {42, 46}, {51, 52}, + {4, 8}, {6, 12}, {7, 13}, {10, 15}, {11, 16}, {14, 17}, {18, 20}, {19, 23}, {21, 24}, {22, 25}, {26, 28}, {27, 29}, {30, 33}, {31, 32}, {34, 36}, {35, 39}, {37, 43}, {38, 40}, {41, 47}, {42, 44}, {46, 48}, {50, 51}, + {5, 8}, {7, 10}, {9, 12}, {11, 14}, {13, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 35}, {33, 34}, {36, 39}, {37, 38}, {40, 43}, {41, 42}, {44, 47}, {45, 46}, {49, 50}, + {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 47}, {48, 49}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT55_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort56.h b/include/cpp-sort/detail/sorting_network/sort56.h new file mode 100644 index 00000000..de635b21 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort56.h @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT56_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT56_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<56> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 13, compare, projection); + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 15, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 37, compare, projection); + iter_swap_if(first + 17, first + 36, compare, projection); + iter_swap_if(first + 18, first + 39, compare, projection); + iter_swap_if(first + 19, first + 38, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 40, first + 53, compare, projection); + iter_swap_if(first + 41, first + 52, compare, projection); + iter_swap_if(first + 42, first + 55, compare, projection); + iter_swap_if(first + 43, first + 54, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first, first + 5, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 33, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 37, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 34, first + 39, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 40, first + 45, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 49, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 46, first + 53, compare, projection); + iter_swap_if(first + 48, first + 54, compare, projection); + iter_swap_if(first + 50, first + 55, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 34, compare, projection); + iter_swap_if(first + 21, first + 35, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 50, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first, first + 24, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 12, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 39, compare, projection); + iter_swap_if(first + 16, first + 40, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 36, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 31, first + 55, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 52, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 23, first + 34, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 39, first + 55, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 49, first + 53, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 1, first + 17, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 1, first + 25, compare, projection); + iter_swap_if(first + 2, first + 26, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 37, compare, projection); + iter_swap_if(first + 14, first + 38, compare, projection); + iter_swap_if(first + 17, first + 41, compare, projection); + iter_swap_if(first + 18, first + 42, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 32, compare, projection); + iter_swap_if(first + 23, first + 33, compare, projection); + iter_swap_if(first + 29, first + 53, compare, projection); + iter_swap_if(first + 30, first + 54, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 2, first + 18, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 2, first + 16, compare, projection); + iter_swap_if(first + 3, first + 27, compare, projection); + iter_swap_if(first + 4, first + 44, compare, projection); + iter_swap_if(first + 5, first + 45, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 50, compare, projection); + iter_swap_if(first + 11, first + 51, compare, projection); + iter_swap_if(first + 12, first + 36, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 43, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 28, first + 52, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 39, first + 53, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 3, first + 19, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 21, compare, projection); + iter_swap_if(first + 6, first + 22, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 8, first + 32, compare, projection); + iter_swap_if(first + 9, first + 41, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 14, first + 46, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 23, compare, projection); + iter_swap_if(first + 8, first + 40, compare, projection); + iter_swap_if(first + 9, first + 33, compare, projection); + iter_swap_if(first + 10, first + 34, compare, projection); + iter_swap_if(first + 11, first + 35, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 15, first + 47, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 44, compare, projection); + iter_swap_if(first + 21, first + 45, compare, projection); + iter_swap_if(first + 22, first + 46, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 36, first + 48, compare, projection); + iter_swap_if(first + 37, first + 49, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 43, first + 51, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 13, first + 21, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 28, first + 40, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 24, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 41, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 44, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 438> + { + return {{ + {0, 13}, {1, 12}, {2, 15}, {3, 14}, {4, 8}, {5, 6}, {7, 11}, {9, 10}, {16, 37}, {17, 36}, {18, 39}, {19, 38}, {20, 32}, {21, 22}, {23, 35}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {33, 34}, {40, 53}, {41, 52}, {42, 55}, {43, 54}, {44, 48}, {45, 46}, {47, 51}, {49, 50}, + {0, 5}, {1, 7}, {2, 9}, {3, 4}, {6, 13}, {8, 14}, {10, 15}, {11, 12}, {16, 21}, {17, 23}, {18, 33}, {19, 20}, {22, 37}, {24, 28}, {25, 29}, {26, 30}, {27, 31}, {32, 38}, {34, 39}, {35, 36}, {40, 45}, {41, 47}, {42, 49}, {43, 44}, {46, 53}, {48, 54}, {50, 55}, {51, 52}, + {0, 1}, {2, 3}, {4, 5}, {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 32}, {23, 33}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 48}, {47, 49}, {50, 51}, {52, 53}, {54, 55}, + {0, 2}, {1, 3}, {4, 10}, {5, 11}, {6, 7}, {8, 9}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 34}, {21, 35}, {22, 23}, {26, 28}, {27, 29}, {32, 33}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {44, 50}, {45, 51}, {46, 47}, {48, 49}, {52, 54}, {53, 55}, + {0, 24}, {1, 2}, {3, 12}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {13, 14}, {15, 39}, {16, 40}, {17, 18}, {19, 36}, {20, 22}, {21, 23}, {25, 28}, {27, 30}, {31, 55}, {32, 34}, {33, 35}, {37, 38}, {41, 42}, {43, 52}, {44, 46}, {45, 47}, {48, 50}, {49, 51}, {53, 54}, + {0, 16}, {1, 4}, {2, 6}, {5, 8}, {7, 10}, {9, 13}, {11, 14}, {15, 31}, {17, 20}, {18, 22}, {21, 32}, {23, 34}, {24, 40}, {25, 26}, {27, 28}, {29, 30}, {33, 37}, {35, 38}, {39, 55}, {41, 44}, {42, 46}, {45, 48}, {47, 50}, {49, 53}, {51, 54}, + {1, 17}, {2, 4}, {3, 6}, {9, 12}, {11, 13}, {14, 30}, {16, 24}, {18, 20}, {19, 22}, {25, 41}, {31, 39}, {33, 36}, {35, 37}, {38, 54}, {42, 44}, {43, 46}, {49, 52}, {51, 53}, + {1, 25}, {2, 26}, {3, 5}, {6, 8}, {7, 9}, {10, 12}, {13, 37}, {14, 38}, {17, 41}, {18, 42}, {19, 21}, {22, 32}, {23, 33}, {29, 53}, {30, 54}, {34, 36}, {43, 45}, {46, 48}, {47, 49}, {50, 52}, + {2, 18}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 29}, {17, 25}, {19, 20}, {21, 22}, {23, 32}, {26, 42}, {30, 38}, {33, 34}, {35, 36}, {37, 53}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, + {2, 16}, {3, 27}, {4, 44}, {5, 45}, {6, 7}, {8, 9}, {10, 50}, {11, 51}, {12, 36}, {13, 25}, {18, 26}, {19, 43}, {22, 23}, {28, 52}, {29, 37}, {30, 42}, {32, 33}, {39, 53}, {46, 47}, {48, 49}, + {3, 19}, {4, 20}, {5, 21}, {6, 22}, {7, 15}, {8, 32}, {9, 41}, {12, 28}, {14, 46}, {23, 47}, {27, 43}, {33, 49}, {34, 50}, {35, 51}, {36, 52}, {40, 48}, + {5, 13}, {6, 14}, {7, 23}, {8, 40}, {9, 33}, {10, 34}, {11, 35}, {12, 24}, {15, 47}, {19, 27}, {20, 44}, {21, 45}, {22, 46}, {28, 36}, {31, 43}, {32, 48}, {41, 49}, {42, 50}, + {4, 12}, {6, 18}, {7, 19}, {8, 16}, {9, 17}, {10, 26}, {11, 27}, {15, 23}, {20, 24}, {21, 25}, {28, 44}, {29, 45}, {30, 34}, {31, 35}, {32, 40}, {36, 48}, {37, 49}, {38, 46}, {39, 47}, {43, 51}, + {1, 4}, {3, 9}, {10, 18}, {11, 19}, {12, 20}, {14, 30}, {17, 21}, {22, 26}, {24, 28}, {25, 41}, {27, 31}, {29, 33}, {34, 38}, {35, 43}, {36, 44}, {37, 45}, {46, 52}, {51, 54}, + {1, 2}, {4, 8}, {5, 9}, {13, 21}, {14, 22}, {15, 27}, {16, 20}, {23, 31}, {24, 32}, {25, 29}, {26, 30}, {28, 40}, {33, 41}, {34, 42}, {35, 39}, {46, 50}, {47, 51}, {53, 54}, + {3, 4}, {12, 16}, {13, 17}, {14, 24}, {15, 21}, {18, 20}, {19, 25}, {22, 26}, {23, 27}, {28, 32}, {29, 33}, {30, 36}, {31, 41}, {34, 40}, {35, 37}, {38, 42}, {39, 43}, {51, 52}, + {4, 8}, {6, 12}, {7, 13}, {10, 16}, {11, 17}, {14, 18}, {15, 19}, {20, 24}, {21, 25}, {22, 28}, {23, 29}, {26, 32}, {27, 33}, {30, 34}, {31, 35}, {36, 40}, {37, 41}, {38, 44}, {39, 45}, {42, 48}, {43, 49}, {47, 51}, + {5, 8}, {7, 10}, {9, 12}, {11, 14}, {13, 16}, {15, 20}, {17, 18}, {19, 22}, {21, 24}, {23, 26}, {25, 28}, {27, 30}, {29, 32}, {31, 34}, {33, 36}, {35, 40}, {37, 38}, {39, 42}, {41, 44}, {43, 46}, {45, 48}, {47, 50}, + {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 24}, {23, 25}, {26, 28}, {27, 29}, {30, 32}, {31, 33}, {34, 36}, {35, 37}, {38, 40}, {39, 41}, {42, 44}, {43, 45}, {46, 48}, {47, 49}, + {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT56_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort57.h b/include/cpp-sort/detail/sorting_network/sort57.h new file mode 100644 index 00000000..be274707 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort57.h @@ -0,0 +1,515 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT57_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT57_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<57> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 7, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 25, first + 38, compare, projection); + iter_swap_if(first + 26, first + 37, compare, projection); + iter_swap_if(first + 27, first + 40, compare, projection); + iter_swap_if(first + 28, first + 39, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 41, first + 54, compare, projection); + iter_swap_if(first + 42, first + 53, compare, projection); + iter_swap_if(first + 43, first + 56, compare, projection); + iter_swap_if(first + 44, first + 55, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 52, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 18, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 35, first + 40, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 41, first + 46, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 43, first + 50, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 47, first + 54, compare, projection); + iter_swap_if(first + 49, first + 55, compare, projection); + iter_swap_if(first + 51, first + 56, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 5, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 12, first + 17, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 37, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 56, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 53, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 46, first + 49, compare, projection); + iter_swap_if(first + 48, first + 51, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 52, first + 55, compare, projection); + iter_swap_if(first + 1, first + 26, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 23, compare, projection); + iter_swap_if(first + 12, first + 41, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 39, first + 55, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 2, first + 27, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 10, first + 22, compare, projection); + iter_swap_if(first + 12, first + 25, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 23, first + 56, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 13, first + 42, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 55, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first, first + 29, compare, projection); + iter_swap_if(first + 1, first + 13, compare, projection); + iter_swap_if(first + 3, first + 28, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 9, first + 21, compare, projection); + iter_swap_if(first + 14, first + 43, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 2, first + 14, compare, projection); + iter_swap_if(first + 4, first + 33, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 8, first + 37, compare, projection); + iter_swap_if(first + 10, first + 51, compare, projection); + iter_swap_if(first + 11, first + 52, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 15, first + 44, compare, projection); + iter_swap_if(first + 16, first + 45, compare, projection); + iter_swap_if(first + 19, first + 40, compare, projection); + iter_swap_if(first + 20, first + 49, compare, projection); + iter_swap_if(first + 21, first + 54, compare, projection); + iter_swap_if(first + 24, first + 53, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first, first + 16, compare, projection); + iter_swap_if(first + 3, first + 15, compare, projection); + iter_swap_if(first + 4, first + 41, compare, projection); + iter_swap_if(first + 5, first + 30, compare, projection); + iter_swap_if(first + 6, first + 31, compare, projection); + iter_swap_if(first + 7, first + 32, compare, projection); + iter_swap_if(first + 9, first + 50, compare, projection); + iter_swap_if(first + 10, first + 35, compare, projection); + iter_swap_if(first + 11, first + 36, compare, projection); + iter_swap_if(first + 14, first + 27, compare, projection); + iter_swap_if(first + 17, first + 38, compare, projection); + iter_swap_if(first + 18, first + 39, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 23, first + 40, compare, projection); + iter_swap_if(first + 24, first + 37, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first, first + 12, compare, projection); + iter_swap_if(first + 4, first + 20, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 8, first + 29, compare, projection); + iter_swap_if(first + 9, first + 34, compare, projection); + iter_swap_if(first + 10, first + 27, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 21, first + 38, compare, projection); + iter_swap_if(first + 22, first + 39, compare, projection); + iter_swap_if(first + 24, first + 45, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 37, first + 49, compare, projection); + iter_swap_if(first + 40, first + 52, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 26, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 11, first + 28, compare, projection); + iter_swap_if(first + 16, first + 29, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 18, first + 31, compare, projection); + iter_swap_if(first + 19, first + 32, compare, projection); + iter_swap_if(first + 21, first + 46, compare, projection); + iter_swap_if(first + 22, first + 47, compare, projection); + iter_swap_if(first + 23, first + 48, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 38, first + 50, compare, projection); + iter_swap_if(first + 39, first + 51, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 52, first + 55, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 21, first + 30, compare, projection); + iter_swap_if(first + 22, first + 31, compare, projection); + iter_swap_if(first + 23, first + 32, compare, projection); + iter_swap_if(first + 24, first + 29, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 8, first + 20, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 16, first + 25, compare, projection); + iter_swap_if(first + 17, first + 26, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 34, compare, projection); + iter_swap_if(first + 22, first + 35, compare, projection); + iter_swap_if(first + 23, first + 36, compare, projection); + iter_swap_if(first + 24, first + 33, compare, projection); + iter_swap_if(first + 29, first + 41, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 48, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 51, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 26, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 46, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 44, first + 50, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 454> + { + return {{ + {0, 8}, {1, 7}, {2, 6}, {3, 11}, {4, 10}, {5, 9}, {12, 24}, {13, 22}, {14, 21}, {15, 19}, {17, 23}, {18, 20}, {25, 38}, {26, 37}, {27, 40}, {28, 39}, {29, 33}, {30, 31}, {32, 36}, {34, 35}, {41, 54}, {42, 53}, {43, 56}, {44, 55}, {45, 49}, {46, 47}, {48, 52}, {50, 51}, + {0, 1}, {2, 5}, {3, 4}, {6, 9}, {7, 8}, {10, 11}, {13, 18}, {14, 15}, {16, 23}, {19, 21}, {20, 22}, {25, 30}, {26, 32}, {27, 34}, {28, 29}, {31, 38}, {33, 39}, {35, 40}, {36, 37}, {41, 46}, {42, 48}, {43, 50}, {44, 45}, {47, 54}, {49, 55}, {51, 56}, {52, 53}, + {0, 2}, {1, 6}, {5, 10}, {9, 11}, {12, 16}, {13, 14}, {15, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 33}, {32, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 49}, {48, 50}, {51, 52}, {53, 54}, {55, 56}, + {0, 3}, {1, 2}, {4, 6}, {5, 7}, {8, 11}, {9, 10}, {16, 18}, {17, 21}, {20, 23}, {22, 24}, {25, 27}, {26, 28}, {29, 35}, {30, 36}, {31, 32}, {33, 34}, {37, 39}, {38, 40}, {41, 43}, {42, 44}, {45, 51}, {46, 52}, {47, 48}, {49, 50}, {53, 55}, {54, 56}, + {1, 4}, {3, 5}, {6, 8}, {7, 10}, {12, 17}, {15, 20}, {16, 19}, {18, 23}, {21, 22}, {26, 27}, {28, 37}, {29, 31}, {30, 32}, {33, 35}, {34, 36}, {38, 39}, {40, 56}, {42, 43}, {44, 53}, {45, 47}, {46, 48}, {49, 51}, {50, 52}, {54, 55}, + {1, 3}, {2, 5}, {6, 9}, {8, 10}, {12, 13}, {14, 17}, {18, 21}, {19, 20}, {22, 23}, {26, 29}, {27, 31}, {30, 33}, {32, 35}, {34, 38}, {36, 39}, {42, 45}, {43, 47}, {46, 49}, {48, 51}, {50, 54}, {52, 55}, + {1, 26}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {11, 23}, {12, 41}, {13, 15}, {14, 16}, {17, 18}, {21, 22}, {27, 29}, {28, 31}, {34, 37}, {36, 38}, {39, 55}, {43, 45}, {44, 47}, {50, 53}, {52, 54}, + {2, 27}, {4, 6}, {5, 7}, {10, 22}, {12, 25}, {13, 14}, {15, 16}, {17, 19}, {18, 20}, {23, 56}, {28, 30}, {31, 33}, {32, 34}, {35, 37}, {38, 54}, {44, 46}, {47, 49}, {48, 50}, {51, 53}, + {3, 4}, {5, 6}, {7, 8}, {13, 42}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 55}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, {52, 53}, + {0, 29}, {1, 13}, {3, 28}, {7, 19}, {8, 24}, {9, 21}, {14, 43}, {15, 16}, {17, 18}, {26, 42}, {30, 46}, {31, 32}, {33, 34}, {35, 51}, {36, 52}, {37, 53}, {47, 48}, {49, 50}, + {2, 14}, {4, 33}, {5, 17}, {6, 18}, {8, 37}, {10, 51}, {11, 52}, {13, 26}, {15, 44}, {16, 45}, {19, 40}, {20, 49}, {21, 54}, {24, 53}, {27, 43}, {31, 47}, {32, 48}, {34, 50}, + {0, 16}, {3, 15}, {4, 41}, {5, 30}, {6, 31}, {7, 32}, {9, 50}, {10, 35}, {11, 36}, {14, 27}, {17, 38}, {18, 39}, {20, 25}, {23, 40}, {24, 37}, {28, 44}, {29, 45}, {33, 49}, + {0, 12}, {4, 20}, {5, 13}, {6, 14}, {8, 29}, {9, 34}, {10, 27}, {15, 28}, {21, 38}, {22, 39}, {24, 45}, {30, 46}, {31, 47}, {32, 48}, {33, 41}, {35, 43}, {36, 44}, {37, 49}, {40, 52}, + {4, 12}, {7, 15}, {9, 26}, {10, 14}, {11, 28}, {16, 29}, {17, 30}, {18, 31}, {19, 32}, {21, 46}, {22, 47}, {23, 48}, {25, 33}, {27, 35}, {34, 42}, {37, 45}, {38, 50}, {39, 51}, {40, 44}, {52, 55}, + {1, 4}, {8, 16}, {9, 13}, {11, 15}, {18, 27}, {20, 25}, {21, 30}, {22, 31}, {23, 32}, {24, 29}, {26, 34}, {28, 36}, {33, 41}, {38, 42}, {39, 43}, {44, 48}, {51, 53}, + {3, 9}, {8, 20}, {14, 18}, {16, 25}, {17, 26}, {19, 28}, {21, 34}, {22, 35}, {23, 36}, {24, 33}, {29, 41}, {30, 38}, {31, 39}, {32, 40}, {42, 46}, {43, 47}, {48, 54}, {53, 55}, + {8, 12}, {13, 17}, {15, 19}, {16, 20}, {21, 26}, {22, 27}, {23, 28}, {24, 25}, {29, 33}, {30, 34}, {31, 35}, {32, 36}, {37, 41}, {38, 42}, {39, 43}, {40, 44}, {47, 49}, {48, 51}, {53, 54}, {55, 56}, + {2, 8}, {6, 12}, {7, 13}, {10, 16}, {11, 17}, {14, 20}, {15, 21}, {18, 24}, {19, 26}, {22, 25}, {23, 30}, {27, 29}, {28, 34}, {31, 33}, {32, 38}, {35, 37}, {36, 42}, {39, 41}, {40, 46}, {43, 45}, {44, 50}, {52, 53}, + {2, 4}, {3, 8}, {5, 6}, {7, 10}, {9, 12}, {11, 14}, {13, 16}, {15, 20}, {17, 18}, {19, 21}, {22, 24}, {23, 27}, {25, 26}, {28, 31}, {29, 30}, {32, 34}, {33, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 47}, {45, 46}, {49, 50}, {53, 54}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 22}, {21, 24}, {23, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT57_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort58.h b/include/cpp-sort/detail/sorting_network/sort58.h new file mode 100644 index 00000000..91f2afeb --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort58.h @@ -0,0 +1,526 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT58_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT58_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<58> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 7, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 10, first + 23, compare, projection); + iter_swap_if(first + 11, first + 22, compare, projection); + iter_swap_if(first + 12, first + 25, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 26, first + 39, compare, projection); + iter_swap_if(first + 27, first + 38, compare, projection); + iter_swap_if(first + 28, first + 41, compare, projection); + iter_swap_if(first + 29, first + 40, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 42, first + 55, compare, projection); + iter_swap_if(first + 43, first + 54, compare, projection); + iter_swap_if(first + 44, first + 57, compare, projection); + iter_swap_if(first + 45, first + 56, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 53, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 23, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 20, first + 25, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 26, first + 31, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 36, first + 41, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 42, first + 47, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 44, first + 51, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 48, first + 55, compare, projection); + iter_swap_if(first + 50, first + 56, compare, projection); + iter_swap_if(first + 52, first + 57, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 10, first + 42, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 22, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 38, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 54, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 51, first + 55, compare, projection); + iter_swap_if(first + 53, first + 56, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 11, first + 43, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 2, first + 12, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 57, compare, projection); + iter_swap_if(first + 9, first + 23, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 39, first + 55, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 2, first + 28, compare, projection); + iter_swap_if(first + 6, first + 56, compare, projection); + iter_swap_if(first + 7, first + 25, compare, projection); + iter_swap_if(first + 9, first + 39, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 55, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 41, first + 57, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first, first + 30, compare, projection); + iter_swap_if(first + 1, first + 31, compare, projection); + iter_swap_if(first + 3, first + 13, compare, projection); + iter_swap_if(first + 6, first + 24, compare, projection); + iter_swap_if(first + 8, first + 22, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 14, first + 46, compare, projection); + iter_swap_if(first + 15, first + 47, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 40, first + 56, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first, first + 14, compare, projection); + iter_swap_if(first + 1, first + 15, compare, projection); + iter_swap_if(first + 3, first + 29, compare, projection); + iter_swap_if(first + 4, first + 34, compare, projection); + iter_swap_if(first + 5, first + 35, compare, projection); + iter_swap_if(first + 6, first + 16, compare, projection); + iter_swap_if(first + 7, first + 17, compare, projection); + iter_swap_if(first + 8, first + 38, compare, projection); + iter_swap_if(first + 12, first + 44, compare, projection); + iter_swap_if(first + 13, first + 21, compare, projection); + iter_swap_if(first + 18, first + 50, compare, projection); + iter_swap_if(first + 19, first + 51, compare, projection); + iter_swap_if(first + 20, first + 52, compare, projection); + iter_swap_if(first + 22, first + 54, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first, first + 10, compare, projection); + iter_swap_if(first + 1, first + 11, compare, projection); + iter_swap_if(first + 4, first + 42, compare, projection); + iter_swap_if(first + 5, first + 43, compare, projection); + iter_swap_if(first + 6, first + 32, compare, projection); + iter_swap_if(first + 7, first + 33, compare, projection); + iter_swap_if(first + 8, first + 30, compare, projection); + iter_swap_if(first + 9, first + 31, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 45, compare, projection); + iter_swap_if(first + 16, first + 48, compare, projection); + iter_swap_if(first + 17, first + 49, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 53, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 40, first + 52, compare, projection); + iter_swap_if(first + 4, first + 18, compare, projection); + iter_swap_if(first + 5, first + 19, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 46, compare, projection); + iter_swap_if(first + 24, first + 48, compare, projection); + iter_swap_if(first + 25, first + 49, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 38, first + 50, compare, projection); + iter_swap_if(first + 39, first + 51, compare, projection); + iter_swap_if(first + 41, first + 53, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 8, first + 14, compare, projection); + iter_swap_if(first + 9, first + 15, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first + 53, first + 56, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 13, first + 21, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 24, first + 36, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 32, first + 44, compare, projection); + iter_swap_if(first + 33, first + 45, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 8, first + 18, compare, projection); + iter_swap_if(first + 9, first + 19, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 29, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 41, first + 44, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 465> + { + return {{ + {0, 8}, {1, 9}, {2, 7}, {3, 5}, {4, 6}, {10, 23}, {11, 22}, {12, 25}, {13, 24}, {14, 18}, {15, 16}, {17, 21}, {19, 20}, {26, 39}, {27, 38}, {28, 41}, {29, 40}, {30, 34}, {31, 32}, {33, 37}, {35, 36}, {42, 55}, {43, 54}, {44, 57}, {45, 56}, {46, 50}, {47, 48}, {49, 53}, {51, 52}, + {0, 2}, {1, 4}, {5, 8}, {7, 9}, {10, 15}, {11, 17}, {12, 19}, {13, 14}, {16, 23}, {18, 24}, {20, 25}, {21, 22}, {26, 31}, {27, 33}, {28, 35}, {29, 30}, {32, 39}, {34, 40}, {36, 41}, {37, 38}, {42, 47}, {43, 49}, {44, 51}, {45, 46}, {48, 55}, {50, 56}, {52, 57}, {53, 54}, + {0, 3}, {2, 4}, {5, 7}, {6, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 18}, {17, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 34}, {33, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 47}, {48, 50}, {49, 51}, {52, 53}, {54, 55}, {56, 57}, + {0, 1}, {3, 6}, {8, 9}, {10, 12}, {11, 13}, {14, 20}, {15, 21}, {16, 17}, {18, 19}, {22, 24}, {23, 25}, {26, 28}, {27, 29}, {30, 36}, {31, 37}, {32, 33}, {34, 35}, {38, 40}, {39, 41}, {42, 44}, {43, 45}, {46, 52}, {47, 53}, {48, 49}, {50, 51}, {54, 56}, {55, 57}, + {1, 5}, {2, 3}, {4, 8}, {6, 7}, {10, 42}, {11, 12}, {13, 22}, {14, 16}, {15, 17}, {18, 20}, {19, 21}, {23, 24}, {25, 41}, {27, 28}, {29, 38}, {30, 32}, {31, 33}, {34, 36}, {35, 37}, {39, 40}, {43, 44}, {45, 54}, {46, 48}, {47, 49}, {50, 52}, {51, 53}, {55, 56}, + {1, 2}, {3, 5}, {4, 6}, {7, 8}, {10, 26}, {11, 14}, {12, 16}, {15, 18}, {17, 20}, {19, 23}, {21, 24}, {27, 30}, {28, 32}, {31, 34}, {33, 36}, {35, 39}, {37, 40}, {43, 46}, {44, 48}, {47, 50}, {49, 52}, {51, 55}, {53, 56}, + {2, 3}, {4, 5}, {6, 7}, {11, 43}, {12, 14}, {13, 16}, {19, 22}, {21, 23}, {24, 40}, {28, 30}, {29, 32}, {35, 38}, {37, 39}, {44, 46}, {45, 48}, {51, 54}, {53, 55}, + {2, 12}, {3, 4}, {5, 6}, {7, 57}, {9, 23}, {11, 27}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {28, 44}, {29, 31}, {32, 34}, {33, 35}, {36, 38}, {39, 55}, {45, 47}, {48, 50}, {49, 51}, {52, 54}, + {2, 28}, {6, 56}, {7, 25}, {9, 39}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 55}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {41, 57}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, {53, 54}, + {0, 30}, {1, 31}, {3, 13}, {6, 24}, {8, 22}, {12, 20}, {14, 46}, {15, 47}, {16, 17}, {18, 19}, {23, 39}, {25, 41}, {29, 45}, {32, 33}, {34, 35}, {36, 52}, {37, 53}, {38, 54}, {40, 56}, {48, 49}, {50, 51}, {55, 57}, + {0, 14}, {1, 15}, {3, 29}, {4, 34}, {5, 35}, {6, 16}, {7, 17}, {8, 38}, {12, 44}, {13, 21}, {18, 50}, {19, 51}, {20, 52}, {22, 54}, {24, 40}, {30, 46}, {31, 47}, {32, 48}, {33, 49}, + {0, 10}, {1, 11}, {4, 42}, {5, 43}, {6, 32}, {7, 33}, {8, 30}, {9, 31}, {12, 28}, {13, 45}, {16, 48}, {17, 49}, {18, 26}, {19, 27}, {20, 36}, {21, 53}, {22, 38}, {23, 47}, {34, 50}, {35, 51}, {40, 52}, + {4, 18}, {5, 19}, {6, 12}, {13, 29}, {14, 30}, {15, 31}, {16, 32}, {17, 33}, {20, 28}, {21, 37}, {22, 46}, {24, 48}, {25, 49}, {34, 42}, {35, 43}, {36, 44}, {38, 50}, {39, 51}, {41, 53}, {52, 54}, + {4, 10}, {5, 11}, {7, 13}, {8, 14}, {9, 15}, {12, 20}, {21, 29}, {22, 30}, {23, 31}, {24, 32}, {25, 33}, {26, 34}, {27, 35}, {28, 36}, {37, 45}, {38, 46}, {39, 47}, {40, 48}, {41, 49}, {53, 56}, + {1, 4}, {13, 21}, {16, 28}, {18, 26}, {19, 27}, {24, 36}, {29, 37}, {32, 44}, {33, 45}, {34, 42}, {35, 43}, {48, 50}, {49, 51}, + {8, 18}, {9, 19}, {14, 26}, {15, 27}, {16, 20}, {17, 29}, {22, 34}, {23, 35}, {24, 28}, {25, 37}, {30, 42}, {31, 43}, {32, 36}, {40, 44}, {41, 45}, {49, 52}, {51, 54}, + {8, 10}, {9, 11}, {14, 18}, {15, 19}, {17, 21}, {22, 26}, {23, 27}, {25, 29}, {30, 34}, {31, 35}, {33, 37}, {38, 42}, {39, 43}, {44, 46}, {45, 47}, {54, 55}, + {2, 8}, {3, 9}, {6, 10}, {7, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {45, 46}, {47, 50}, {53, 54}, {55, 56}, + {2, 4}, {3, 8}, {5, 6}, {7, 12}, {9, 10}, {11, 14}, {13, 16}, {15, 20}, {17, 18}, {19, 24}, {21, 22}, {23, 28}, {25, 26}, {27, 29}, {30, 32}, {31, 34}, {33, 36}, {35, 38}, {37, 40}, {39, 42}, {41, 44}, {43, 48}, {49, 50}, {51, 53}, {54, 55}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 21}, {22, 24}, {23, 25}, {26, 28}, {27, 30}, {29, 32}, {31, 33}, {34, 36}, {35, 37}, {38, 40}, {39, 41}, {42, 44}, {43, 45}, {46, 48}, {47, 49}, {50, 52}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {51, 52}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT58_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort59.h b/include/cpp-sort/detail/sorting_network/sort59.h new file mode 100644 index 00000000..d71961b9 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort59.h @@ -0,0 +1,537 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT59_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT59_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<59> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 9, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 11, first + 24, compare, projection); + iter_swap_if(first + 12, first + 23, compare, projection); + iter_swap_if(first + 13, first + 26, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 27, first + 40, compare, projection); + iter_swap_if(first + 28, first + 39, compare, projection); + iter_swap_if(first + 29, first + 42, compare, projection); + iter_swap_if(first + 30, first + 41, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 43, first + 56, compare, projection); + iter_swap_if(first + 44, first + 55, compare, projection); + iter_swap_if(first + 45, first + 58, compare, projection); + iter_swap_if(first + 46, first + 57, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 12, first + 18, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 27, first + 32, compare, projection); + iter_swap_if(first + 28, first + 34, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 44, first + 50, compare, projection); + iter_swap_if(first + 45, first + 52, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 49, first + 56, compare, projection); + iter_swap_if(first + 51, first + 57, compare, projection); + iter_swap_if(first + 53, first + 58, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 2, first + 5, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 48, first + 54, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 43, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 23, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 39, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 55, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 38, first + 41, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 48, first + 51, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 52, first + 56, compare, projection); + iter_swap_if(first + 54, first + 57, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 12, first + 44, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 57, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 46, first + 49, compare, projection); + iter_swap_if(first + 52, first + 55, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 10, first + 41, compare, projection); + iter_swap_if(first + 12, first + 28, compare, projection); + iter_swap_if(first + 13, first + 45, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 57, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 56, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 7, first + 58, compare, projection); + iter_swap_if(first + 9, first + 40, compare, projection); + iter_swap_if(first + 13, first + 29, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 56, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first, first + 31, compare, projection); + iter_swap_if(first + 1, first + 32, compare, projection); + iter_swap_if(first + 3, first + 14, compare, projection); + iter_swap_if(first + 6, first + 37, compare, projection); + iter_swap_if(first + 7, first + 26, compare, projection); + iter_swap_if(first + 8, first + 23, compare, projection); + iter_swap_if(first + 15, first + 47, compare, projection); + iter_swap_if(first + 16, first + 48, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 53, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 39, first + 55, compare, projection); + iter_swap_if(first + 42, first + 58, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 33, compare, projection); + iter_swap_if(first + 3, first + 30, compare, projection); + iter_swap_if(first + 4, first + 35, compare, projection); + iter_swap_if(first + 5, first + 36, compare, projection); + iter_swap_if(first + 6, first + 45, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 8, first + 39, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 17, first + 49, compare, projection); + iter_swap_if(first + 19, first + 51, compare, projection); + iter_swap_if(first + 20, first + 52, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 23, first + 55, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 34, first + 50, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first, first + 11, compare, projection); + iter_swap_if(first + 1, first + 12, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 4, first + 43, compare, projection); + iter_swap_if(first + 5, first + 44, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 7, first + 34, compare, projection); + iter_swap_if(first + 8, first + 31, compare, projection); + iter_swap_if(first + 9, first + 32, compare, projection); + iter_swap_if(first + 14, first + 46, compare, projection); + iter_swap_if(first + 18, first + 50, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 22, first + 54, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 24, first + 48, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 41, first + 53, compare, projection); + iter_swap_if(first + 2, first + 13, compare, projection); + iter_swap_if(first + 4, first + 19, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 10, first + 33, compare, projection); + iter_swap_if(first + 14, first + 30, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 25, first + 49, compare, projection); + iter_swap_if(first + 26, first + 50, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 39, first + 51, compare, projection); + iter_swap_if(first + 40, first + 52, compare, projection); + iter_swap_if(first + 42, first + 54, compare, projection); + iter_swap_if(first + 4, first + 11, compare, projection); + iter_swap_if(first + 5, first + 12, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 7, first + 14, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 34, first + 46, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 49, first + 55, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 8, first + 19, compare, projection); + iter_swap_if(first + 9, first + 20, compare, projection); + iter_swap_if(first + 10, first + 21, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 16, first + 28, compare, projection); + iter_swap_if(first + 17, first + 29, compare, projection); + iter_swap_if(first + 18, first + 30, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 24, first + 36, compare, projection); + iter_swap_if(first + 25, first + 37, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 32, first + 44, compare, projection); + iter_swap_if(first + 33, first + 45, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 8, first + 11, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 10, first + 13, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 6, first + 11, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 13, first + 19, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 476> + { + return {{ + {0, 9}, {1, 6}, {2, 4}, {3, 7}, {5, 8}, {11, 24}, {12, 23}, {13, 26}, {14, 25}, {15, 19}, {16, 17}, {18, 22}, {20, 21}, {27, 40}, {28, 39}, {29, 42}, {30, 41}, {31, 35}, {32, 33}, {34, 38}, {36, 37}, {43, 56}, {44, 55}, {45, 58}, {46, 57}, {47, 51}, {48, 49}, {50, 54}, {52, 53}, + {0, 1}, {3, 5}, {4, 10}, {6, 9}, {7, 8}, {11, 16}, {12, 18}, {13, 20}, {14, 15}, {17, 24}, {19, 25}, {21, 26}, {22, 23}, {27, 32}, {28, 34}, {29, 36}, {30, 31}, {33, 40}, {35, 41}, {37, 42}, {38, 39}, {43, 48}, {44, 50}, {45, 52}, {46, 47}, {49, 56}, {51, 57}, {53, 58}, {54, 55}, + {1, 3}, {2, 5}, {4, 7}, {8, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 19}, {18, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 35}, {34, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 51}, {50, 52}, {53, 54}, {55, 56}, {57, 58}, + {0, 4}, {1, 2}, {3, 7}, {5, 9}, {6, 8}, {11, 13}, {12, 14}, {15, 21}, {16, 22}, {17, 18}, {19, 20}, {23, 25}, {24, 26}, {27, 29}, {28, 30}, {31, 37}, {32, 38}, {33, 34}, {35, 36}, {39, 41}, {40, 42}, {43, 45}, {44, 46}, {47, 53}, {48, 54}, {49, 50}, {51, 52}, {55, 57}, {56, 58}, + {0, 1}, {2, 6}, {4, 5}, {7, 8}, {9, 10}, {11, 43}, {12, 13}, {14, 23}, {15, 17}, {16, 18}, {19, 21}, {20, 22}, {24, 25}, {26, 42}, {28, 29}, {30, 39}, {31, 33}, {32, 34}, {35, 37}, {36, 38}, {40, 41}, {44, 45}, {46, 55}, {47, 49}, {48, 50}, {51, 53}, {52, 54}, {56, 57}, + {2, 4}, {3, 6}, {5, 7}, {8, 9}, {11, 27}, {12, 15}, {13, 17}, {16, 19}, {18, 21}, {20, 24}, {22, 25}, {28, 31}, {29, 33}, {32, 35}, {34, 37}, {36, 40}, {38, 41}, {44, 47}, {45, 49}, {48, 51}, {50, 53}, {52, 56}, {54, 57}, + {1, 2}, {3, 4}, {5, 6}, {7, 8}, {10, 25}, {12, 44}, {13, 15}, {14, 17}, {20, 23}, {22, 24}, {29, 31}, {30, 33}, {36, 39}, {38, 40}, {41, 57}, {45, 47}, {46, 49}, {52, 55}, {54, 56}, + {2, 3}, {4, 5}, {6, 7}, {9, 24}, {10, 41}, {12, 28}, {13, 45}, {14, 16}, {17, 19}, {18, 20}, {21, 23}, {25, 57}, {30, 32}, {33, 35}, {34, 36}, {37, 39}, {40, 56}, {46, 48}, {49, 51}, {50, 52}, {53, 55}, + {7, 58}, {9, 40}, {13, 29}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 56}, {25, 41}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {46, 47}, {48, 49}, {50, 51}, {52, 53}, {54, 55}, + {0, 31}, {1, 32}, {3, 14}, {6, 37}, {7, 26}, {8, 23}, {15, 47}, {16, 48}, {17, 18}, {19, 20}, {21, 53}, {24, 40}, {30, 46}, {33, 34}, {35, 36}, {38, 54}, {39, 55}, {42, 58}, {49, 50}, {51, 52}, + {0, 15}, {1, 16}, {2, 33}, {3, 30}, {4, 35}, {5, 36}, {6, 45}, {7, 18}, {8, 39}, {14, 22}, {17, 49}, {19, 51}, {20, 52}, {21, 29}, {23, 55}, {26, 42}, {31, 47}, {32, 48}, {34, 50}, {37, 53}, {57, 58}, + {0, 11}, {1, 12}, {2, 17}, {4, 43}, {5, 44}, {6, 21}, {7, 34}, {8, 31}, {9, 32}, {14, 46}, {18, 50}, {19, 27}, {20, 28}, {22, 54}, {23, 39}, {24, 48}, {33, 49}, {35, 51}, {36, 52}, {37, 45}, {41, 53}, + {2, 13}, {4, 19}, {5, 20}, {10, 33}, {14, 30}, {15, 31}, {16, 32}, {18, 34}, {22, 38}, {23, 47}, {25, 49}, {26, 50}, {29, 37}, {35, 43}, {36, 44}, {39, 51}, {40, 52}, {42, 54}, + {4, 11}, {5, 12}, {6, 13}, {7, 14}, {8, 15}, {9, 16}, {17, 33}, {21, 29}, {22, 30}, {23, 31}, {24, 32}, {26, 34}, {27, 35}, {28, 36}, {37, 45}, {38, 46}, {39, 47}, {40, 48}, {41, 49}, {42, 50}, {54, 56}, + {1, 4}, {10, 17}, {14, 22}, {19, 27}, {20, 28}, {25, 33}, {30, 38}, {34, 46}, {35, 43}, {36, 44}, {49, 55}, {50, 53}, {56, 57}, + {8, 19}, {9, 20}, {10, 21}, {15, 27}, {16, 28}, {17, 29}, {18, 30}, {23, 35}, {24, 36}, {25, 37}, {26, 38}, {31, 43}, {32, 44}, {33, 45}, {42, 46}, {50, 52}, {54, 55}, + {8, 11}, {9, 12}, {10, 13}, {15, 19}, {16, 20}, {17, 21}, {18, 22}, {23, 27}, {24, 28}, {25, 29}, {26, 30}, {31, 35}, {32, 36}, {33, 37}, {34, 38}, {39, 43}, {40, 44}, {41, 45}, {46, 48}, {52, 54}, {53, 55}, + {2, 8}, {3, 9}, {6, 11}, {7, 12}, {10, 15}, {13, 19}, {14, 16}, {17, 23}, {18, 20}, {21, 27}, {22, 24}, {25, 31}, {26, 28}, {29, 35}, {30, 32}, {33, 39}, {34, 36}, {37, 43}, {38, 40}, {41, 47}, {42, 44}, {45, 51}, {48, 50}, {53, 54}, {55, 56}, + {2, 4}, {3, 5}, {6, 8}, {7, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 19}, {17, 18}, {20, 22}, {21, 23}, {24, 27}, {25, 26}, {28, 31}, {29, 30}, {32, 35}, {33, 34}, {36, 39}, {37, 38}, {40, 42}, {41, 43}, {44, 45}, {46, 47}, {49, 51}, + {3, 6}, {5, 8}, {7, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 46}, {45, 47}, {48, 49}, {50, 51}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT59_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort6.h b/include/cpp-sort/detail/sorting_network/sort6.h index 78de3fe5..588a7efc 100644 --- a/include/cpp-sort/detail/sorting_network/sort6.h +++ b/include/cpp-sort/detail/sorting_network/sort6.h @@ -40,7 +40,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 12> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort60.h b/include/cpp-sort/detail/sorting_network/sort60.h new file mode 100644 index 00000000..e0c145f9 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort60.h @@ -0,0 +1,544 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT60_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT60_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<60> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 4, first + 14, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 25, compare, projection); + iter_swap_if(first + 19, first + 29, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 28, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 34, first + 44, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 36, first + 43, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 55, compare, projection); + iter_swap_if(first + 49, first + 59, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 51, first + 58, compare, projection); + iter_swap_if(first + 52, first + 57, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first, first + 14, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 30, first + 44, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 45, first + 59, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 48, first + 52, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 37, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 52, compare, projection); + iter_swap_if(first + 46, first + 51, compare, projection); + iter_swap_if(first + 47, first + 54, compare, projection); + iter_swap_if(first + 49, first + 55, compare, projection); + iter_swap_if(first + 50, first + 56, compare, projection); + iter_swap_if(first + 53, first + 58, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first, first + 6, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 52, first + 56, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 54, first + 57, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 59, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 59, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first, first + 30, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 58, compare, projection); + iter_swap_if(first + 15, first + 45, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 43, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 31, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 12, first + 57, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 16, first + 46, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 30, first + 45, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 43, first + 58, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 27, compare, projection); + iter_swap_if(first + 15, first + 30, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 43, compare, projection); + iter_swap_if(first + 31, first + 46, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 57, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 2, first + 32, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 4, first + 49, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 39, compare, projection); + iter_swap_if(first + 10, first + 40, compare, projection); + iter_swap_if(first + 11, first + 26, compare, projection); + iter_swap_if(first + 16, first + 31, compare, projection); + iter_swap_if(first + 17, first + 47, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 54, compare, projection); + iter_swap_if(first + 25, first + 55, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 33, first + 48, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 41, first + 56, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 3, first + 33, compare, projection); + iter_swap_if(first + 4, first + 19, compare, projection); + iter_swap_if(first + 5, first + 50, compare, projection); + iter_swap_if(first + 6, first + 51, compare, projection); + iter_swap_if(first + 7, first + 37, compare, projection); + iter_swap_if(first + 8, first + 38, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 41, compare, projection); + iter_swap_if(first + 18, first + 48, compare, projection); + iter_swap_if(first + 20, first + 35, compare, projection); + iter_swap_if(first + 21, first + 36, compare, projection); + iter_swap_if(first + 22, first + 52, compare, projection); + iter_swap_if(first + 23, first + 53, compare, projection); + iter_swap_if(first + 26, first + 56, compare, projection); + iter_swap_if(first + 32, first + 47, compare, projection); + iter_swap_if(first + 34, first + 49, compare, projection); + iter_swap_if(first + 39, first + 54, compare, projection); + iter_swap_if(first + 40, first + 55, compare, projection); + iter_swap_if(first + 4, first + 15, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 7, first + 22, compare, projection); + iter_swap_if(first + 8, first + 23, compare, projection); + iter_swap_if(first + 9, first + 31, compare, projection); + iter_swap_if(first + 11, first + 48, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 17, first + 32, compare, projection); + iter_swap_if(first + 18, first + 33, compare, projection); + iter_swap_if(first + 24, first + 39, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 26, first + 41, compare, projection); + iter_swap_if(first + 27, first + 49, compare, projection); + iter_swap_if(first + 35, first + 50, compare, projection); + iter_swap_if(first + 36, first + 51, compare, projection); + iter_swap_if(first + 37, first + 52, compare, projection); + iter_swap_if(first + 38, first + 53, compare, projection); + iter_swap_if(first + 43, first + 54, compare, projection); + iter_swap_if(first + 44, first + 55, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 16, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 8, first + 30, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 11, first + 33, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 22, first + 37, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 24, first + 46, compare, projection); + iter_swap_if(first + 25, first + 47, compare, projection); + iter_swap_if(first + 26, first + 48, compare, projection); + iter_swap_if(first + 28, first + 50, compare, projection); + iter_swap_if(first + 29, first + 51, compare, projection); + iter_swap_if(first + 41, first + 52, compare, projection); + iter_swap_if(first + 42, first + 53, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 55, first + 58, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 20, first + 35, compare, projection); + iter_swap_if(first + 21, first + 36, compare, projection); + iter_swap_if(first + 22, first + 33, compare, projection); + iter_swap_if(first + 23, first + 45, compare, projection); + iter_swap_if(first + 26, first + 37, compare, projection); + iter_swap_if(first + 28, first + 46, compare, projection); + iter_swap_if(first + 29, first + 47, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 41, first + 48, compare, projection); + iter_swap_if(first + 42, first + 49, compare, projection); + iter_swap_if(first + 43, first + 50, compare, projection); + iter_swap_if(first + 44, first + 51, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 12, first + 23, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 20, first + 31, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 26, first + 33, compare, projection); + iter_swap_if(first + 27, first + 45, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 51, first + 57, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 38, first + 45, compare, projection); + iter_swap_if(first + 39, first + 46, compare, projection); + iter_swap_if(first + 40, first + 47, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 45, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 44, first + 49, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 53, first + 56, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 483> + { + return {{ + {1, 2}, {3, 10}, {4, 14}, {5, 8}, {6, 13}, {7, 12}, {9, 11}, {16, 17}, {18, 25}, {19, 29}, {20, 23}, {21, 28}, {22, 27}, {24, 26}, {31, 32}, {33, 40}, {34, 44}, {35, 38}, {36, 43}, {37, 42}, {39, 41}, {46, 47}, {48, 55}, {49, 59}, {50, 53}, {51, 58}, {52, 57}, {54, 56}, + {0, 14}, {1, 5}, {2, 8}, {3, 7}, {6, 9}, {10, 12}, {11, 13}, {15, 29}, {16, 20}, {17, 23}, {18, 22}, {21, 24}, {25, 27}, {26, 28}, {30, 44}, {31, 35}, {32, 38}, {33, 37}, {36, 39}, {40, 42}, {41, 43}, {45, 59}, {46, 50}, {47, 53}, {48, 52}, {51, 54}, {55, 57}, {56, 58}, + {0, 7}, {1, 6}, {2, 9}, {4, 10}, {5, 11}, {8, 13}, {12, 14}, {15, 22}, {16, 21}, {17, 24}, {19, 25}, {20, 26}, {23, 28}, {27, 29}, {30, 37}, {31, 36}, {32, 39}, {34, 40}, {35, 41}, {38, 43}, {42, 44}, {45, 52}, {46, 51}, {47, 54}, {49, 55}, {50, 56}, {53, 58}, {57, 59}, + {0, 6}, {2, 4}, {3, 5}, {7, 11}, {8, 10}, {9, 12}, {13, 14}, {15, 21}, {17, 19}, {18, 20}, {22, 26}, {23, 25}, {24, 27}, {28, 29}, {30, 36}, {32, 34}, {33, 35}, {37, 41}, {38, 40}, {39, 42}, {43, 44}, {45, 51}, {47, 49}, {48, 50}, {52, 56}, {53, 55}, {54, 57}, {58, 59}, + {0, 3}, {1, 2}, {4, 7}, {5, 9}, {6, 8}, {10, 11}, {12, 13}, {14, 59}, {15, 18}, {16, 17}, {19, 22}, {20, 24}, {21, 23}, {25, 26}, {27, 28}, {29, 44}, {30, 33}, {31, 32}, {34, 37}, {35, 39}, {36, 38}, {40, 41}, {42, 43}, {45, 48}, {46, 47}, {49, 52}, {50, 54}, {51, 53}, {55, 56}, {57, 58}, + {0, 1}, {2, 3}, {4, 6}, {7, 9}, {10, 12}, {11, 13}, {14, 29}, {15, 16}, {17, 18}, {19, 21}, {22, 24}, {25, 27}, {26, 28}, {30, 31}, {32, 33}, {34, 36}, {37, 39}, {40, 42}, {41, 43}, {44, 59}, {45, 46}, {47, 48}, {49, 51}, {52, 54}, {55, 57}, {56, 58}, + {0, 30}, {1, 2}, {3, 5}, {8, 10}, {11, 12}, {13, 58}, {15, 45}, {16, 17}, {18, 20}, {23, 25}, {26, 27}, {28, 43}, {29, 44}, {31, 32}, {33, 35}, {38, 40}, {41, 42}, {46, 47}, {48, 50}, {53, 55}, {56, 57}, + {0, 15}, {1, 31}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {12, 57}, {13, 28}, {16, 46}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {27, 42}, {30, 45}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {43, 58}, {48, 49}, {50, 51}, {52, 53}, {54, 55}, + {1, 16}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 27}, {15, 30}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {28, 43}, {31, 46}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 57}, {47, 48}, {49, 50}, {51, 52}, {53, 54}, {55, 56}, + {2, 32}, {3, 18}, {4, 49}, {5, 6}, {7, 8}, {9, 39}, {10, 40}, {11, 26}, {16, 31}, {17, 47}, {19, 34}, {20, 21}, {22, 23}, {24, 54}, {25, 55}, {27, 42}, {33, 48}, {35, 36}, {37, 38}, {41, 56}, {50, 51}, {52, 53}, + {2, 17}, {3, 33}, {4, 19}, {5, 50}, {6, 51}, {7, 37}, {8, 38}, {9, 24}, {10, 25}, {11, 41}, {18, 48}, {20, 35}, {21, 36}, {22, 52}, {23, 53}, {26, 56}, {32, 47}, {34, 49}, {39, 54}, {40, 55}, + {4, 15}, {5, 20}, {6, 21}, {7, 22}, {8, 23}, {9, 31}, {11, 48}, {12, 19}, {17, 32}, {18, 33}, {24, 39}, {25, 40}, {26, 41}, {27, 49}, {35, 50}, {36, 51}, {37, 52}, {38, 53}, {43, 54}, {44, 55}, + {1, 4}, {5, 16}, {6, 17}, {7, 18}, {8, 30}, {10, 32}, {11, 33}, {13, 20}, {14, 21}, {19, 34}, {22, 37}, {23, 38}, {24, 46}, {25, 47}, {26, 48}, {28, 50}, {29, 51}, {41, 52}, {42, 53}, {54, 56}, {55, 58}, + {3, 5}, {8, 15}, {9, 16}, {10, 17}, {11, 18}, {13, 24}, {14, 25}, {19, 30}, {20, 35}, {21, 36}, {22, 33}, {23, 45}, {26, 37}, {28, 46}, {29, 47}, {34, 38}, {41, 48}, {42, 49}, {43, 50}, {44, 51}, + {2, 8}, {5, 9}, {12, 23}, {18, 22}, {20, 31}, {21, 32}, {26, 33}, {27, 45}, {35, 39}, {36, 40}, {37, 41}, {50, 54}, {51, 57}, + {2, 4}, {12, 19}, {13, 20}, {14, 21}, {23, 30}, {24, 31}, {25, 32}, {27, 34}, {28, 35}, {29, 36}, {38, 45}, {39, 46}, {40, 47}, {55, 57}, + {12, 15}, {13, 16}, {14, 17}, {19, 23}, {20, 24}, {21, 25}, {27, 30}, {28, 31}, {29, 32}, {34, 38}, {35, 39}, {36, 40}, {42, 45}, {43, 46}, {44, 47}, + {6, 12}, {7, 13}, {10, 15}, {11, 16}, {14, 19}, {17, 23}, {18, 20}, {21, 27}, {22, 24}, {25, 30}, {26, 28}, {29, 34}, {31, 33}, {32, 38}, {35, 37}, {36, 42}, {39, 41}, {40, 45}, {43, 48}, {44, 49}, {46, 52}, {47, 53}, + {6, 8}, {7, 9}, {10, 12}, {11, 15}, {13, 14}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 27}, {25, 26}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 37}, {38, 39}, {40, 42}, {41, 43}, {44, 48}, {45, 46}, {47, 49}, {50, 52}, {51, 53}, + {3, 6}, {5, 8}, {7, 10}, {9, 12}, {11, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 38}, {37, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 48}, {47, 50}, {49, 52}, {51, 54}, {53, 56}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, {53, 54}, {55, 56}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT60_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort61.h b/include/cpp-sort/detail/sorting_network/sort61.h new file mode 100644 index 00000000..e084de23 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort61.h @@ -0,0 +1,559 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT61_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT61_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<61> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 4, first + 14, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 25, compare, projection); + iter_swap_if(first + 19, first + 29, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 28, compare, projection); + iter_swap_if(first + 22, first + 27, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 34, first + 44, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 36, first + 43, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 45, first + 58, compare, projection); + iter_swap_if(first + 46, first + 57, compare, projection); + iter_swap_if(first + 47, first + 60, compare, projection); + iter_swap_if(first + 48, first + 59, compare, projection); + iter_swap_if(first + 49, first + 53, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 56, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first, first + 14, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 30, first + 44, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 45, first + 50, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 54, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 51, first + 58, compare, projection); + iter_swap_if(first + 53, first + 59, compare, projection); + iter_swap_if(first + 55, first + 60, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 22, compare, projection); + iter_swap_if(first + 16, first + 21, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 23, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 30, first + 37, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 32, first + 39, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 59, first + 60, compare, projection); + iter_swap_if(first, first + 6, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 49, first + 55, compare, projection); + iter_swap_if(first + 50, first + 56, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first + 58, first + 60, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 19, first + 22, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 30, first + 33, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 57, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 46, first + 49, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 52, first + 55, compare, projection); + iter_swap_if(first + 54, first + 58, compare, projection); + iter_swap_if(first + 56, first + 59, compare, projection); + iter_swap_if(first, first + 30, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 14, first + 59, compare, projection); + iter_swap_if(first + 15, first + 45, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 43, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 51, compare, projection); + iter_swap_if(first + 54, first + 57, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 31, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 13, first + 58, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 16, first + 46, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 30, first + 45, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 44, first + 59, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 15, first + 30, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 31, first + 46, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 43, first + 58, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 2, first + 32, compare, projection); + iter_swap_if(first + 3, first + 33, compare, projection); + iter_swap_if(first + 4, first + 49, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 39, compare, projection); + iter_swap_if(first + 10, first + 40, compare, projection); + iter_swap_if(first + 11, first + 41, compare, projection); + iter_swap_if(first + 12, first + 57, compare, projection); + iter_swap_if(first + 16, first + 31, compare, projection); + iter_swap_if(first + 17, first + 47, compare, projection); + iter_swap_if(first + 18, first + 48, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 25, first + 55, compare, projection); + iter_swap_if(first + 26, first + 60, compare, projection); + iter_swap_if(first + 28, first + 43, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 4, first + 19, compare, projection); + iter_swap_if(first + 5, first + 50, compare, projection); + iter_swap_if(first + 6, first + 51, compare, projection); + iter_swap_if(first + 7, first + 37, compare, projection); + iter_swap_if(first + 8, first + 38, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 26, compare, projection); + iter_swap_if(first + 12, first + 27, compare, projection); + iter_swap_if(first + 20, first + 35, compare, projection); + iter_swap_if(first + 21, first + 36, compare, projection); + iter_swap_if(first + 23, first + 53, compare, projection); + iter_swap_if(first + 24, first + 54, compare, projection); + iter_swap_if(first + 32, first + 47, compare, projection); + iter_swap_if(first + 33, first + 48, compare, projection); + iter_swap_if(first + 34, first + 49, compare, projection); + iter_swap_if(first + 40, first + 55, compare, projection); + iter_swap_if(first + 41, first + 60, compare, projection); + iter_swap_if(first + 42, first + 57, compare, projection); + iter_swap_if(first + 4, first + 15, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 7, first + 52, compare, projection); + iter_swap_if(first + 8, first + 23, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 17, first + 32, compare, projection); + iter_swap_if(first + 18, first + 33, compare, projection); + iter_swap_if(first + 22, first + 37, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 26, first + 41, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 35, first + 50, compare, projection); + iter_swap_if(first + 36, first + 51, compare, projection); + iter_swap_if(first + 38, first + 53, compare, projection); + iter_swap_if(first + 39, first + 54, compare, projection); + iter_swap_if(first + 44, first + 55, compare, projection); + iter_swap_if(first + 58, first + 60, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 16, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 8, first + 30, compare, projection); + iter_swap_if(first + 9, first + 31, compare, projection); + iter_swap_if(first + 10, first + 32, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 24, first + 39, compare, projection); + iter_swap_if(first + 25, first + 47, compare, projection); + iter_swap_if(first + 27, first + 49, compare, projection); + iter_swap_if(first + 28, first + 50, compare, projection); + iter_swap_if(first + 29, first + 51, compare, projection); + iter_swap_if(first + 37, first + 56, compare, projection); + iter_swap_if(first + 42, first + 53, compare, projection); + iter_swap_if(first + 43, first + 54, compare, projection); + iter_swap_if(first + 48, first + 52, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 11, first + 37, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 19, first + 30, compare, projection); + iter_swap_if(first + 20, first + 35, compare, projection); + iter_swap_if(first + 21, first + 36, compare, projection); + iter_swap_if(first + 22, first + 48, compare, projection); + iter_swap_if(first + 23, first + 45, compare, projection); + iter_swap_if(first + 24, first + 46, compare, projection); + iter_swap_if(first + 26, first + 52, compare, projection); + iter_swap_if(first + 29, first + 47, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 41, first + 56, compare, projection); + iter_swap_if(first + 42, first + 49, compare, projection); + iter_swap_if(first + 43, first + 50, compare, projection); + iter_swap_if(first + 44, first + 51, compare, projection); + iter_swap_if(first + 54, first + 58, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 7, first + 22, compare, projection); + iter_swap_if(first + 11, first + 33, compare, projection); + iter_swap_if(first + 12, first + 23, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 20, first + 31, compare, projection); + iter_swap_if(first + 21, first + 32, compare, projection); + iter_swap_if(first + 27, first + 45, compare, projection); + iter_swap_if(first + 28, first + 46, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 48, compare, projection); + iter_swap_if(first + 41, first + 52, compare, projection); + iter_swap_if(first + 50, first + 56, compare, projection); + iter_swap_if(first + 51, first + 57, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 24, first + 31, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 28, first + 35, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 38, first + 45, compare, projection); + iter_swap_if(first + 39, first + 46, compare, projection); + iter_swap_if(first + 40, first + 47, compare, projection); + iter_swap_if(first + 41, first + 48, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 33, compare, projection); + iter_swap_if(first + 26, first + 37, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 51, first + 56, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 26, first + 33, compare, projection); + iter_swap_if(first + 29, first + 34, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 40, first + 45, compare, projection); + iter_swap_if(first + 43, first + 48, compare, projection); + iter_swap_if(first + 44, first + 49, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 57, first + 60, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 59, first + 60, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 52, compare, projection); + iter_swap_if(first + 53, first + 56, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 497> + { + return {{ + {1, 2}, {3, 10}, {4, 14}, {5, 8}, {6, 13}, {7, 12}, {9, 11}, {16, 17}, {18, 25}, {19, 29}, {20, 23}, {21, 28}, {22, 27}, {24, 26}, {31, 32}, {33, 40}, {34, 44}, {35, 38}, {36, 43}, {37, 42}, {39, 41}, {45, 58}, {46, 57}, {47, 60}, {48, 59}, {49, 53}, {50, 51}, {52, 56}, {54, 55}, + {0, 14}, {1, 5}, {2, 8}, {3, 7}, {6, 9}, {10, 12}, {11, 13}, {15, 29}, {16, 20}, {17, 23}, {18, 22}, {21, 24}, {25, 27}, {26, 28}, {30, 44}, {31, 35}, {32, 38}, {33, 37}, {36, 39}, {40, 42}, {41, 43}, {45, 50}, {46, 52}, {47, 54}, {48, 49}, {51, 58}, {53, 59}, {55, 60}, {56, 57}, + {0, 7}, {1, 6}, {2, 9}, {4, 10}, {5, 11}, {8, 13}, {12, 14}, {15, 22}, {16, 21}, {17, 24}, {19, 25}, {20, 26}, {23, 28}, {27, 29}, {30, 37}, {31, 36}, {32, 39}, {34, 40}, {35, 41}, {38, 43}, {42, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 53}, {52, 54}, {55, 56}, {57, 58}, {59, 60}, + {0, 6}, {2, 4}, {3, 5}, {7, 11}, {8, 10}, {9, 12}, {13, 14}, {15, 21}, {17, 19}, {18, 20}, {22, 26}, {23, 25}, {24, 27}, {28, 29}, {30, 36}, {32, 34}, {33, 35}, {37, 41}, {38, 40}, {39, 42}, {43, 44}, {45, 47}, {46, 48}, {49, 55}, {50, 56}, {51, 52}, {53, 54}, {57, 59}, {58, 60}, + {0, 3}, {1, 2}, {4, 7}, {5, 9}, {6, 8}, {10, 11}, {12, 13}, {15, 18}, {16, 17}, {19, 22}, {20, 24}, {21, 23}, {25, 26}, {27, 28}, {29, 44}, {30, 33}, {31, 32}, {34, 37}, {35, 39}, {36, 38}, {40, 41}, {42, 43}, {46, 47}, {48, 57}, {49, 51}, {50, 52}, {53, 55}, {54, 56}, {58, 59}, + {0, 1}, {2, 3}, {4, 6}, {7, 9}, {10, 12}, {11, 13}, {15, 16}, {17, 18}, {19, 21}, {22, 24}, {25, 27}, {26, 28}, {30, 31}, {32, 33}, {34, 36}, {37, 39}, {40, 42}, {41, 43}, {46, 49}, {47, 51}, {50, 53}, {52, 55}, {54, 58}, {56, 59}, + {0, 30}, {1, 2}, {3, 5}, {8, 10}, {11, 12}, {14, 59}, {15, 45}, {16, 17}, {18, 20}, {23, 25}, {26, 27}, {28, 43}, {31, 32}, {33, 35}, {38, 40}, {41, 42}, {47, 49}, {48, 51}, {54, 57}, {56, 58}, + {0, 15}, {1, 31}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {13, 58}, {14, 29}, {16, 46}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {27, 42}, {30, 45}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {44, 59}, {48, 50}, {51, 53}, {52, 54}, {55, 57}, + {1, 16}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {13, 28}, {15, 30}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {29, 44}, {31, 46}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {43, 58}, {48, 49}, {50, 51}, {52, 53}, {54, 55}, {56, 57}, + {2, 32}, {3, 33}, {4, 49}, {5, 6}, {7, 8}, {9, 39}, {10, 40}, {11, 41}, {12, 57}, {16, 31}, {17, 47}, {18, 48}, {19, 34}, {20, 21}, {22, 23}, {25, 55}, {26, 60}, {28, 43}, {35, 36}, {37, 38}, {51, 52}, {53, 54}, + {2, 17}, {3, 18}, {4, 19}, {5, 50}, {6, 51}, {7, 37}, {8, 38}, {10, 25}, {11, 26}, {12, 27}, {20, 35}, {21, 36}, {23, 53}, {24, 54}, {32, 47}, {33, 48}, {34, 49}, {40, 55}, {41, 60}, {42, 57}, + {4, 15}, {5, 20}, {6, 21}, {7, 52}, {8, 23}, {9, 24}, {12, 19}, {17, 32}, {18, 33}, {22, 37}, {25, 40}, {26, 41}, {27, 42}, {35, 50}, {36, 51}, {38, 53}, {39, 54}, {44, 55}, {58, 60}, + {1, 4}, {5, 16}, {6, 17}, {8, 30}, {9, 31}, {10, 32}, {13, 20}, {14, 21}, {19, 34}, {23, 38}, {24, 39}, {25, 47}, {27, 49}, {28, 50}, {29, 51}, {37, 56}, {42, 53}, {43, 54}, {48, 52}, + {8, 15}, {9, 16}, {10, 17}, {11, 37}, {14, 25}, {19, 30}, {20, 35}, {21, 36}, {22, 48}, {23, 45}, {24, 46}, {26, 52}, {29, 47}, {34, 38}, {41, 56}, {42, 49}, {43, 50}, {44, 51}, {54, 58}, + {2, 8}, {3, 9}, {7, 22}, {11, 33}, {12, 23}, {13, 24}, {20, 31}, {21, 32}, {27, 45}, {28, 46}, {35, 39}, {36, 40}, {37, 48}, {41, 52}, {50, 56}, {51, 57}, + {2, 4}, {5, 8}, {7, 18}, {12, 19}, {13, 20}, {14, 21}, {23, 30}, {24, 31}, {25, 32}, {27, 34}, {28, 35}, {29, 36}, {33, 37}, {38, 45}, {39, 46}, {40, 47}, {41, 48}, {51, 54}, {57, 58}, + {11, 18}, {12, 15}, {13, 16}, {14, 17}, {19, 23}, {20, 24}, {21, 25}, {22, 33}, {26, 37}, {27, 30}, {28, 31}, {29, 32}, {34, 38}, {35, 39}, {36, 40}, {42, 45}, {43, 46}, {44, 47}, {51, 56}, {55, 57}, + {6, 12}, {7, 13}, {10, 15}, {11, 16}, {14, 19}, {17, 23}, {18, 22}, {21, 27}, {25, 30}, {26, 33}, {29, 34}, {32, 38}, {36, 42}, {37, 41}, {40, 45}, {43, 48}, {44, 49}, {46, 52}, {47, 53}, {57, 60}, + {6, 8}, {7, 10}, {9, 12}, {11, 13}, {14, 15}, {16, 19}, {18, 20}, {22, 24}, {26, 28}, {29, 30}, {31, 33}, {35, 37}, {39, 41}, {42, 43}, {44, 46}, {45, 48}, {47, 50}, {49, 52}, {51, 53}, {57, 58}, {59, 60}, + {3, 6}, {7, 12}, {11, 14}, {13, 15}, {17, 18}, {20, 21}, {22, 23}, {24, 27}, {25, 26}, {28, 31}, {32, 35}, {33, 34}, {36, 39}, {37, 38}, {40, 41}, {44, 45}, {46, 48}, {47, 52}, {53, 56}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {13, 14}, {16, 17}, {18, 19}, {20, 22}, {21, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 42}, {41, 43}, {45, 46}, {47, 49}, {50, 52}, {54, 56}, + {3, 4}, {7, 8}, {11, 12}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {47, 48}, {51, 52}, {55, 56}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT61_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort62.h b/include/cpp-sort/detail/sorting_network/sort62.h new file mode 100644 index 00000000..a83eb58c --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort62.h @@ -0,0 +1,567 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT62_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT62_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<62> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 4, first + 14, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 16, first + 27, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 18, first + 29, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 41, compare, projection); + iter_swap_if(first + 35, first + 45, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 37, first + 44, compare, projection); + iter_swap_if(first + 38, first + 43, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 46, first + 59, compare, projection); + iter_swap_if(first + 47, first + 58, compare, projection); + iter_swap_if(first + 48, first + 61, compare, projection); + iter_swap_if(first + 49, first + 60, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 57, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first, first + 14, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 21, first + 28, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 31, first + 45, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 46, first + 51, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 48, first + 55, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 52, first + 59, compare, projection); + iter_swap_if(first + 54, first + 60, compare, projection); + iter_swap_if(first + 56, first + 61, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first + 32, first + 37, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 39, first + 44, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first + 60, first + 61, compare, projection); + iter_swap_if(first, first + 6, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 56, compare, projection); + iter_swap_if(first + 51, first + 57, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 58, first + 60, compare, projection); + iter_swap_if(first + 59, first + 61, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 46, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 58, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 59, first + 60, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 47, first + 50, compare, projection); + iter_swap_if(first + 48, first + 52, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 53, first + 56, compare, projection); + iter_swap_if(first + 55, first + 59, compare, projection); + iter_swap_if(first + 57, first + 60, compare, projection); + iter_swap_if(first, first + 31, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 14, first + 60, compare, projection); + iter_swap_if(first + 16, first + 47, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 52, compare, projection); + iter_swap_if(first + 55, first + 58, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 32, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 13, first + 59, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 17, first + 48, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 31, first + 46, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 45, first + 60, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 32, first + 47, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 44, first + 59, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 2, first + 33, compare, projection); + iter_swap_if(first + 3, first + 34, compare, projection); + iter_swap_if(first + 4, first + 50, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 40, compare, projection); + iter_swap_if(first + 10, first + 41, compare, projection); + iter_swap_if(first + 11, first + 61, compare, projection); + iter_swap_if(first + 12, first + 58, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 18, first + 49, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 56, compare, projection); + iter_swap_if(first + 26, first + 57, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 4, first + 19, compare, projection); + iter_swap_if(first + 5, first + 51, compare, projection); + iter_swap_if(first + 6, first + 52, compare, projection); + iter_swap_if(first + 7, first + 38, compare, projection); + iter_swap_if(first + 8, first + 39, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 30, compare, projection); + iter_swap_if(first + 12, first + 27, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 53, compare, projection); + iter_swap_if(first + 23, first + 54, compare, projection); + iter_swap_if(first + 24, first + 55, compare, projection); + iter_swap_if(first + 33, first + 48, compare, projection); + iter_swap_if(first + 35, first + 50, compare, projection); + iter_swap_if(first + 41, first + 56, compare, projection); + iter_swap_if(first + 42, first + 61, compare, projection); + iter_swap_if(first + 43, first + 58, compare, projection); + iter_swap_if(first + 4, first + 15, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 7, first + 49, compare, projection); + iter_swap_if(first + 8, first + 23, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 36, first + 51, compare, projection); + iter_swap_if(first + 37, first + 52, compare, projection); + iter_swap_if(first + 38, first + 57, compare, projection); + iter_swap_if(first + 39, first + 54, compare, projection); + iter_swap_if(first + 40, first + 55, compare, projection); + iter_swap_if(first + 45, first + 56, compare, projection); + iter_swap_if(first + 59, first + 61, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 16, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 8, first + 31, compare, projection); + iter_swap_if(first + 9, first + 32, compare, projection); + iter_swap_if(first + 10, first + 33, compare, projection); + iter_swap_if(first + 11, first + 22, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 25, first + 48, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 27, first + 50, compare, projection); + iter_swap_if(first + 28, first + 51, compare, projection); + iter_swap_if(first + 29, first + 52, compare, projection); + iter_swap_if(first + 34, first + 53, compare, projection); + iter_swap_if(first + 42, first + 57, compare, projection); + iter_swap_if(first + 43, first + 54, compare, projection); + iter_swap_if(first + 44, first + 55, compare, projection); + iter_swap_if(first + 60, first + 61, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 19, first + 31, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 23, first + 46, compare, projection); + iter_swap_if(first + 24, first + 47, compare, projection); + iter_swap_if(first + 29, first + 48, compare, projection); + iter_swap_if(first + 30, first + 53, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 38, first + 49, compare, projection); + iter_swap_if(first + 43, first + 50, compare, projection); + iter_swap_if(first + 44, first + 51, compare, projection); + iter_swap_if(first + 45, first + 52, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 12, first + 23, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 26, first + 38, compare, projection); + iter_swap_if(first + 27, first + 46, compare, projection); + iter_swap_if(first + 28, first + 47, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 42, first + 53, compare, projection); + iter_swap_if(first + 52, first + 58, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 57, first + 60, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 34, first + 49, compare, projection); + iter_swap_if(first + 39, first + 46, compare, projection); + iter_swap_if(first + 40, first + 47, compare, projection); + iter_swap_if(first + 41, first + 48, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 42, first + 49, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 46, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 50, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 54, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 506> + { + return {{ + {1, 2}, {3, 10}, {4, 14}, {5, 8}, {6, 13}, {7, 12}, {9, 11}, {15, 28}, {16, 27}, {17, 30}, {18, 29}, {19, 23}, {20, 21}, {22, 26}, {24, 25}, {32, 33}, {34, 41}, {35, 45}, {36, 39}, {37, 44}, {38, 43}, {40, 42}, {46, 59}, {47, 58}, {48, 61}, {49, 60}, {50, 54}, {51, 52}, {53, 57}, {55, 56}, + {0, 14}, {1, 5}, {2, 8}, {3, 7}, {6, 9}, {10, 12}, {11, 13}, {15, 20}, {16, 22}, {17, 24}, {18, 19}, {21, 28}, {23, 29}, {25, 30}, {26, 27}, {31, 45}, {32, 36}, {33, 39}, {34, 38}, {37, 40}, {41, 43}, {42, 44}, {46, 51}, {47, 53}, {48, 55}, {49, 50}, {52, 59}, {54, 60}, {56, 61}, {57, 58}, + {0, 7}, {1, 6}, {2, 9}, {4, 10}, {5, 11}, {8, 13}, {12, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 23}, {22, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 38}, {32, 37}, {33, 40}, {35, 41}, {36, 42}, {39, 44}, {43, 45}, {46, 47}, {48, 49}, {50, 51}, {52, 54}, {53, 55}, {56, 57}, {58, 59}, {60, 61}, + {0, 6}, {2, 4}, {3, 5}, {7, 11}, {8, 10}, {9, 12}, {13, 14}, {15, 17}, {16, 18}, {19, 25}, {20, 26}, {21, 22}, {23, 24}, {27, 29}, {28, 30}, {31, 37}, {33, 35}, {34, 36}, {38, 42}, {39, 41}, {40, 43}, {44, 45}, {46, 48}, {47, 49}, {50, 56}, {51, 57}, {52, 53}, {54, 55}, {58, 60}, {59, 61}, + {0, 3}, {1, 2}, {4, 7}, {5, 9}, {6, 8}, {10, 11}, {12, 13}, {15, 46}, {16, 17}, {18, 27}, {19, 21}, {20, 22}, {23, 25}, {24, 26}, {28, 29}, {31, 34}, {32, 33}, {35, 38}, {36, 40}, {37, 39}, {41, 42}, {43, 44}, {47, 48}, {49, 58}, {50, 52}, {51, 53}, {54, 56}, {55, 57}, {59, 60}, + {0, 1}, {2, 3}, {4, 6}, {7, 9}, {10, 12}, {11, 13}, {16, 19}, {17, 21}, {20, 23}, {22, 25}, {24, 28}, {26, 29}, {31, 32}, {33, 34}, {35, 37}, {38, 40}, {41, 43}, {42, 44}, {47, 50}, {48, 52}, {51, 54}, {53, 56}, {55, 59}, {57, 60}, + {0, 31}, {1, 2}, {3, 5}, {8, 10}, {11, 12}, {14, 60}, {16, 47}, {17, 19}, {18, 21}, {24, 27}, {26, 28}, {29, 45}, {32, 33}, {34, 36}, {39, 41}, {42, 43}, {48, 50}, {49, 52}, {55, 58}, {57, 59}, + {0, 15}, {1, 32}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {13, 59}, {14, 29}, {17, 48}, {18, 20}, {21, 23}, {22, 24}, {25, 27}, {28, 44}, {31, 46}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {45, 60}, {49, 51}, {52, 54}, {53, 55}, {56, 58}, + {1, 16}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {13, 28}, {15, 31}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {29, 45}, {32, 47}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {44, 59}, {49, 50}, {51, 52}, {53, 54}, {55, 56}, {57, 58}, + {2, 33}, {3, 34}, {4, 50}, {5, 6}, {7, 8}, {9, 40}, {10, 41}, {11, 61}, {12, 58}, {16, 32}, {18, 49}, {19, 35}, {21, 22}, {23, 24}, {25, 56}, {26, 57}, {27, 43}, {28, 44}, {30, 42}, {36, 37}, {38, 39}, {52, 53}, {54, 55}, + {2, 17}, {3, 18}, {4, 19}, {5, 51}, {6, 52}, {7, 38}, {8, 39}, {10, 25}, {11, 30}, {12, 27}, {20, 36}, {21, 37}, {22, 53}, {23, 54}, {24, 55}, {33, 48}, {35, 50}, {41, 56}, {42, 61}, {43, 58}, + {4, 15}, {5, 20}, {6, 21}, {7, 49}, {8, 23}, {9, 24}, {12, 19}, {17, 33}, {22, 34}, {25, 41}, {27, 43}, {30, 42}, {36, 51}, {37, 52}, {38, 57}, {39, 54}, {40, 55}, {45, 56}, {59, 61}, + {1, 4}, {5, 16}, {6, 17}, {7, 18}, {8, 31}, {9, 32}, {10, 33}, {11, 22}, {13, 20}, {14, 21}, {19, 35}, {23, 39}, {24, 40}, {25, 48}, {26, 38}, {27, 50}, {28, 51}, {29, 52}, {34, 53}, {42, 57}, {43, 54}, {44, 55}, {60, 61}, + {7, 11}, {8, 15}, {9, 16}, {10, 17}, {14, 25}, {18, 26}, {19, 31}, {20, 36}, {21, 37}, {22, 34}, {23, 46}, {24, 47}, {29, 48}, {30, 53}, {35, 39}, {38, 49}, {43, 50}, {44, 51}, {45, 52}, {56, 57}, + {2, 8}, {3, 9}, {11, 18}, {12, 23}, {13, 24}, {20, 32}, {21, 33}, {26, 38}, {27, 46}, {28, 47}, {30, 34}, {36, 40}, {37, 41}, {42, 53}, {52, 58}, {55, 56}, {57, 60}, + {2, 4}, {5, 8}, {12, 19}, {13, 20}, {14, 21}, {22, 26}, {23, 31}, {24, 32}, {25, 33}, {27, 35}, {28, 36}, {29, 37}, {30, 38}, {34, 49}, {39, 46}, {40, 47}, {41, 48}, {51, 53}, {58, 59}, + {3, 8}, {12, 15}, {13, 16}, {14, 17}, {18, 22}, {19, 23}, {20, 24}, {21, 25}, {26, 30}, {27, 31}, {28, 32}, {29, 33}, {34, 38}, {35, 39}, {36, 40}, {37, 41}, {42, 49}, {43, 46}, {44, 47}, {45, 48}, {53, 55}, {56, 58}, {57, 59}, + {6, 12}, {7, 13}, {10, 15}, {11, 16}, {14, 19}, {17, 23}, {18, 20}, {21, 27}, {22, 24}, {25, 31}, {26, 28}, {29, 35}, {30, 32}, {33, 39}, {34, 36}, {37, 43}, {38, 40}, {41, 46}, {42, 44}, {45, 50}, {47, 49}, {48, 54}, {57, 58}, + {3, 6}, {7, 9}, {10, 12}, {11, 13}, {14, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 42}, {41, 43}, {44, 47}, {45, 46}, {48, 50}, {49, 51}, {52, 54}, + {3, 5}, {6, 8}, {7, 10}, {9, 12}, {11, 14}, {13, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 38}, {37, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, {52, 53}, {54, 55}, + {3, 4}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, {53, 54}, {55, 56}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT62_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort63.h b/include/cpp-sort/detail/sorting_network/sort63.h new file mode 100644 index 00000000..e38e0336 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort63.h @@ -0,0 +1,576 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT63_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT63_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<63> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 10, compare, projection); + iter_swap_if(first + 4, first + 14, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 13, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 15, first + 28, compare, projection); + iter_swap_if(first + 16, first + 27, compare, projection); + iter_swap_if(first + 17, first + 30, compare, projection); + iter_swap_if(first + 18, first + 29, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 31, first + 44, compare, projection); + iter_swap_if(first + 32, first + 43, compare, projection); + iter_swap_if(first + 33, first + 46, compare, projection); + iter_swap_if(first + 34, first + 45, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 47, first + 60, compare, projection); + iter_swap_if(first + 48, first + 59, compare, projection); + iter_swap_if(first + 49, first + 62, compare, projection); + iter_swap_if(first + 50, first + 61, compare, projection); + iter_swap_if(first + 51, first + 55, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 58, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first, first + 14, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 6, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 15, first + 20, compare, projection); + iter_swap_if(first + 16, first + 22, compare, projection); + iter_swap_if(first + 17, first + 24, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 21, first + 28, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 25, first + 30, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 31, first + 36, compare, projection); + iter_swap_if(first + 32, first + 38, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 37, first + 44, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 41, first + 46, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 47, first + 52, compare, projection); + iter_swap_if(first + 48, first + 54, compare, projection); + iter_swap_if(first + 49, first + 56, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 53, first + 60, compare, projection); + iter_swap_if(first + 55, first + 61, compare, projection); + iter_swap_if(first + 57, first + 62, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first, first + 7, compare, projection); + iter_swap_if(first + 1, first + 6, compare, projection); + iter_swap_if(first + 2, first + 9, compare, projection); + iter_swap_if(first + 4, first + 10, compare, projection); + iter_swap_if(first + 5, first + 11, compare, projection); + iter_swap_if(first + 8, first + 13, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 59, first + 60, compare, projection); + iter_swap_if(first + 61, first + 62, compare, projection); + iter_swap_if(first, first + 6, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 20, first + 26, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 36, first + 42, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 51, first + 57, compare, projection); + iter_swap_if(first + 52, first + 58, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 59, first + 61, compare, projection); + iter_swap_if(first + 60, first + 62, compare, projection); + iter_swap_if(first, first + 3, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 4, first + 7, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 15, first + 47, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 27, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 43, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 62, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 59, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first + 60, first + 61, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 22, first + 25, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 26, first + 29, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 36, first + 39, compare, projection); + iter_swap_if(first + 38, first + 41, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 42, first + 45, compare, projection); + iter_swap_if(first + 48, first + 51, compare, projection); + iter_swap_if(first + 49, first + 53, compare, projection); + iter_swap_if(first + 52, first + 55, compare, projection); + iter_swap_if(first + 54, first + 57, compare, projection); + iter_swap_if(first + 56, first + 60, compare, projection); + iter_swap_if(first + 58, first + 61, compare, projection); + iter_swap_if(first, first + 31, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 14, first + 61, compare, projection); + iter_swap_if(first + 16, first + 48, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 18, first + 21, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 34, first + 37, compare, projection); + iter_swap_if(first + 40, first + 43, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 50, first + 53, compare, projection); + iter_swap_if(first + 56, first + 59, compare, projection); + iter_swap_if(first + 58, first + 60, compare, projection); + iter_swap_if(first, first + 15, compare, projection); + iter_swap_if(first + 1, first + 32, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 13, first + 60, compare, projection); + iter_swap_if(first + 14, first + 29, compare, projection); + iter_swap_if(first + 17, first + 49, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 45, first + 61, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first + 1, first + 16, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 15, first + 31, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 32, first + 48, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 60, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first + 2, first + 33, compare, projection); + iter_swap_if(first + 4, first + 51, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 10, first + 41, compare, projection); + iter_swap_if(first + 11, first + 30, compare, projection); + iter_swap_if(first + 12, first + 59, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 18, first + 50, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 57, compare, projection); + iter_swap_if(first + 26, first + 58, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 2, first + 17, compare, projection); + iter_swap_if(first + 3, first + 38, compare, projection); + iter_swap_if(first + 4, first + 19, compare, projection); + iter_swap_if(first + 5, first + 52, compare, projection); + iter_swap_if(first + 6, first + 53, compare, projection); + iter_swap_if(first + 7, first + 42, compare, projection); + iter_swap_if(first + 8, first + 39, compare, projection); + iter_swap_if(first + 9, first + 40, compare, projection); + iter_swap_if(first + 10, first + 25, compare, projection); + iter_swap_if(first + 11, first + 46, compare, projection); + iter_swap_if(first + 12, first + 27, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 54, compare, projection); + iter_swap_if(first + 23, first + 55, compare, projection); + iter_swap_if(first + 24, first + 56, compare, projection); + iter_swap_if(first + 30, first + 62, compare, projection); + iter_swap_if(first + 33, first + 49, compare, projection); + iter_swap_if(first + 35, first + 51, compare, projection); + iter_swap_if(first + 41, first + 57, compare, projection); + iter_swap_if(first + 43, first + 59, compare, projection); + iter_swap_if(first + 3, first + 22, compare, projection); + iter_swap_if(first + 4, first + 15, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 6, first + 21, compare, projection); + iter_swap_if(first + 7, first + 50, compare, projection); + iter_swap_if(first + 8, first + 23, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 25, first + 41, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 43, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 39, first + 55, compare, projection); + iter_swap_if(first + 40, first + 56, compare, projection); + iter_swap_if(first + 42, first + 58, compare, projection); + iter_swap_if(first + 45, first + 57, compare, projection); + iter_swap_if(first + 61, first + 62, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 5, first + 16, compare, projection); + iter_swap_if(first + 6, first + 17, compare, projection); + iter_swap_if(first + 7, first + 26, compare, projection); + iter_swap_if(first + 8, first + 31, compare, projection); + iter_swap_if(first + 9, first + 32, compare, projection); + iter_swap_if(first + 10, first + 33, compare, projection); + iter_swap_if(first + 11, first + 38, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 23, first + 39, compare, projection); + iter_swap_if(first + 24, first + 40, compare, projection); + iter_swap_if(first + 25, first + 49, compare, projection); + iter_swap_if(first + 27, first + 51, compare, projection); + iter_swap_if(first + 28, first + 52, compare, projection); + iter_swap_if(first + 29, first + 53, compare, projection); + iter_swap_if(first + 30, first + 54, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 43, first + 55, compare, projection); + iter_swap_if(first + 44, first + 56, compare, projection); + iter_swap_if(first + 46, first + 58, compare, projection); + iter_swap_if(first + 7, first + 18, compare, projection); + iter_swap_if(first + 8, first + 15, compare, projection); + iter_swap_if(first + 9, first + 16, compare, projection); + iter_swap_if(first + 10, first + 17, compare, projection); + iter_swap_if(first + 14, first + 25, compare, projection); + iter_swap_if(first + 19, first + 31, compare, projection); + iter_swap_if(first + 20, first + 36, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 38, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 24, first + 48, compare, projection); + iter_swap_if(first + 29, first + 49, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 43, first + 51, compare, projection); + iter_swap_if(first + 44, first + 52, compare, projection); + iter_swap_if(first + 45, first + 53, compare, projection); + iter_swap_if(first + 46, first + 54, compare, projection); + iter_swap_if(first + 58, first + 60, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 11, first + 22, compare, projection); + iter_swap_if(first + 12, first + 23, compare, projection); + iter_swap_if(first + 13, first + 24, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 47, compare, projection); + iter_swap_if(first + 28, first + 48, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 53, first + 59, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 60, first + 61, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 11, first + 26, compare, projection); + iter_swap_if(first + 12, first + 19, compare, projection); + iter_swap_if(first + 13, first + 20, compare, projection); + iter_swap_if(first + 14, first + 21, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 38, first + 50, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 12, first + 15, compare, projection); + iter_swap_if(first + 13, first + 16, compare, projection); + iter_swap_if(first + 14, first + 17, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 15, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 14, first + 19, compare, projection); + iter_swap_if(first + 17, first + 23, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 21, first + 27, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 25, first + 31, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 29, first + 35, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 33, first + 39, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 37, first + 43, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 41, first + 47, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 45, first + 51, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 49, first + 55, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 59, first + 60, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 16, first + 19, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 20, first + 23, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 24, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 31, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 32, first + 35, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 47, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 515> + { + return {{ + {1, 2}, {3, 10}, {4, 14}, {5, 8}, {6, 13}, {7, 12}, {9, 11}, {15, 28}, {16, 27}, {17, 30}, {18, 29}, {19, 23}, {20, 21}, {22, 26}, {24, 25}, {31, 44}, {32, 43}, {33, 46}, {34, 45}, {35, 39}, {36, 37}, {38, 42}, {40, 41}, {47, 60}, {48, 59}, {49, 62}, {50, 61}, {51, 55}, {52, 53}, {54, 58}, {56, 57}, + {0, 14}, {1, 5}, {2, 8}, {3, 7}, {6, 9}, {10, 12}, {11, 13}, {15, 20}, {16, 22}, {17, 24}, {18, 19}, {21, 28}, {23, 29}, {25, 30}, {26, 27}, {31, 36}, {32, 38}, {33, 40}, {34, 35}, {37, 44}, {39, 45}, {41, 46}, {42, 43}, {47, 52}, {48, 54}, {49, 56}, {50, 51}, {53, 60}, {55, 61}, {57, 62}, {58, 59}, + {0, 7}, {1, 6}, {2, 9}, {4, 10}, {5, 11}, {8, 13}, {12, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 23}, {22, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 39}, {38, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, {53, 55}, {54, 56}, {57, 58}, {59, 60}, {61, 62}, + {0, 6}, {2, 4}, {3, 5}, {7, 11}, {8, 10}, {9, 12}, {13, 14}, {15, 17}, {16, 18}, {19, 25}, {20, 26}, {21, 22}, {23, 24}, {27, 29}, {28, 30}, {31, 33}, {32, 34}, {35, 41}, {36, 42}, {37, 38}, {39, 40}, {43, 45}, {44, 46}, {47, 49}, {48, 50}, {51, 57}, {52, 58}, {53, 54}, {55, 56}, {59, 61}, {60, 62}, + {0, 3}, {1, 2}, {4, 7}, {5, 9}, {6, 8}, {10, 11}, {12, 13}, {15, 47}, {16, 17}, {18, 27}, {19, 21}, {20, 22}, {23, 25}, {24, 26}, {28, 29}, {32, 33}, {34, 43}, {35, 37}, {36, 38}, {39, 41}, {40, 42}, {44, 45}, {46, 62}, {48, 49}, {50, 59}, {51, 53}, {52, 54}, {55, 57}, {56, 58}, {60, 61}, + {0, 1}, {2, 3}, {4, 6}, {7, 9}, {10, 12}, {11, 13}, {16, 19}, {17, 21}, {20, 23}, {22, 25}, {24, 28}, {26, 29}, {32, 35}, {33, 37}, {36, 39}, {38, 41}, {40, 44}, {42, 45}, {48, 51}, {49, 53}, {52, 55}, {54, 57}, {56, 60}, {58, 61}, + {0, 31}, {1, 2}, {3, 5}, {8, 10}, {11, 12}, {14, 61}, {16, 48}, {17, 19}, {18, 21}, {24, 27}, {26, 28}, {29, 45}, {33, 35}, {34, 37}, {40, 43}, {42, 44}, {49, 51}, {50, 53}, {56, 59}, {58, 60}, + {0, 15}, {1, 32}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {13, 60}, {14, 29}, {17, 49}, {18, 20}, {21, 23}, {22, 24}, {25, 27}, {28, 44}, {31, 47}, {34, 36}, {37, 39}, {38, 40}, {41, 43}, {45, 61}, {50, 52}, {53, 55}, {54, 56}, {57, 59}, + {1, 16}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {13, 28}, {15, 31}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {29, 45}, {32, 48}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 60}, {50, 51}, {52, 53}, {54, 55}, {56, 57}, {58, 59}, + {2, 33}, {4, 51}, {5, 6}, {7, 8}, {10, 41}, {11, 30}, {12, 59}, {16, 32}, {18, 50}, {19, 35}, {20, 36}, {21, 22}, {23, 24}, {25, 57}, {26, 58}, {27, 43}, {28, 44}, {37, 38}, {39, 40}, {53, 54}, {55, 56}, + {2, 17}, {3, 38}, {4, 19}, {5, 52}, {6, 53}, {7, 42}, {8, 39}, {9, 40}, {10, 25}, {11, 46}, {12, 27}, {18, 34}, {21, 37}, {22, 54}, {23, 55}, {24, 56}, {30, 62}, {33, 49}, {35, 51}, {41, 57}, {43, 59}, + {3, 22}, {4, 15}, {5, 20}, {6, 21}, {7, 50}, {8, 23}, {9, 24}, {12, 19}, {17, 33}, {25, 41}, {26, 34}, {27, 43}, {30, 46}, {36, 52}, {37, 53}, {38, 54}, {39, 55}, {40, 56}, {42, 58}, {45, 57}, {61, 62}, + {1, 4}, {3, 18}, {5, 16}, {6, 17}, {7, 26}, {8, 31}, {9, 32}, {10, 33}, {11, 38}, {13, 20}, {14, 21}, {19, 35}, {23, 39}, {24, 40}, {25, 49}, {27, 51}, {28, 52}, {29, 53}, {30, 54}, {42, 50}, {43, 55}, {44, 56}, {46, 58}, + {7, 18}, {8, 15}, {9, 16}, {10, 17}, {14, 25}, {19, 31}, {20, 36}, {21, 37}, {22, 38}, {23, 47}, {24, 48}, {29, 49}, {34, 42}, {35, 39}, {43, 51}, {44, 52}, {45, 53}, {46, 54}, {58, 60}, + {2, 8}, {3, 9}, {11, 22}, {12, 23}, {13, 24}, {20, 32}, {21, 33}, {26, 34}, {27, 47}, {28, 48}, {30, 38}, {36, 40}, {37, 41}, {42, 50}, {53, 59}, {54, 56}, {60, 61}, + {2, 4}, {3, 8}, {11, 26}, {12, 19}, {13, 20}, {14, 21}, {22, 34}, {23, 31}, {24, 32}, {25, 33}, {27, 35}, {28, 36}, {29, 37}, {30, 42}, {38, 50}, {39, 47}, {40, 48}, {41, 49}, {56, 57}, {58, 59}, + {11, 18}, {12, 15}, {13, 16}, {14, 17}, {19, 23}, {20, 24}, {21, 25}, {22, 26}, {27, 31}, {28, 32}, {29, 33}, {30, 34}, {35, 39}, {36, 40}, {37, 41}, {38, 42}, {43, 47}, {44, 48}, {45, 49}, {46, 50}, {56, 58}, {57, 59}, + {6, 12}, {7, 13}, {10, 15}, {11, 16}, {14, 19}, {17, 23}, {18, 20}, {21, 27}, {22, 24}, {25, 31}, {26, 28}, {29, 35}, {30, 32}, {33, 39}, {34, 36}, {37, 43}, {38, 40}, {41, 47}, {42, 44}, {45, 51}, {46, 48}, {49, 55}, {50, 52}, {57, 58}, {59, 60}, + {5, 6}, {7, 10}, {9, 12}, {11, 15}, {13, 14}, {16, 19}, {17, 18}, {20, 23}, {21, 22}, {24, 27}, {25, 26}, {28, 31}, {29, 30}, {32, 35}, {33, 34}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 47}, {45, 46}, {48, 50}, {49, 51}, {52, 53}, {54, 55}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, {52, 54}, {53, 55}, + {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, {53, 54}, {55, 56}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT63_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort64.h b/include/cpp-sort/detail/sorting_network/sort64.h new file mode 100644 index 00000000..11bef993 --- /dev/null +++ b/include/cpp-sort/detail/sorting_network/sort64.h @@ -0,0 +1,582 @@ +/* +* Copyright (c) 2023 Morwenn +* SPDX-License-Identifier: MIT +*/ +#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT64_H_ +#define CPPSORT_DETAIL_SORTING_NETWORK_SORT64_H_ + +namespace cppsort +{ +namespace detail +{ + template<> + struct sorting_network_sorter_impl<64> + { + template< + typename RandomAccessIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t> + > + auto operator()(RandomAccessIterator first, RandomAccessIterator, + Compare compare={}, Projection projection={}) const + -> void + { + iter_swap_if(first, first + 2, compare, projection); + iter_swap_if(first + 1, first + 3, compare, projection); + iter_swap_if(first + 4, first + 6, compare, projection); + iter_swap_if(first + 5, first + 7, compare, projection); + iter_swap_if(first + 8, first + 10, compare, projection); + iter_swap_if(first + 9, first + 11, compare, projection); + iter_swap_if(first + 12, first + 14, compare, projection); + iter_swap_if(first + 13, first + 15, compare, projection); + iter_swap_if(first + 16, first + 18, compare, projection); + iter_swap_if(first + 17, first + 19, compare, projection); + iter_swap_if(first + 20, first + 22, compare, projection); + iter_swap_if(first + 21, first + 23, compare, projection); + iter_swap_if(first + 24, first + 26, compare, projection); + iter_swap_if(first + 25, first + 27, compare, projection); + iter_swap_if(first + 28, first + 30, compare, projection); + iter_swap_if(first + 29, first + 31, compare, projection); + iter_swap_if(first + 32, first + 34, compare, projection); + iter_swap_if(first + 33, first + 35, compare, projection); + iter_swap_if(first + 36, first + 38, compare, projection); + iter_swap_if(first + 37, first + 39, compare, projection); + iter_swap_if(first + 40, first + 42, compare, projection); + iter_swap_if(first + 41, first + 43, compare, projection); + iter_swap_if(first + 44, first + 46, compare, projection); + iter_swap_if(first + 45, first + 47, compare, projection); + iter_swap_if(first + 48, first + 50, compare, projection); + iter_swap_if(first + 49, first + 51, compare, projection); + iter_swap_if(first + 52, first + 54, compare, projection); + iter_swap_if(first + 53, first + 55, compare, projection); + iter_swap_if(first + 56, first + 58, compare, projection); + iter_swap_if(first + 57, first + 59, compare, projection); + iter_swap_if(first + 60, first + 62, compare, projection); + iter_swap_if(first + 61, first + 63, compare, projection); + iter_swap_if(first, first + 1, compare, projection); + iter_swap_if(first + 2, first + 3, compare, projection); + iter_swap_if(first + 4, first + 5, compare, projection); + iter_swap_if(first + 6, first + 7, compare, projection); + iter_swap_if(first + 8, first + 9, compare, projection); + iter_swap_if(first + 10, first + 11, compare, projection); + iter_swap_if(first + 12, first + 13, compare, projection); + iter_swap_if(first + 14, first + 15, compare, projection); + iter_swap_if(first + 16, first + 17, compare, projection); + iter_swap_if(first + 18, first + 19, compare, projection); + iter_swap_if(first + 20, first + 21, compare, projection); + iter_swap_if(first + 22, first + 23, compare, projection); + iter_swap_if(first + 24, first + 25, compare, projection); + iter_swap_if(first + 26, first + 27, compare, projection); + iter_swap_if(first + 28, first + 29, compare, projection); + iter_swap_if(first + 30, first + 31, compare, projection); + iter_swap_if(first + 32, first + 33, compare, projection); + iter_swap_if(first + 34, first + 35, compare, projection); + iter_swap_if(first + 36, first + 37, compare, projection); + iter_swap_if(first + 38, first + 39, compare, projection); + iter_swap_if(first + 40, first + 41, compare, projection); + iter_swap_if(first + 42, first + 43, compare, projection); + iter_swap_if(first + 44, first + 45, compare, projection); + iter_swap_if(first + 46, first + 47, compare, projection); + iter_swap_if(first + 48, first + 49, compare, projection); + iter_swap_if(first + 50, first + 51, compare, projection); + iter_swap_if(first + 52, first + 53, compare, projection); + iter_swap_if(first + 54, first + 55, compare, projection); + iter_swap_if(first + 56, first + 57, compare, projection); + iter_swap_if(first + 58, first + 59, compare, projection); + iter_swap_if(first + 60, first + 61, compare, projection); + iter_swap_if(first + 62, first + 63, compare, projection); + iter_swap_if(first, first + 52, compare, projection); + iter_swap_if(first + 1, first + 2, compare, projection); + iter_swap_if(first + 3, first + 55, compare, projection); + iter_swap_if(first + 4, first + 48, compare, projection); + iter_swap_if(first + 5, first + 6, compare, projection); + iter_swap_if(first + 7, first + 51, compare, projection); + iter_swap_if(first + 8, first + 60, compare, projection); + iter_swap_if(first + 9, first + 10, compare, projection); + iter_swap_if(first + 11, first + 63, compare, projection); + iter_swap_if(first + 12, first + 56, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 59, compare, projection); + iter_swap_if(first + 16, first + 32, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 35, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 28, first + 44, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 47, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 53, first + 54, compare, projection); + iter_swap_if(first + 57, first + 58, compare, projection); + iter_swap_if(first + 61, first + 62, compare, projection); + iter_swap_if(first, first + 20, compare, projection); + iter_swap_if(first + 1, first + 53, compare, projection); + iter_swap_if(first + 2, first + 54, compare, projection); + iter_swap_if(first + 3, first + 23, compare, projection); + iter_swap_if(first + 4, first + 28, compare, projection); + iter_swap_if(first + 5, first + 49, compare, projection); + iter_swap_if(first + 6, first + 50, compare, projection); + iter_swap_if(first + 7, first + 31, compare, projection); + iter_swap_if(first + 8, first + 36, compare, projection); + iter_swap_if(first + 9, first + 61, compare, projection); + iter_swap_if(first + 10, first + 62, compare, projection); + iter_swap_if(first + 11, first + 39, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 57, compare, projection); + iter_swap_if(first + 14, first + 58, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 18, first + 34, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 24, first + 52, compare, projection); + iter_swap_if(first + 27, first + 55, compare, projection); + iter_swap_if(first + 29, first + 45, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 32, first + 56, compare, projection); + iter_swap_if(first + 35, first + 59, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 40, first + 60, compare, projection); + iter_swap_if(first + 43, first + 63, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first, first + 4, compare, projection); + iter_swap_if(first + 1, first + 21, compare, projection); + iter_swap_if(first + 2, first + 22, compare, projection); + iter_swap_if(first + 3, first + 7, compare, projection); + iter_swap_if(first + 5, first + 29, compare, projection); + iter_swap_if(first + 6, first + 30, compare, projection); + iter_swap_if(first + 8, first + 12, compare, projection); + iter_swap_if(first + 9, first + 37, compare, projection); + iter_swap_if(first + 10, first + 38, compare, projection); + iter_swap_if(first + 11, first + 15, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 16, first + 20, compare, projection); + iter_swap_if(first + 19, first + 23, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 25, first + 53, compare, projection); + iter_swap_if(first + 26, first + 54, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 33, first + 57, compare, projection); + iter_swap_if(first + 34, first + 58, compare, projection); + iter_swap_if(first + 40, first + 44, compare, projection); + iter_swap_if(first + 41, first + 61, compare, projection); + iter_swap_if(first + 42, first + 62, compare, projection); + iter_swap_if(first + 43, first + 47, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 48, first + 52, compare, projection); + iter_swap_if(first + 51, first + 55, compare, projection); + iter_swap_if(first + 56, first + 60, compare, projection); + iter_swap_if(first + 59, first + 63, compare, projection); + iter_swap_if(first, first + 8, compare, projection); + iter_swap_if(first + 1, first + 5, compare, projection); + iter_swap_if(first + 2, first + 6, compare, projection); + iter_swap_if(first + 3, first + 11, compare, projection); + iter_swap_if(first + 4, first + 12, compare, projection); + iter_swap_if(first + 7, first + 15, compare, projection); + iter_swap_if(first + 9, first + 13, compare, projection); + iter_swap_if(first + 10, first + 14, compare, projection); + iter_swap_if(first + 16, first + 40, compare, projection); + iter_swap_if(first + 17, first + 21, compare, projection); + iter_swap_if(first + 18, first + 22, compare, projection); + iter_swap_if(first + 19, first + 43, compare, projection); + iter_swap_if(first + 20, first + 44, compare, projection); + iter_swap_if(first + 23, first + 47, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 41, first + 45, compare, projection); + iter_swap_if(first + 42, first + 46, compare, projection); + iter_swap_if(first + 48, first + 56, compare, projection); + iter_swap_if(first + 49, first + 53, compare, projection); + iter_swap_if(first + 50, first + 54, compare, projection); + iter_swap_if(first + 51, first + 59, compare, projection); + iter_swap_if(first + 52, first + 60, compare, projection); + iter_swap_if(first + 55, first + 63, compare, projection); + iter_swap_if(first + 57, first + 61, compare, projection); + iter_swap_if(first + 58, first + 62, compare, projection); + iter_swap_if(first + 1, first + 9, compare, projection); + iter_swap_if(first + 2, first + 10, compare, projection); + iter_swap_if(first + 4, first + 8, compare, projection); + iter_swap_if(first + 5, first + 13, compare, projection); + iter_swap_if(first + 6, first + 14, compare, projection); + iter_swap_if(first + 7, first + 11, compare, projection); + iter_swap_if(first + 12, first + 48, compare, projection); + iter_swap_if(first + 15, first + 51, compare, projection); + iter_swap_if(first + 16, first + 24, compare, projection); + iter_swap_if(first + 17, first + 41, compare, projection); + iter_swap_if(first + 18, first + 42, compare, projection); + iter_swap_if(first + 19, first + 27, compare, projection); + iter_swap_if(first + 20, first + 28, compare, projection); + iter_swap_if(first + 21, first + 45, compare, projection); + iter_swap_if(first + 22, first + 46, compare, projection); + iter_swap_if(first + 23, first + 31, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 32, first + 40, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 43, compare, projection); + iter_swap_if(first + 36, first + 44, compare, projection); + iter_swap_if(first + 39, first + 47, compare, projection); + iter_swap_if(first + 49, first + 57, compare, projection); + iter_swap_if(first + 50, first + 58, compare, projection); + iter_swap_if(first + 52, first + 56, compare, projection); + iter_swap_if(first + 53, first + 61, compare, projection); + iter_swap_if(first + 54, first + 62, compare, projection); + iter_swap_if(first + 55, first + 59, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 5, first + 9, compare, projection); + iter_swap_if(first + 6, first + 10, compare, projection); + iter_swap_if(first + 7, first + 19, compare, projection); + iter_swap_if(first + 8, first + 24, compare, projection); + iter_swap_if(first + 11, first + 27, compare, projection); + iter_swap_if(first + 13, first + 49, compare, projection); + iter_swap_if(first + 14, first + 50, compare, projection); + iter_swap_if(first + 17, first + 25, compare, projection); + iter_swap_if(first + 18, first + 26, compare, projection); + iter_swap_if(first + 20, first + 32, compare, projection); + iter_swap_if(first + 21, first + 29, compare, projection); + iter_swap_if(first + 22, first + 30, compare, projection); + iter_swap_if(first + 23, first + 35, compare, projection); + iter_swap_if(first + 28, first + 40, compare, projection); + iter_swap_if(first + 31, first + 43, compare, projection); + iter_swap_if(first + 33, first + 41, compare, projection); + iter_swap_if(first + 34, first + 42, compare, projection); + iter_swap_if(first + 36, first + 52, compare, projection); + iter_swap_if(first + 37, first + 45, compare, projection); + iter_swap_if(first + 38, first + 46, compare, projection); + iter_swap_if(first + 39, first + 55, compare, projection); + iter_swap_if(first + 44, first + 56, compare, projection); + iter_swap_if(first + 47, first + 59, compare, projection); + iter_swap_if(first + 53, first + 57, compare, projection); + iter_swap_if(first + 54, first + 58, compare, projection); + iter_swap_if(first + 1, first + 4, compare, projection); + iter_swap_if(first + 5, first + 17, compare, projection); + iter_swap_if(first + 6, first + 18, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 9, first + 25, compare, projection); + iter_swap_if(first + 10, first + 26, compare, projection); + iter_swap_if(first + 11, first + 19, compare, projection); + iter_swap_if(first + 12, first + 24, compare, projection); + iter_swap_if(first + 15, first + 27, compare, projection); + iter_swap_if(first + 21, first + 33, compare, projection); + iter_swap_if(first + 22, first + 34, compare, projection); + iter_swap_if(first + 29, first + 41, compare, projection); + iter_swap_if(first + 30, first + 42, compare, projection); + iter_swap_if(first + 36, first + 48, compare, projection); + iter_swap_if(first + 37, first + 53, compare, projection); + iter_swap_if(first + 38, first + 54, compare, projection); + iter_swap_if(first + 39, first + 51, compare, projection); + iter_swap_if(first + 44, first + 52, compare, projection); + iter_swap_if(first + 45, first + 57, compare, projection); + iter_swap_if(first + 46, first + 58, compare, projection); + iter_swap_if(first + 47, first + 55, compare, projection); + iter_swap_if(first + 59, first + 62, compare, projection); + iter_swap_if(first + 2, first + 8, compare, projection); + iter_swap_if(first + 9, first + 17, compare, projection); + iter_swap_if(first + 10, first + 18, compare, projection); + iter_swap_if(first + 12, first + 20, compare, projection); + iter_swap_if(first + 13, first + 25, compare, projection); + iter_swap_if(first + 14, first + 26, compare, projection); + iter_swap_if(first + 15, first + 23, compare, projection); + iter_swap_if(first + 24, first + 32, compare, projection); + iter_swap_if(first + 27, first + 35, compare, projection); + iter_swap_if(first + 28, first + 36, compare, projection); + iter_swap_if(first + 31, first + 39, compare, projection); + iter_swap_if(first + 37, first + 49, compare, projection); + iter_swap_if(first + 38, first + 50, compare, projection); + iter_swap_if(first + 40, first + 48, compare, projection); + iter_swap_if(first + 43, first + 51, compare, projection); + iter_swap_if(first + 45, first + 53, compare, projection); + iter_swap_if(first + 46, first + 54, compare, projection); + iter_swap_if(first + 55, first + 61, compare, projection); + iter_swap_if(first + 2, first + 4, compare, projection); + iter_swap_if(first + 12, first + 16, compare, projection); + iter_swap_if(first + 13, first + 21, compare, projection); + iter_swap_if(first + 14, first + 22, compare, projection); + iter_swap_if(first + 15, first + 19, compare, projection); + iter_swap_if(first + 20, first + 24, compare, projection); + iter_swap_if(first + 23, first + 27, compare, projection); + iter_swap_if(first + 25, first + 33, compare, projection); + iter_swap_if(first + 26, first + 34, compare, projection); + iter_swap_if(first + 28, first + 32, compare, projection); + iter_swap_if(first + 29, first + 37, compare, projection); + iter_swap_if(first + 30, first + 38, compare, projection); + iter_swap_if(first + 31, first + 35, compare, projection); + iter_swap_if(first + 36, first + 40, compare, projection); + iter_swap_if(first + 39, first + 43, compare, projection); + iter_swap_if(first + 41, first + 49, compare, projection); + iter_swap_if(first + 42, first + 50, compare, projection); + iter_swap_if(first + 44, first + 48, compare, projection); + iter_swap_if(first + 47, first + 51, compare, projection); + iter_swap_if(first + 59, first + 61, compare, projection); + iter_swap_if(first + 4, first + 16, compare, projection); + iter_swap_if(first + 5, first + 20, compare, projection); + iter_swap_if(first + 10, first + 40, compare, projection); + iter_swap_if(first + 13, first + 17, compare, projection); + iter_swap_if(first + 14, first + 18, compare, projection); + iter_swap_if(first + 21, first + 25, compare, projection); + iter_swap_if(first + 22, first + 26, compare, projection); + iter_swap_if(first + 23, first + 53, compare, projection); + iter_swap_if(first + 24, first + 28, compare, projection); + iter_swap_if(first + 27, first + 31, compare, projection); + iter_swap_if(first + 29, first + 33, compare, projection); + iter_swap_if(first + 30, first + 34, compare, projection); + iter_swap_if(first + 32, first + 36, compare, projection); + iter_swap_if(first + 35, first + 39, compare, projection); + iter_swap_if(first + 37, first + 41, compare, projection); + iter_swap_if(first + 38, first + 42, compare, projection); + iter_swap_if(first + 43, first + 58, compare, projection); + iter_swap_if(first + 45, first + 49, compare, projection); + iter_swap_if(first + 46, first + 50, compare, projection); + iter_swap_if(first + 47, first + 59, compare, projection); + iter_swap_if(first + 3, first + 17, compare, projection); + iter_swap_if(first + 6, first + 36, compare, projection); + iter_swap_if(first + 7, first + 21, compare, projection); + iter_swap_if(first + 8, first + 32, compare, projection); + iter_swap_if(first + 9, first + 24, compare, projection); + iter_swap_if(first + 11, first + 41, compare, projection); + iter_swap_if(first + 13, first + 28, compare, projection); + iter_swap_if(first + 14, first + 44, compare, projection); + iter_swap_if(first + 15, first + 45, compare, projection); + iter_swap_if(first + 18, first + 48, compare, projection); + iter_swap_if(first + 19, first + 49, compare, projection); + iter_swap_if(first + 22, first + 52, compare, projection); + iter_swap_if(first + 25, first + 29, compare, projection); + iter_swap_if(first + 26, first + 30, compare, projection); + iter_swap_if(first + 27, first + 57, compare, projection); + iter_swap_if(first + 31, first + 55, compare, projection); + iter_swap_if(first + 33, first + 37, compare, projection); + iter_swap_if(first + 34, first + 38, compare, projection); + iter_swap_if(first + 35, first + 50, compare, projection); + iter_swap_if(first + 39, first + 54, compare, projection); + iter_swap_if(first + 42, first + 56, compare, projection); + iter_swap_if(first + 46, first + 60, compare, projection); + iter_swap_if(first + 6, first + 20, compare, projection); + iter_swap_if(first + 8, first + 16, compare, projection); + iter_swap_if(first + 10, first + 24, compare, projection); + iter_swap_if(first + 11, first + 25, compare, projection); + iter_swap_if(first + 14, first + 28, compare, projection); + iter_swap_if(first + 15, first + 29, compare, projection); + iter_swap_if(first + 17, first + 33, compare, projection); + iter_swap_if(first + 18, first + 32, compare, projection); + iter_swap_if(first + 21, first + 37, compare, projection); + iter_swap_if(first + 22, first + 36, compare, projection); + iter_swap_if(first + 26, first + 42, compare, projection); + iter_swap_if(first + 27, first + 41, compare, projection); + iter_swap_if(first + 30, first + 46, compare, projection); + iter_swap_if(first + 31, first + 45, compare, projection); + iter_swap_if(first + 34, first + 48, compare, projection); + iter_swap_if(first + 35, first + 49, compare, projection); + iter_swap_if(first + 38, first + 52, compare, projection); + iter_swap_if(first + 39, first + 53, compare, projection); + iter_swap_if(first + 43, first + 57, compare, projection); + iter_swap_if(first + 47, first + 55, compare, projection); + iter_swap_if(first + 3, first + 18, compare, projection); + iter_swap_if(first + 5, first + 8, compare, projection); + iter_swap_if(first + 6, first + 12, compare, projection); + iter_swap_if(first + 7, first + 22, compare, projection); + iter_swap_if(first + 15, first + 21, compare, projection); + iter_swap_if(first + 17, first + 32, compare, projection); + iter_swap_if(first + 19, first + 33, compare, projection); + iter_swap_if(first + 23, first + 37, compare, projection); + iter_swap_if(first + 26, first + 40, compare, projection); + iter_swap_if(first + 30, first + 44, compare, projection); + iter_swap_if(first + 31, first + 46, compare, projection); + iter_swap_if(first + 41, first + 56, compare, projection); + iter_swap_if(first + 42, first + 48, compare, projection); + iter_swap_if(first + 45, first + 60, compare, projection); + iter_swap_if(first + 51, first + 57, compare, projection); + iter_swap_if(first + 55, first + 58, compare, projection); + iter_swap_if(first + 3, first + 16, compare, projection); + iter_swap_if(first + 7, first + 20, compare, projection); + iter_swap_if(first + 11, first + 26, compare, projection); + iter_swap_if(first + 18, first + 24, compare, projection); + iter_swap_if(first + 19, first + 25, compare, projection); + iter_swap_if(first + 22, first + 28, compare, projection); + iter_swap_if(first + 23, first + 29, compare, projection); + iter_swap_if(first + 27, first + 33, compare, projection); + iter_swap_if(first + 30, first + 36, compare, projection); + iter_swap_if(first + 34, first + 40, compare, projection); + iter_swap_if(first + 35, first + 41, compare, projection); + iter_swap_if(first + 37, first + 52, compare, projection); + iter_swap_if(first + 38, first + 44, compare, projection); + iter_swap_if(first + 39, first + 45, compare, projection); + iter_swap_if(first + 43, first + 56, compare, projection); + iter_swap_if(first + 47, first + 60, compare, projection); + iter_swap_if(first + 3, first + 9, compare, projection); + iter_swap_if(first + 7, first + 13, compare, projection); + iter_swap_if(first + 10, first + 16, compare, projection); + iter_swap_if(first + 11, first + 17, compare, projection); + iter_swap_if(first + 14, first + 20, compare, projection); + iter_swap_if(first + 15, first + 30, compare, projection); + iter_swap_if(first + 19, first + 34, compare, projection); + iter_swap_if(first + 21, first + 36, compare, projection); + iter_swap_if(first + 23, first + 38, compare, projection); + iter_swap_if(first + 25, first + 40, compare, projection); + iter_swap_if(first + 26, first + 32, compare, projection); + iter_swap_if(first + 27, first + 42, compare, projection); + iter_swap_if(first + 29, first + 44, compare, projection); + iter_swap_if(first + 31, first + 37, compare, projection); + iter_swap_if(first + 33, first + 48, compare, projection); + iter_swap_if(first + 43, first + 49, compare, projection); + iter_swap_if(first + 46, first + 52, compare, projection); + iter_swap_if(first + 47, first + 53, compare, projection); + iter_swap_if(first + 50, first + 56, compare, projection); + iter_swap_if(first + 54, first + 60, compare, projection); + iter_swap_if(first + 3, first + 8, compare, projection); + iter_swap_if(first + 7, first + 10, compare, projection); + iter_swap_if(first + 9, first + 12, compare, projection); + iter_swap_if(first + 11, first + 18, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 24, compare, projection); + iter_swap_if(first + 17, first + 22, compare, projection); + iter_swap_if(first + 19, first + 28, compare, projection); + iter_swap_if(first + 21, first + 26, compare, projection); + iter_swap_if(first + 23, first + 25, compare, projection); + iter_swap_if(first + 27, first + 34, compare, projection); + iter_swap_if(first + 29, first + 36, compare, projection); + iter_swap_if(first + 30, first + 32, compare, projection); + iter_swap_if(first + 31, first + 33, compare, projection); + iter_swap_if(first + 35, first + 44, compare, projection); + iter_swap_if(first + 37, first + 42, compare, projection); + iter_swap_if(first + 38, first + 40, compare, projection); + iter_swap_if(first + 39, first + 48, compare, projection); + iter_swap_if(first + 41, first + 46, compare, projection); + iter_swap_if(first + 45, first + 52, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 54, compare, projection); + iter_swap_if(first + 53, first + 56, compare, projection); + iter_swap_if(first + 55, first + 60, compare, projection); + iter_swap_if(first + 3, first + 6, compare, projection); + iter_swap_if(first + 7, first + 12, compare, projection); + iter_swap_if(first + 11, first + 16, compare, projection); + iter_swap_if(first + 15, first + 17, compare, projection); + iter_swap_if(first + 18, first + 20, compare, projection); + iter_swap_if(first + 19, first + 24, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 30, compare, projection); + iter_swap_if(first + 25, first + 32, compare, projection); + iter_swap_if(first + 26, first + 28, compare, projection); + iter_swap_if(first + 27, first + 29, compare, projection); + iter_swap_if(first + 31, first + 38, compare, projection); + iter_swap_if(first + 33, first + 40, compare, projection); + iter_swap_if(first + 34, first + 36, compare, projection); + iter_swap_if(first + 35, first + 37, compare, projection); + iter_swap_if(first + 39, first + 44, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 45, compare, projection); + iter_swap_if(first + 46, first + 48, compare, projection); + iter_swap_if(first + 47, first + 52, compare, projection); + iter_swap_if(first + 51, first + 56, compare, projection); + iter_swap_if(first + 57, first + 60, compare, projection); + iter_swap_if(first + 3, first + 5, compare, projection); + iter_swap_if(first + 6, first + 8, compare, projection); + iter_swap_if(first + 7, first + 9, compare, projection); + iter_swap_if(first + 10, first + 12, compare, projection); + iter_swap_if(first + 11, first + 13, compare, projection); + iter_swap_if(first + 14, first + 16, compare, projection); + iter_swap_if(first + 15, first + 18, compare, projection); + iter_swap_if(first + 17, first + 20, compare, projection); + iter_swap_if(first + 19, first + 21, compare, projection); + iter_swap_if(first + 22, first + 24, compare, projection); + iter_swap_if(first + 23, first + 26, compare, projection); + iter_swap_if(first + 25, first + 28, compare, projection); + iter_swap_if(first + 27, first + 30, compare, projection); + iter_swap_if(first + 29, first + 32, compare, projection); + iter_swap_if(first + 31, first + 34, compare, projection); + iter_swap_if(first + 33, first + 36, compare, projection); + iter_swap_if(first + 35, first + 38, compare, projection); + iter_swap_if(first + 37, first + 40, compare, projection); + iter_swap_if(first + 39, first + 41, compare, projection); + iter_swap_if(first + 42, first + 44, compare, projection); + iter_swap_if(first + 43, first + 46, compare, projection); + iter_swap_if(first + 45, first + 48, compare, projection); + iter_swap_if(first + 47, first + 49, compare, projection); + iter_swap_if(first + 50, first + 52, compare, projection); + iter_swap_if(first + 51, first + 53, compare, projection); + iter_swap_if(first + 54, first + 56, compare, projection); + iter_swap_if(first + 55, first + 57, compare, projection); + iter_swap_if(first + 58, first + 60, compare, projection); + iter_swap_if(first + 3, first + 4, compare, projection); + iter_swap_if(first + 7, first + 8, compare, projection); + iter_swap_if(first + 11, first + 12, compare, projection); + iter_swap_if(first + 13, first + 14, compare, projection); + iter_swap_if(first + 15, first + 16, compare, projection); + iter_swap_if(first + 17, first + 18, compare, projection); + iter_swap_if(first + 19, first + 20, compare, projection); + iter_swap_if(first + 21, first + 22, compare, projection); + iter_swap_if(first + 23, first + 24, compare, projection); + iter_swap_if(first + 25, first + 26, compare, projection); + iter_swap_if(first + 27, first + 28, compare, projection); + iter_swap_if(first + 29, first + 30, compare, projection); + iter_swap_if(first + 31, first + 32, compare, projection); + iter_swap_if(first + 33, first + 34, compare, projection); + iter_swap_if(first + 35, first + 36, compare, projection); + iter_swap_if(first + 37, first + 38, compare, projection); + iter_swap_if(first + 39, first + 40, compare, projection); + iter_swap_if(first + 41, first + 42, compare, projection); + iter_swap_if(first + 43, first + 44, compare, projection); + iter_swap_if(first + 45, first + 46, compare, projection); + iter_swap_if(first + 47, first + 48, compare, projection); + iter_swap_if(first + 49, first + 50, compare, projection); + iter_swap_if(first + 51, first + 52, compare, projection); + iter_swap_if(first + 55, first + 56, compare, projection); + iter_swap_if(first + 59, first + 60, compare, projection); + } + + template + CPPSORT_ATTRIBUTE_NODISCARD + static constexpr auto index_pairs() noexcept + -> std::array, 521> + { + return {{ + {0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31}, {32, 34}, {33, 35}, {36, 38}, {37, 39}, {40, 42}, {41, 43}, {44, 46}, {45, 47}, {48, 50}, {49, 51}, {52, 54}, {53, 55}, {56, 58}, {57, 59}, {60, 62}, {61, 63}, + {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 47}, {48, 49}, {50, 51}, {52, 53}, {54, 55}, {56, 57}, {58, 59}, {60, 61}, {62, 63}, + {0, 52}, {1, 2}, {3, 55}, {4, 48}, {5, 6}, {7, 51}, {8, 60}, {9, 10}, {11, 63}, {12, 56}, {13, 14}, {15, 59}, {16, 32}, {17, 18}, {19, 35}, {20, 24}, {21, 22}, {23, 27}, {25, 26}, {28, 44}, {29, 30}, {31, 47}, {33, 34}, {36, 40}, {37, 38}, {39, 43}, {41, 42}, {45, 46}, {49, 50}, {53, 54}, {57, 58}, {61, 62}, + {0, 20}, {1, 53}, {2, 54}, {3, 23}, {4, 28}, {5, 49}, {6, 50}, {7, 31}, {8, 36}, {9, 61}, {10, 62}, {11, 39}, {12, 16}, {13, 57}, {14, 58}, {15, 19}, {17, 33}, {18, 34}, {21, 25}, {22, 26}, {24, 52}, {27, 55}, {29, 45}, {30, 46}, {32, 56}, {35, 59}, {37, 41}, {38, 42}, {40, 60}, {43, 63}, {44, 48}, {47, 51}, + {0, 4}, {1, 21}, {2, 22}, {3, 7}, {5, 29}, {6, 30}, {8, 12}, {9, 37}, {10, 38}, {11, 15}, {13, 17}, {14, 18}, {16, 20}, {19, 23}, {24, 32}, {25, 53}, {26, 54}, {27, 35}, {28, 36}, {31, 39}, {33, 57}, {34, 58}, {40, 44}, {41, 61}, {42, 62}, {43, 47}, {45, 49}, {46, 50}, {48, 52}, {51, 55}, {56, 60}, {59, 63}, + {0, 8}, {1, 5}, {2, 6}, {3, 11}, {4, 12}, {7, 15}, {9, 13}, {10, 14}, {16, 40}, {17, 21}, {18, 22}, {19, 43}, {20, 44}, {23, 47}, {24, 28}, {25, 33}, {26, 34}, {27, 31}, {29, 37}, {30, 38}, {32, 36}, {35, 39}, {41, 45}, {42, 46}, {48, 56}, {49, 53}, {50, 54}, {51, 59}, {52, 60}, {55, 63}, {57, 61}, {58, 62}, + {1, 9}, {2, 10}, {4, 8}, {5, 13}, {6, 14}, {7, 11}, {12, 48}, {15, 51}, {16, 24}, {17, 41}, {18, 42}, {19, 27}, {20, 28}, {21, 45}, {22, 46}, {23, 31}, {25, 29}, {26, 30}, {32, 40}, {33, 37}, {34, 38}, {35, 43}, {36, 44}, {39, 47}, {49, 57}, {50, 58}, {52, 56}, {53, 61}, {54, 62}, {55, 59}, + {4, 16}, {5, 9}, {6, 10}, {7, 19}, {8, 24}, {11, 27}, {13, 49}, {14, 50}, {17, 25}, {18, 26}, {20, 32}, {21, 29}, {22, 30}, {23, 35}, {28, 40}, {31, 43}, {33, 41}, {34, 42}, {36, 52}, {37, 45}, {38, 46}, {39, 55}, {44, 56}, {47, 59}, {53, 57}, {54, 58}, + {1, 4}, {5, 17}, {6, 18}, {8, 16}, {9, 25}, {10, 26}, {11, 19}, {12, 24}, {15, 27}, {21, 33}, {22, 34}, {29, 41}, {30, 42}, {36, 48}, {37, 53}, {38, 54}, {39, 51}, {44, 52}, {45, 57}, {46, 58}, {47, 55}, {59, 62}, + {2, 8}, {9, 17}, {10, 18}, {12, 20}, {13, 25}, {14, 26}, {15, 23}, {24, 32}, {27, 35}, {28, 36}, {31, 39}, {37, 49}, {38, 50}, {40, 48}, {43, 51}, {45, 53}, {46, 54}, {55, 61}, + {2, 4}, {12, 16}, {13, 21}, {14, 22}, {15, 19}, {20, 24}, {23, 27}, {25, 33}, {26, 34}, {28, 32}, {29, 37}, {30, 38}, {31, 35}, {36, 40}, {39, 43}, {41, 49}, {42, 50}, {44, 48}, {47, 51}, {59, 61}, + {4, 16}, {5, 20}, {10, 40}, {13, 17}, {14, 18}, {21, 25}, {22, 26}, {23, 53}, {24, 28}, {27, 31}, {29, 33}, {30, 34}, {32, 36}, {35, 39}, {37, 41}, {38, 42}, {43, 58}, {45, 49}, {46, 50}, {47, 59}, + {3, 17}, {6, 36}, {7, 21}, {8, 32}, {9, 24}, {11, 41}, {13, 28}, {14, 44}, {15, 45}, {18, 48}, {19, 49}, {22, 52}, {25, 29}, {26, 30}, {27, 57}, {31, 55}, {33, 37}, {34, 38}, {35, 50}, {39, 54}, {42, 56}, {46, 60}, + {6, 20}, {8, 16}, {10, 24}, {11, 25}, {14, 28}, {15, 29}, {17, 33}, {18, 32}, {21, 37}, {22, 36}, {26, 42}, {27, 41}, {30, 46}, {31, 45}, {34, 48}, {35, 49}, {38, 52}, {39, 53}, {43, 57}, {47, 55}, + {3, 18}, {5, 8}, {6, 12}, {7, 22}, {15, 21}, {17, 32}, {19, 33}, {23, 37}, {26, 40}, {30, 44}, {31, 46}, {41, 56}, {42, 48}, {45, 60}, {51, 57}, {55, 58}, + {3, 16}, {7, 20}, {11, 26}, {18, 24}, {19, 25}, {22, 28}, {23, 29}, {27, 33}, {30, 36}, {34, 40}, {35, 41}, {37, 52}, {38, 44}, {39, 45}, {43, 56}, {47, 60}, + {3, 9}, {7, 13}, {10, 16}, {11, 17}, {14, 20}, {15, 30}, {19, 34}, {21, 36}, {23, 38}, {25, 40}, {26, 32}, {27, 42}, {29, 44}, {31, 37}, {33, 48}, {43, 49}, {46, 52}, {47, 53}, {50, 56}, {54, 60}, + {3, 8}, {7, 10}, {9, 12}, {11, 18}, {13, 14}, {15, 24}, {17, 22}, {19, 28}, {21, 26}, {23, 25}, {27, 34}, {29, 36}, {30, 32}, {31, 33}, {35, 44}, {37, 42}, {38, 40}, {39, 48}, {41, 46}, {45, 52}, {49, 50}, {51, 54}, {53, 56}, {55, 60}, + {3, 6}, {7, 12}, {11, 16}, {15, 17}, {18, 20}, {19, 24}, {21, 22}, {23, 30}, {25, 32}, {26, 28}, {27, 29}, {31, 38}, {33, 40}, {34, 36}, {35, 37}, {39, 44}, {41, 42}, {43, 45}, {46, 48}, {47, 52}, {51, 56}, {57, 60}, + {3, 5}, {6, 8}, {7, 9}, {10, 12}, {11, 13}, {14, 16}, {15, 18}, {17, 20}, {19, 21}, {22, 24}, {23, 26}, {25, 28}, {27, 30}, {29, 32}, {31, 34}, {33, 36}, {35, 38}, {37, 40}, {39, 41}, {42, 44}, {43, 46}, {45, 48}, {47, 49}, {50, 52}, {51, 53}, {54, 56}, {55, 57}, {58, 60}, + {3, 4}, {7, 8}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28}, {29, 30}, {31, 32}, {33, 34}, {35, 36}, {37, 38}, {39, 40}, {41, 42}, {43, 44}, {45, 46}, {47, 48}, {49, 50}, {51, 52}, {55, 56}, {59, 60}, + }}; + } + }; +}} + +#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT64_H_ diff --git a/include/cpp-sort/detail/sorting_network/sort7.h b/include/cpp-sort/detail/sorting_network/sort7.h index 139127c3..e97d1c06 100644 --- a/include/cpp-sort/detail/sorting_network/sort7.h +++ b/include/cpp-sort/detail/sorting_network/sort7.h @@ -44,7 +44,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 16> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort8.h b/include/cpp-sort/detail/sorting_network/sort8.h index 492a8b28..e86244f0 100644 --- a/include/cpp-sort/detail/sorting_network/sort8.h +++ b/include/cpp-sort/detail/sorting_network/sort8.h @@ -47,7 +47,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 19> { return {{ diff --git a/include/cpp-sort/detail/sorting_network/sort9.h b/include/cpp-sort/detail/sorting_network/sort9.h index eb03cc4f..24996f37 100644 --- a/include/cpp-sort/detail/sorting_network/sort9.h +++ b/include/cpp-sort/detail/sorting_network/sort9.h @@ -53,7 +53,7 @@ namespace detail template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, 25> { return {{ diff --git a/include/cpp-sort/detail/splaysort.h b/include/cpp-sort/detail/splaysort.h new file mode 100644 index 00000000..c9defb15 --- /dev/null +++ b/include/cpp-sort/detail/splaysort.h @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2022 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_DETAIL_SPLAYSORT_H_ +#define CPPSORT_DETAIL_SPLAYSORT_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include "binary_tree.h" +#include "config.h" +#include "immovable_vector.h" +#include "iterator_traits.h" + +namespace cppsort +{ +namespace detail +{ + struct splay_tree_base + { + public: + + constexpr splay_tree_base() noexcept: + sentinel_node_(nullptr, nullptr, nullptr) + {} + + auto rotate_left(binary_tree_node_base* node) noexcept + -> void + { + auto parent = node->parent; + auto grand_parent = parent->parent; + parent->right_child = std::exchange(node->left_child, parent); + // Unconditional backlink thanks to the sentinel node + parent->right_child->parent = parent; + node->parent = std::exchange(parent->parent, node); + + if (grand_parent->left_child == parent) { + grand_parent->left_child = node; + } else { + // This branch should always be taken when grand_parent + // is the sentinel node + grand_parent->right_child = node; + } + } + + auto rotate_right(binary_tree_node_base* node) noexcept + -> void + { + auto parent = node->parent; + auto grand_parent = parent->parent; + parent->left_child = std::exchange(node->right_child, parent); + // Unconditional backlink thanks to the sentinel node + parent->left_child->parent = parent; + node->parent = std::exchange(parent->parent, node); + + if (grand_parent->left_child == parent) { + grand_parent->left_child = node; + } else { + // This branch should always be taken when grand_parent + // is the sentinel node + grand_parent->right_child = node; + } + } + + auto splay(binary_tree_node_base* node) noexcept + -> void + { + // Note: we don't store a root here, so this splay + // operation does not reassign the root + + auto parent = node->parent; + CPPSORT_ASSERT(parent != &sentinel_node_); + do { + auto grand_parent = parent->parent; + if (grand_parent == &sentinel_node_) { + if (node == parent->left_child) { + // zig + rotate_right(node); + } else { + // zag + rotate_left(node); + } + } else { + if (parent == grand_parent->left_child) { + if (node == parent->left_child) { + // zig-zig + rotate_right(parent); + rotate_right(node); + } else { + // zig-zag + rotate_left(node); + rotate_right(node); + } + } else { + if (node == parent->left_child) { + // zag-zig + rotate_right(node); + rotate_left(node); + } else { + // zag-zag + rotate_left(parent); + rotate_left(node); + } + } + } + parent = node->parent; + } while (parent != &sentinel_node_); + } + + protected: + + // Sentinel node: it doesn't matter where it point to, this + // node only exists to reduce branching in some operations + binary_tree_node_base sentinel_node_; + }; + + template + struct splay_tree: + splay_tree_base + { + public: + + //////////////////////////////////////////////////////////// + // Public types + + using difference_type = std::ptrdiff_t; + using node_type = binary_tree_node; + + //////////////////////////////////////////////////////////// + // Constructor + + template + explicit splay_tree(ForwardIterator first, ForwardIterator last, + difference_type_t size, + Compare compare, Projection projection): + splay_tree_base(), + buffer_(size), + root_(buffer_.begin()) // Original root is first element + { + using utility::iter_move; + + // Create the first node + buffer_.emplace_back(iter_move(first), &sentinel_node_, &sentinel_node_, &sentinel_node_); + // Advance to the next element + ++first; + + for (; first != last; ++first) { + insert(first, compare, projection); + } + } + + //////////////////////////////////////////////////////////// + // Accessors + + auto root() const noexcept + -> node_type* + { + return root_; + } + + //////////////////////////////////////////////////////////// + // Destroying move + + template + auto move_to(OutputIterator out) + -> void + { + binary_tree_node_base* curr = root(); + while (curr->left_child != &sentinel_node_) { + curr = curr->left_child; + } + *out = std::move(static_cast(curr)->value); + ++out; + + while (true) { + if (curr->right_child != &sentinel_node_) { + auto prev = std::exchange(curr, curr->right_child); + curr->parent = prev->parent; + prev->right_child = &sentinel_node_; + while (curr->left_child != &sentinel_node_) { + curr = curr->left_child; + } + } else if (curr->parent != &sentinel_node_) { + curr = curr->parent; + } else { + return; + } + + *out = std::move(static_cast(curr)->value); + ++out; + } + } + + private: + + //////////////////////////////////////////////////////////// + // Helper functions + + template + auto insert(ForwardIterator it, Compare compare, Projection projection) + -> void + { + using utility::iter_move; + auto&& comp = utility::as_function(compare); + auto&& proj = utility::as_function(projection); + + auto&& value_proj = proj(*it); + + binary_tree_node_base* node = root(); + CPPSORT_ASSERT(node != &sentinel_node_); + while (true) { + if (comp(value_proj, proj(static_cast(node)->value))) { + if (node->left_child == &sentinel_node_) { + node->left_child = buffer_.emplace_back(iter_move(it), node, &sentinel_node_, &sentinel_node_); + splay(node->left_child); + break; + } + node = node->left_child; + } else { + if (node->right_child == &sentinel_node_) { + node->right_child = buffer_.emplace_back(iter_move(it), node, &sentinel_node_, &sentinel_node_); + splay(node->right_child); + break; + } + node = node->right_child; + } + } + } + + auto splay(binary_tree_node_base* node) noexcept + -> void + { + splay_tree_base::splay(node); + root_ = static_cast(node); + } + + //////////////////////////////////////////////////////////// + // Data members + + // Backing storage + immovable_vector buffer_; + + // Root of the splay tree + node_type* root_; + }; + + template + auto splaysort(ForwardIterator first, ForwardIterator last, + difference_type_t size, + Compare compare, Projection projection) + -> void + { + if (size < 2) { + return; + } + + using rvalue_type = rvalue_type_t; + splay_tree tree( + first, last, size, + std::move(compare), std::move(projection) + ); + + tree.move_to(first); + } +}} + +#endif // CPPSORT_DETAIL_SPLAYSORT_H_ diff --git a/include/cpp-sort/detail/stable_adapter_hybrid_adapter.h b/include/cpp-sort/detail/stable_adapter_hybrid_adapter.h index e938780c..fa8c003e 100644 --- a/include/cpp-sort/detail/stable_adapter_hybrid_adapter.h +++ b/include/cpp-sort/detail/stable_adapter_hybrid_adapter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 Morwenn + * Copyright (c) 2018-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_STABLE_ADAPTER_HYBRID_ADAPTER_H_ @@ -23,7 +23,7 @@ namespace cppsort template constexpr explicit stable_adapter(std::index_sequence, hybrid_adapter&& sorters): hybrid_adapter...>( - (stable_t(std::move(sorters).template get()))... + (stable_t(std::move(sorters).template get()))... ) {} @@ -42,7 +42,6 @@ namespace cppsort // Sorter traits using is_always_stable = std::true_type; - using type = hybrid_adapter...>; }; } diff --git a/include/cpp-sort/detail/timsort.h b/include/cpp-sort/detail/timsort.h index 5cc25697..790cc457 100644 --- a/include/cpp-sort/detail/timsort.h +++ b/include/cpp-sort/detail/timsort.h @@ -6,7 +6,7 @@ * - http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/raw_files/new/src/share/classes/java/util/TimSort.java * * Copyright (c) 2011 Fuji, Goro (gfx) . - * Copyright (c) 2015-2022 Morwenn. + * Copyright (c) 2015-2023 Morwenn. * Copyright (c) 2021 Igor Kushnir . * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -565,7 +565,7 @@ namespace detail dest[len2] = iter_move(cursor1); } else { - CPPSORT_ASSERT(len1 != 0 && "comparison function violates its general contract"); + CPPSORT_ASSERT(len1 != 0, "comparison function violates its general contract"); CPPSORT_ASSERT(len2 == 0); CPPSORT_ASSERT(len1 > 1); detail::move(cursor1, cursor1 + len1, dest); @@ -715,7 +715,7 @@ namespace detail detail::move_backward(cursor1 - len1, cursor1, dest + (1 + len1)); *dest = iter_move(cursor2); } else { - CPPSORT_ASSERT(len2 != 0 && "comparison function violates its general contract"); + CPPSORT_ASSERT(len2 != 0, "comparison function violates its general contract"); CPPSORT_ASSERT(len1 == 0); CPPSORT_ASSERT(len2 > 1); detail::move(buffer.get(), buffer.get() + len2, dest - (len2 - 1)); diff --git a/include/cpp-sort/detail/type_traits.h b/include/cpp-sort/detail/type_traits.h index 2ecac240..ad4e3021 100644 --- a/include/cpp-sort/detail/type_traits.h +++ b/include/cpp-sort/detail/type_traits.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2022 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_TYPE_TRAITS_H_ @@ -357,6 +357,35 @@ namespace detail template constexpr bool is_in_pack = false; + + //////////////////////////////////////////////////////////// + // index_of: return the index of the first occurence of a + // type in a list of type, or -1 if the type is not in the + // list + + template + struct index_of_impl; + + template + struct index_of_impl + { + static constexpr int value = -1; + }; + + template + struct index_of_impl + { + static constexpr int value = 0; + }; + + template + struct index_of_impl + { + static constexpr int value = index_of_impl::value + 1; + }; + + template + constexpr int index_of = index_of_impl::value; }} #endif // CPPSORT_DETAIL_TYPE_TRAITS_H_ diff --git a/include/cpp-sort/detail/vergesort.h b/include/cpp-sort/detail/vergesort.h index 934dc64d..ebd560ea 100644 --- a/include/cpp-sort/detail/vergesort.h +++ b/include/cpp-sort/detail/vergesort.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2022 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_DETAIL_VERGESORT_H_ @@ -12,8 +12,6 @@ #include #include #include -#include -#include #include #include "bitops.h" #include "config.h" @@ -23,7 +21,7 @@ #include "merge_sort.h" #include "reverse.h" #include "rotate.h" -#include "sized_iterator.h" +#include "sized_range.h" #include "upper_bound.h" namespace cppsort @@ -110,8 +108,7 @@ namespace verge { if (size < 128) { // vergesort is inefficient for small collections - fallback(make_sized_iterator(first, size), - make_sized_iterator(last, size), + fallback(make_sized_range(first, last, size), std::move(compare), std::move(projection)); return; } @@ -204,8 +201,7 @@ namespace verge if (run_size > minrun_limit) { if (begin_unsorted != last) { - fallback(make_sized_iterator(begin_unsorted, size_unsorted), - make_sized_iterator(begin_rng, size_unsorted), + fallback(make_sized_range(begin_unsorted, begin_rng, size_unsorted), compare, projection); runs.push_back({ begin_rng, size_unsorted} ); runs.push_back({ next, run_size }); @@ -267,8 +263,7 @@ namespace verge if (run_size > minrun_limit) { if (begin_unsorted != last) { - fallback(make_sized_iterator(begin_unsorted, size_unsorted), - make_sized_iterator(begin_rng, size_unsorted), + fallback(make_sized_range(begin_unsorted, begin_rng, size_unsorted), compare, projection); runs.push_back({ begin_rng, size_unsorted }); detail::reverse(begin_rng, next); @@ -311,8 +306,7 @@ namespace verge // next run, so we add one back here to compensate ++size_unsorted; if (size_unsorted > 1) { - fallback(make_sized_iterator(begin_unsorted, size_unsorted), - make_sized_iterator(last, size_unsorted), + fallback(make_sized_range(begin_unsorted, last, size_unsorted), compare, projection); } runs.push_back({ last, size_unsorted }); @@ -536,44 +530,6 @@ namespace verge std::move(compare), std::move(projection), get_maybe_stable(std::integral_constant{}, std::move(fallback))); } - - constexpr auto default_sorter_for_impl(std::bidirectional_iterator_tag) - -> cppsort::quick_merge_sorter - { - return {}; - } - - constexpr auto default_sorter_for_impl(std::random_access_iterator_tag) - -> cppsort::pdq_sorter - { - return {}; - } - - template - constexpr auto default_sorter_for(Iterator) - -> decltype(auto) - { - iterator_category_t category; - return default_sorter_for_impl(category); - } - - template< - bool Stable, - typename BidirectionalIterator, - typename Compare, - typename Projection - > - auto sort(BidirectionalIterator first, BidirectionalIterator last, - difference_type_t size, - Compare compare, Projection projection) - -> void - { - // Pick a default sorter based on the iterator category when - // none is provided - verge::sort(first, last, size, - std::move(compare), std::move(projection), - default_sorter_for(first)); - } }}} #endif // CPPSORT_DETAIL_VERGESORT_H_ diff --git a/include/cpp-sort/fixed/merge_exchange_network_sorter.h b/include/cpp-sort/fixed/merge_exchange_network_sorter.h index 75957bbf..2336db73 100644 --- a/include/cpp-sort/fixed/merge_exchange_network_sorter.h +++ b/include/cpp-sort/fixed/merge_exchange_network_sorter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Morwenn + * Copyright (c) 2021-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_FIXED_MERGE_EXCHANGE_NETWORK_SORTER_H_ @@ -66,7 +66,7 @@ namespace cppsort { template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> auto { constexpr DifferenceType n = N; diff --git a/include/cpp-sort/fixed/odd_even_merge_network_sorter.h b/include/cpp-sort/fixed/odd_even_merge_network_sorter.h index e7f8a128..cf232965 100644 --- a/include/cpp-sort/fixed/odd_even_merge_network_sorter.h +++ b/include/cpp-sort/fixed/odd_even_merge_network_sorter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Morwenn + * Copyright (c) 2021-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_FIXED_ODD_EVEN_MERGE_NETWORK_SORTER_H_ @@ -60,7 +60,7 @@ namespace cppsort { template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> auto { constexpr DifferenceType n = N; diff --git a/include/cpp-sort/fixed/sorting_network_sorter.h b/include/cpp-sort/fixed/sorting_network_sorter.h index 8a9054bf..191ac40c 100644 --- a/include/cpp-sort/fixed/sorting_network_sorter.h +++ b/include/cpp-sort/fixed/sorting_network_sorter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2022 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_FIXED_SORTING_NETWORK_SORTER_H_ @@ -33,12 +33,12 @@ namespace cppsort }; template<> - struct sorting_network_sorter_impl<0u>: + struct sorting_network_sorter_impl<0>: cppsort::detail::empty_network_sorter_impl {}; template<> - struct sorting_network_sorter_impl<1u>: + struct sorting_network_sorter_impl<1>: cppsort::detail::empty_network_sorter_impl {}; } @@ -49,20 +49,32 @@ namespace cppsort {}; //////////////////////////////////////////////////////////// - // Sorter traits + // sorter_traits template struct sorter_traits> { using iterator_category = std::random_access_iterator_tag; - - // Some of the algorithms are stable, others are not, - // the stability *could* be documented depending on which - // fixed-size algorithms are used, but it would be lots of - // work... using is_always_stable = std::false_type; }; + template<> + struct sorter_traits> + { + using iterator_category = std::random_access_iterator_tag; + using is_always_stable = std::true_type; + }; + + template<> + struct sorter_traits> + { + using iterator_category = std::random_access_iterator_tag; + using is_always_stable = std::true_type; + }; + + //////////////////////////////////////////////////////////// + // fixed_sorter_traits + template<> struct fixed_sorter_traits { @@ -81,7 +93,7 @@ namespace cppsort #include "../detail/swap_if.h" #include "../detail/type_traits.h" -// Specializations of sorting_network_sorter for some values of N +// Explicit specializations of sorting_network_sorter #include "../detail/sorting_network/sort2.h" #include "../detail/sorting_network/sort3.h" #include "../detail/sorting_network/sort4.h" @@ -113,5 +125,37 @@ namespace cppsort #include "../detail/sorting_network/sort30.h" #include "../detail/sorting_network/sort31.h" #include "../detail/sorting_network/sort32.h" +#include "../detail/sorting_network/sort33.h" +#include "../detail/sorting_network/sort34.h" +#include "../detail/sorting_network/sort35.h" +#include "../detail/sorting_network/sort36.h" +#include "../detail/sorting_network/sort37.h" +#include "../detail/sorting_network/sort38.h" +#include "../detail/sorting_network/sort39.h" +#include "../detail/sorting_network/sort40.h" +#include "../detail/sorting_network/sort41.h" +#include "../detail/sorting_network/sort42.h" +#include "../detail/sorting_network/sort43.h" +#include "../detail/sorting_network/sort44.h" +#include "../detail/sorting_network/sort45.h" +#include "../detail/sorting_network/sort46.h" +#include "../detail/sorting_network/sort47.h" +#include "../detail/sorting_network/sort48.h" +#include "../detail/sorting_network/sort49.h" +#include "../detail/sorting_network/sort50.h" +#include "../detail/sorting_network/sort51.h" +#include "../detail/sorting_network/sort52.h" +#include "../detail/sorting_network/sort53.h" +#include "../detail/sorting_network/sort54.h" +#include "../detail/sorting_network/sort55.h" +#include "../detail/sorting_network/sort56.h" +#include "../detail/sorting_network/sort57.h" +#include "../detail/sorting_network/sort58.h" +#include "../detail/sorting_network/sort59.h" +#include "../detail/sorting_network/sort60.h" +#include "../detail/sorting_network/sort61.h" +#include "../detail/sorting_network/sort62.h" +#include "../detail/sorting_network/sort63.h" +#include "../detail/sorting_network/sort64.h" #endif // CPPSORT_FIXED_SORTING_NETWORK_SORTER_H_ diff --git a/include/cpp-sort/fwd.h b/include/cpp-sort/fwd.h index ee35465a..e6f51ff8 100644 --- a/include/cpp-sort/fwd.h +++ b/include/cpp-sort/fwd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2022 Morwenn + * Copyright (c) 2016-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_FWD_H_ @@ -8,18 +8,16 @@ //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// +#include #include namespace cppsort { - // - // This header contains forward declarations for - // every sorter and sorter adapter in the library, - // which helps to specialize some of the adapters - // or to provide information about some sorters - // without actually having to include the whole - // thing - // + // This header contains forward declarations for every + // sorter and sorter adapter in the library, which helps + // to specialize some of the adapters or to provide + // information about some sorters without actually having + // to include the whole thing //////////////////////////////////////////////////////////// // Sorters @@ -51,6 +49,7 @@ namespace cppsort struct slab_sorter; struct smooth_sorter; struct spin_sorter; + struct splay_sorter; struct split_sorter; struct spread_sorter; struct std_sorter; @@ -101,6 +100,22 @@ namespace cppsort struct stable_adapter; template struct verge_adapter; + + //////////////////////////////////////////////////////////// + // Metrics + + namespace metrics + { + template + struct comparisons; + template + struct projections; + template< + typename Sorter, + typename DurationType = typename std::chrono::steady_clock::duration + > + struct running_time; + } } #endif // CPPSORT_FWD_H_ diff --git a/include/cpp-sort/metrics.h b/include/cpp-sort/metrics.h new file mode 100644 index 00000000..b3fecd67 --- /dev/null +++ b/include/cpp-sort/metrics.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_METRICS_H_ +#define CPPSORT_METRICS_H_ + +#include + +#include +#include +#include + +#endif // CPPSORT_METRICS_H_ diff --git a/include/cpp-sort/metrics/comparisons.h b/include/cpp-sort/metrics/comparisons.h new file mode 100644 index 00000000..fab1c5b4 --- /dev/null +++ b/include/cpp-sort/metrics/comparisons.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_METRICS_COMPARISONS_H_ +#define CPPSORT_METRICS_COMPARISONS_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include "../detail/checkers.h" +#include "../detail/comparison_counter.h" +#include "../detail/type_traits.h" + +namespace cppsort +{ +namespace metrics +{ + //////////////////////////////////////////////////////////// + // Tag + + struct comparisons_tag {}; + + //////////////////////////////////////////////////////////// + // Metric + + namespace detail + { + template + struct comparisons_impl: + utility::adapter_storage, + cppsort::detail::check_iterator_category, + cppsort::detail::check_is_always_stable + { + using tag_t = comparisons_tag; + using metric_t = utility::metric; + + comparisons_impl() = default; + + constexpr explicit comparisons_impl(Sorter&& sorter): + utility::adapter_storage(std::move(sorter)) + {} + + template< + typename Iterable, + typename Compare = std::less<>, + typename = cppsort::detail::enable_if_t< + not is_projection_v + > + > + auto operator()(Iterable&& iterable, Compare compare={}) const + -> metric_t + { + CountType count(0); + using cppsort::detail::comparison_counter; + comparison_counter cmp(std::move(compare), count); + this->get()(std::forward(iterable), std::move(cmp)); + return metric_t(count); + } + + template< + typename Iterator, + typename Compare = std::less<>, + typename = cppsort::detail::enable_if_t< + not is_projection_iterator_v + > + > + auto operator()(Iterator first, Iterator last, Compare compare={}) const + -> metric_t + { + CountType count(0); + using cppsort::detail::comparison_counter; + comparison_counter cmp(std::move(compare), count); + this->get()(std::move(first), std::move(last), std::move(cmp)); + return metric_t(count); + } + + template< + typename Iterable, + typename Compare, + typename Projection, + typename = cppsort::detail::enable_if_t< + is_projection_v + > + > + auto operator()(Iterable&& iterable, Compare compare, Projection projection) const + -> metric_t + { + CountType count(0); + using cppsort::detail::comparison_counter; + comparison_counter cmp(std::move(compare), count); + this->get()(std::forward(iterable), std::move(cmp), std::move(projection)); + return metric_t(count); + } + + template< + typename Iterator, + typename Compare, + typename Projection, + typename = cppsort::detail::enable_if_t< + is_projection_iterator_v + > + > + auto operator()(Iterator first, Iterator last, + Compare compare, Projection projection) const + -> metric_t + { + CountType count(0); + using cppsort::detail::comparison_counter; + comparison_counter cmp(std::move(compare), count); + this->get()(std::move(first), std::move(last), std::move(cmp), std::move(projection)); + return metric_t(count); + } + }; + } + + template + struct comparisons: + sorter_facade> + { + comparisons() = default; + + constexpr explicit comparisons(Sorter sorter): + sorter_facade>(std::move(sorter)) + {} + }; +}} + +namespace cppsort +{ + //////////////////////////////////////////////////////////// + // is_stable specialization + + template + struct is_stable(Args...)>: + is_stable + {}; +} + +#endif // CPPSORT_METRICS_COMPARISONS_H_ diff --git a/include/cpp-sort/metrics/projections.h b/include/cpp-sort/metrics/projections.h new file mode 100644 index 00000000..3f03deb3 --- /dev/null +++ b/include/cpp-sort/metrics/projections.h @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_METRICS_PROJECTIONS_H_ +#define CPPSORT_METRICS_PROJECTIONS_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include "../detail/checkers.h" +#include "../detail/iterator_traits.h" +#include "../detail/type_traits.h" + +namespace cppsort +{ +namespace metrics +{ + namespace detail + { + template + class projection_counter + { + public: + + projection_counter(Projection projection, CountType& count): + projection(std::move(projection)), + count(count) + {} + + template + auto operator()(T&& value) + -> decltype(auto) + { + ++count; + auto&& proj = utility::as_function(projection); + return proj(std::forward(value)); + } + + // Accessible member data + Projection projection; + + private: + + // Projection functions are generally passed by value, + // therefore we need to know where is the original counter + // in order to increment it + CountType& count; + }; + } + + //////////////////////////////////////////////////////////// + // Tag + + struct projections_tag {}; + + //////////////////////////////////////////////////////////// + // Metric + + namespace detail + { + template + struct projections_impl: + utility::adapter_storage, + cppsort::detail::check_iterator_category, + cppsort::detail::check_is_always_stable + { + using tag_t = projections_tag; + using metric_t = utility::metric; + + projections_impl() = default; + + constexpr explicit projections_impl(Sorter&& sorter): + utility::adapter_storage(std::move(sorter)) + {} + + template< + typename ForwardIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = cppsort::detail::enable_if_t> + > + auto operator()(ForwardIterator first, ForwardIterator last, + Compare compare={}, Projection projection={}) const + -> metric_t + { + CountType count(0); + projection_counter counter(std::move(projection), count); + + this->get()(first, last, std::move(compare), std::move(counter)); + return metric_t(count); + } + }; + } + + template + struct projections: + sorter_facade> + { + projections() = default; + + constexpr explicit projections(Sorter sorter): + sorter_facade>(std::move(sorter)) + {} + }; +}} + +namespace cppsort +{ + //////////////////////////////////////////////////////////// + // is_stable specialization + + template + struct is_stable(Args...)>: + is_stable + {}; +} + +#endif // CPPSORT_METRICS_PROJECTIONS_H_ diff --git a/include/cpp-sort/metrics/running_time.h b/include/cpp-sort/metrics/running_time.h new file mode 100644 index 00000000..97dae483 --- /dev/null +++ b/include/cpp-sort/metrics/running_time.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_METRICS_RUNNING_TIME_H_ +#define CPPSORT_METRICS_RUNNING_TIME_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include "../detail/checkers.h" + +namespace cppsort +{ +namespace metrics +{ + //////////////////////////////////////////////////////////// + // Tag + + struct running_time_tag {}; + + //////////////////////////////////////////////////////////// + // Metric + + template + struct running_time: + utility::adapter_storage, + cppsort::detail::check_iterator_category, + cppsort::detail::check_is_always_stable + { + using tag_t = running_time_tag; + using metric_t = utility::metric; + + running_time() = default; + + constexpr explicit running_time(Sorter sorter): + utility::adapter_storage(std::move(sorter)) + {} + + template + auto operator()(Args&&... args) const + -> decltype( + this->get()(std::forward(args)...), + metric_t(std::declval()) + ) + { + auto start = std::chrono::steady_clock::now(); + this->get()(std::forward(args)...); + auto stop = std::chrono::steady_clock::now(); + return metric_t(std::chrono::duration_cast(stop - start)); + } + }; +}} + +namespace cppsort +{ + //////////////////////////////////////////////////////////// + // is_stable specialization + + template + struct is_stable(Args...)>: + is_stable + {}; +} + +#endif // CPPSORT_METRICS_RUNNING_TIME_H_ diff --git a/include/cpp-sort/sorter_traits.h b/include/cpp-sort/sorter_traits.h index ad1da0f2..62e17ba2 100644 --- a/include/cpp-sort/sorter_traits.h +++ b/include/cpp-sort/sorter_traits.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_SORTER_TRAITS_H_ @@ -264,6 +264,36 @@ namespace cppsort // New category using iterator_category = Category; }; + + //////////////////////////////////////////////////////////// + // Half-baked utility for split_adapter and verge_adapter, + // aliases std::bidirectional_iterator_tag when possible, + // and a stricter iterator tag otherwise + + namespace detail + { + template + struct bidir_at_best_tag + { + using type = std::bidirectional_iterator_tag; + }; + + template + struct bidir_at_best_tag< + Sorter, + void_t::iterator_category> + > + { + using type = conditional_t< + std::is_base_of< + std::bidirectional_iterator_tag, + typename sorter_traits::iterator_category + >::value, + typename sorter_traits::iterator_category, + std::bidirectional_iterator_tag + >; + }; + } } #endif // CPPSORT_SORTER_TRAITS_H_ diff --git a/include/cpp-sort/sorters.h b/include/cpp-sort/sorters.h index 74cdab18..05d44c12 100644 --- a/include/cpp-sort/sorters.h +++ b/include/cpp-sort/sorters.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include diff --git a/include/cpp-sort/sorters/drop_merge_sorter.h b/include/cpp-sort/sorters/drop_merge_sorter.h index 9297053c..bac4c9b0 100644 --- a/include/cpp-sort/sorters/drop_merge_sorter.h +++ b/include/cpp-sort/sorters/drop_merge_sorter.h @@ -14,10 +14,20 @@ namespace cppsort { + namespace deprecated + { + struct drop_merge_sorter: + drop_merge_adapter + { + drop_merge_sorter() = default; + }; + } + //////////////////////////////////////////////////////////// // Sorter - struct drop_merge_sorter: + struct CPPSORT_DEPRECATED("drop_merge_sorter is deprecated and will be removed in version 2.0.0, use drop_merge_adapter(pdq_sort) instead") + drop_merge_sorter: drop_merge_adapter { drop_merge_sorter() = default; @@ -28,8 +38,9 @@ namespace cppsort namespace { + CPPSORT_DEPRECATED("drop_merge_sort is deprecated and will be removed in version 2.0.0, use drop_merge_adapter(pdq_sort) instead") constexpr auto&& drop_merge_sort - = utility::static_const::value; + = utility::static_const::value; } } diff --git a/include/cpp-sort/sorters/quick_merge_sorter.h b/include/cpp-sort/sorters/quick_merge_sorter.h index 6d7acbb6..f153f9b0 100644 --- a/include/cpp-sort/sorters/quick_merge_sorter.h +++ b/include/cpp-sort/sorters/quick_merge_sorter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2022 Morwenn + * Copyright (c) 2018-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_SORTERS_QUICK_MERGE_SORTER_H_ @@ -75,8 +75,7 @@ namespace cppsort "quick_merge_sorter requires at least forward iterators" ); - using std::distance; // Hack for sized_iterator - auto dist = distance(first, last); + auto dist = std::distance(first, last); quick_merge_sort(std::move(first), std::move(last), dist, std::move(compare), std::move(projection)); } diff --git a/include/cpp-sort/sorters/splay_sorter.h b/include/cpp-sort/sorters/splay_sorter.h new file mode 100644 index 00000000..620c2280 --- /dev/null +++ b/include/cpp-sort/sorters/splay_sorter.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2022 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_SORTERS_SPLAY_SORTER_H_ +#define CPPSORT_SORTERS_SPLAY_SORTER_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../detail/iterator_traits.h" +#include "../detail/splaysort.h" + +namespace cppsort +{ + //////////////////////////////////////////////////////////// + // Sorter + + namespace detail + { + struct splay_sorter_impl + { + template< + typename ForwardIterable, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t< + is_projection_v + > + > + auto operator()(ForwardIterable&& iterable, + Compare compare={}, Projection projection={}) const + -> void + { + static_assert( + std::is_base_of< + iterator_category, + iterator_category_t + >::value, + "splay_sorter requires at least forward iterators" + ); + + splaysort(std::begin(iterable), std::end(iterable), + utility::size(iterable), + std::move(compare), std::move(projection)); + } + + template< + typename ForwardIterator, + typename Compare = std::less<>, + typename Projection = utility::identity, + typename = detail::enable_if_t< + is_projection_iterator_v + > + > + auto operator()(ForwardIterator first, ForwardIterator last, + Compare compare={}, Projection projection={}) const + -> void + { + static_assert( + std::is_base_of< + iterator_category, + iterator_category_t + >::value, + "splay_sorter requires at least forward iterators" + ); + + auto size = std::distance(first, last); + splaysort(std::move(first), std::move(last), size, + std::move(compare), std::move(projection)); + } + + //////////////////////////////////////////////////////////// + // Sorter traits + + using iterator_category = std::forward_iterator_tag; + using is_always_stable = std::true_type; + }; + } + + struct splay_sorter: + sorter_facade + {}; + + //////////////////////////////////////////////////////////// + // Sort function + + namespace + { + constexpr auto&& splay_sort + = utility::static_const::value; + } +} + +#endif // CPPSORT_SORTERS_SPLAY_SORTER_H_ diff --git a/include/cpp-sort/sorters/split_sorter.h b/include/cpp-sort/sorters/split_sorter.h index 18789584..71da6d8f 100644 --- a/include/cpp-sort/sorters/split_sorter.h +++ b/include/cpp-sort/sorters/split_sorter.h @@ -13,13 +13,25 @@ #include #include #include +#include "../detail/config.h" namespace cppsort { + namespace deprecated + { + struct split_sorter: + split_adapter + { + split_sorter() = default; + using iterator_category = std::random_access_iterator_tag; + }; + } + //////////////////////////////////////////////////////////// // Sorter - struct split_sorter: + struct CPPSORT_DEPRECATED("split_sorter is deprecated and will be removed in version 2.0.0, use split_adapter(pdq_sort) instead") + split_sorter: split_adapter { //////////////////////////////////////////////////////////// @@ -39,8 +51,9 @@ namespace cppsort namespace { + CPPSORT_DEPRECATED("split_sort is deprecated and will be removed in version 2.0.0, use split_adapter(pdq_sort) instead") constexpr auto&& split_sort - = utility::static_const::value; + = utility::static_const::value; } } diff --git a/include/cpp-sort/sorters/verge_sorter.h b/include/cpp-sort/sorters/verge_sorter.h index e7c2b7f8..6ab0d7de 100644 --- a/include/cpp-sort/sorters/verge_sorter.h +++ b/include/cpp-sort/sorters/verge_sorter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2021 Morwenn + * Copyright (c) 2015-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_SORTERS_VERGE_SORTER_H_ @@ -8,114 +8,121 @@ //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// -#include -#include -#include -#include +#include #include -#include +#include #include -#include -#include -#include +#include +#include #include -#include "../detail/iterator_traits.h" -#include "../detail/type_traits.h" -#include "../detail/vergesort.h" +#include "../detail/config.h" namespace cppsort { - //////////////////////////////////////////////////////////// - // Sorter implementation + struct verge_sorter; - namespace detail + namespace deprecated { - template - struct verge_sorter_impl - { - template< - typename BidirectionalIterable, - typename Compare = std::less<>, - typename Projection = utility::identity, - typename = detail::enable_if_t< - is_projection_v - > - > - auto operator()(BidirectionalIterable&& iterable, - Compare compare={}, Projection projection={}) const - -> void - { - static_assert( - std::is_base_of< - iterator_category, - iterator_category_t - >::value, - "verge_sorter requires at least bidirectional iterators" - ); - - verge::sort(std::begin(iterable), std::end(iterable), - utility::size(iterable), - std::move(compare), std::move(projection)); - } - - template< - typename BidirectionalIterator, - typename Compare = std::less<>, - typename Projection = utility::identity, - typename = detail::enable_if_t< - is_projection_iterator_v + struct verge_sorter: + sorter_facade< + detail::verge_adapter_impl< + hybrid_adapter< + pdq_sorter, + quick_merge_sorter + >, + false > > - auto operator()(BidirectionalIterator first, BidirectionalIterator last, - Compare compare={}, Projection projection={}) const - -> void - { - static_assert( - std::is_base_of< - iterator_category, - iterator_category_t - >::value, - "verge_sorter requires at least bidirectional iterators" - ); - - auto size = std::distance(first, last); - verge::sort(std::move(first), std::move(last), size, - std::move(compare), std::move(projection)); - } - - //////////////////////////////////////////////////////////// - // Sorter traits - - using iterator_category = std::bidirectional_iterator_tag; - using is_always_stable = std::integral_constant; + { + verge_sorter() = default; }; } //////////////////////////////////////////////////////////// - // Sorters - - struct verge_sorter: - sorter_facade> - {}; + // Stable sorter + // Declare the specialization first to avoid deprecation + // warning at definition time template<> struct stable_adapter: - sorter_facade> + sorter_facade< + detail::verge_adapter_impl< + hybrid_adapter< + pdq_sorter, + quick_merge_sorter + >, + true + > + > + { + stable_adapter() = default; + + constexpr explicit stable_adapter(const verge_sorter&): + sorter_facade< + detail::verge_adapter_impl< + hybrid_adapter< + pdq_sorter, + quick_merge_sorter + >, + true + > + >() + {} + }; + + template<> + struct stable_adapter: + sorter_facade< + detail::verge_adapter_impl< + hybrid_adapter< + pdq_sorter, + quick_merge_sorter + >, + true + > + > { stable_adapter() = default; - constexpr explicit stable_adapter(verge_sorter): - sorter_facade>() + constexpr explicit stable_adapter(deprecated::verge_sorter): + sorter_facade< + detail::verge_adapter_impl< + hybrid_adapter< + pdq_sorter, + quick_merge_sorter + >, + true + > + >() {} }; + //////////////////////////////////////////////////////////// + // Sorters + + struct CPPSORT_DEPRECATED("verge_sorter is deprecated and will be removed in version 2.0.0, use verge_adapter instead") + verge_sorter: + sorter_facade< + detail::verge_adapter_impl< + hybrid_adapter< + pdq_sorter, + quick_merge_sorter + >, + false + > + > + { + verge_sorter() = default; + }; + //////////////////////////////////////////////////////////// // Sort function namespace { + CPPSORT_DEPRECATED("verge_sort is deprecated and will be removed in version 2.0.0, use verge_adapter instead") constexpr auto&& verge_sort - = utility::static_const::value; + = utility::static_const::value; } } diff --git a/include/cpp-sort/utility/metrics_tools.h b/include/cpp-sort/utility/metrics_tools.h new file mode 100644 index 00000000..4963c4b7 --- /dev/null +++ b/include/cpp-sort/utility/metrics_tools.h @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#ifndef CPPSORT_UTILITY_METRICS_TOOLS_H_ +#define CPPSORT_UTILITY_METRICS_TOOLS_H_ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include "../detail/type_traits.h" + +namespace cppsort +{ +namespace utility +{ + //////////////////////////////////////////////////////////// + // metric + // + // metric is a simple class holding a value of a given type + // and associating it to a tag. + + template + class metric + { + private: + + T _value; + + public: + + //////////////////////////////////////////////////////////// + // Construction + + metric() = default; + metric(const metric&) = default; + metric(metric&&) = default; + + constexpr explicit metric(const T& value) + noexcept(std::is_nothrow_copy_constructible::value): + _value(value) + {} + + constexpr explicit metric(T&& value) + noexcept(std::is_nothrow_move_constructible::value): + _value(std::move(value)) + {} + + //////////////////////////////////////////////////////////// + // Accessors + + constexpr explicit operator T() const + { + return _value; + } + + constexpr auto value() const + -> T + { + return _value; + } + + //////////////////////////////////////////////////////////// + // Assignment + + metric& operator=(const metric&) = default; + metric& operator=(metric&&) = default; + + constexpr auto operator=(const T& other) + noexcept(std::is_nothrow_copy_assignable::value) + -> metric& + { + _value = other; + return *this; + } + + constexpr auto operator=(T&& other) + noexcept(std::is_nothrow_move_assignable::value) + -> metric& + { + _value = std::move(other); + return *this; + } + + template + constexpr auto operator=(const metric& other) + noexcept(std::is_nothrow_assignable::value) + -> metric& + { + _value = other._value; + return *this; + } + + template + constexpr auto operator=(metric&& other) + noexcept(std::is_nothrow_assignable::value) + -> metric& + { + _value = std::move(other._value); + return *this; + } + + //////////////////////////////////////////////////////////// + // Comparison operators + + template + friend constexpr auto operator==(const metric& lhs, const metric& rhs) + -> bool + { + return lhs._value == rhs.value(); + } + + friend constexpr auto operator==(const metric& lhs, const T& rhs) + -> bool + { + return lhs._value == rhs; + } + + friend constexpr auto operator==(const T& lhs, const metric& rhs) + -> bool + { + return lhs == rhs._value; + } + + template + friend constexpr auto operator!=(const metric& lhs, const metric& rhs) + -> bool + { + return lhs._value != rhs.value(); + } + + friend constexpr auto operator!=(const metric& lhs, const T& rhs) + -> bool + { + return lhs._value != rhs; + } + + friend constexpr auto operator!=(const T& lhs, const metric& rhs) + -> bool + { + return lhs != rhs._value; + } + + //////////////////////////////////////////////////////////// + // Relational operators + + template + friend constexpr auto operator<(const metric& lhs, const metric& rhs) + -> bool + { + return lhs._value < rhs.value(); + } + + friend constexpr auto operator<(const metric& lhs, const T& rhs) + -> bool + { + return lhs._value < rhs; + } + + friend constexpr auto operator<(const T& lhs, const metric& rhs) + -> bool + { + return lhs < rhs._value; + } + + template + friend constexpr auto operator<=(const metric& lhs, const metric& rhs) + -> bool + { + return lhs._value <= rhs.value(); + } + + friend constexpr auto operator<=(const metric& lhs, const T& rhs) + -> bool + { + return lhs._value <= rhs; + } + + friend constexpr auto operator<=(const T& lhs, const metric& rhs) + -> bool + { + return lhs <= rhs._value; + } + + template + friend constexpr auto operator>(const metric& lhs, const metric& rhs) + -> bool + { + return lhs._value > rhs.value(); + } + + friend constexpr auto operator>(const metric& lhs, const T& rhs) + -> bool + { + return lhs._value > rhs; + } + + friend constexpr auto operator>(const T& lhs, const metric& rhs) + -> bool + { + return lhs > rhs._value; + } + + template + friend constexpr auto operator>=(const metric& lhs, const metric& rhs) + -> bool + { + return lhs._value >= rhs.value(); + } + + friend constexpr auto operator>=(const metric& lhs, const T& rhs) + -> bool + { + return lhs._value >= rhs; + } + + friend constexpr auto operator>=(const T& lhs, const metric& rhs) + -> bool + { + return lhs >= rhs._value; + } + + //////////////////////////////////////////////////////////// + // Stream operators + + template + friend auto operator<<(std::ostream& stream, const metric& met) + -> decltype(stream << std::declval()) + { + stream << met.value(); + return stream; + } + }; + + //////////////////////////////////////////////////////////// + // metrics, metric...> + + template + class metrics; + + template + class metrics...> + { + private: + + std::tuple...> metrics_; + + public: + + //////////////////////////////////////////////////////////// + // Construction + + metrics() = default; + metrics(const metrics&) = default; + metrics(metrics&&) = default; + + template + constexpr explicit metrics(Args&&... args): + metrics_(std::forward(args)...) + {} + + //////////////////////////////////////////////////////////// + // operator= + + metrics& operator=(const metrics&) = default; + metrics& operator=(metrics&&) = default; + + //////////////////////////////////////////////////////////// + // Index-based get() + + template + friend constexpr auto get(metrics& mm) + -> std::tuple_element_t...>>& + { + return std::get(mm.metrics_); + } + + template + friend constexpr auto get(const metrics& mm) + -> const std::tuple_element_t...>>& + { + return std::get(mm.metrics_); + } + + template + friend constexpr auto get(metrics&& mm) + -> std::tuple_element_t...>>&& + { + return std::get(std::move(mm).metrics_); + } + + template + friend constexpr auto get(const metrics&& mm) + -> const std::tuple_element_t...>>&& + { + return std::get(std::move(mm).metrics_); + } + + //////////////////////////////////////////////////////////// + // Tag-based get() + + template> + friend constexpr auto get(metrics& mm) + -> std::tuple_element_t...>>& + { + return std::get(mm.metrics_); + } + + template> + friend constexpr auto get(const metrics& mm) + -> const std::tuple_element_t...>>& + { + return std::get(mm.metrics_); + } + + template> + friend constexpr auto get(metrics&& mm) + -> std::tuple_element_t...>>&& + { + return std::get(std::move(mm).metrics_); + } + + template> + friend constexpr auto get(const metrics&& mm) + -> const std::tuple_element_t...>>&& + { + return std::get(std::move(mm).metrics_); + } + }; +}} + +#endif // CPPSORT_UTILITY_METRICS_TOOLS_H_ diff --git a/include/cpp-sort/version.h b/include/cpp-sort/version.h index 582f0176..206b45ea 100644 --- a/include/cpp-sort/version.h +++ b/include/cpp-sort/version.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2022 Morwenn + * Copyright (c) 2018-2023 Morwenn * SPDX-License-Identifier: MIT */ #ifndef CPPSORT_VERSION_H_ @@ -8,7 +8,7 @@ // Semantic versioning macros #define CPPSORT_VERSION_MAJOR 1 -#define CPPSORT_VERSION_MINOR 14 +#define CPPSORT_VERSION_MINOR 15 #define CPPSORT_VERSION_PATCH 0 #endif // CPPSORT_VERSION_H_ diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt index 161b6eb7..f0c546bc 100644 --- a/test_package/CMakeLists.txt +++ b/test_package/CMakeLists.txt @@ -1,13 +1,10 @@ -# Copyright (c) 2018-2021 Morwenn +# Copyright (c) 2018-2023 Morwenn # SPDX-License-Identifier: MIT cmake_minimum_required(VERSION 2.8.11) project(test_package LANGUAGES CXX) -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup(TARGETS) - find_package(cpp-sort REQUIRED CONFIG) add_executable(${PROJECT_NAME} cpp-sort-integrity.cpp) diff --git a/test_package/conanfile.py b/test_package/conanfile.py index 932df7bb..30aa65dd 100644 --- a/test_package/conanfile.py +++ b/test_package/conanfile.py @@ -1,24 +1,32 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (c) 2018-2021 Morwenn +# Copyright (c) 2018-2023 Morwenn # SPDX-License-Identifier: MIT import os.path -from conans import CMake, ConanFile, tools +from conan import ConanFile +from conan.tools.cmake import CMake, cmake_layout +from conan.tools.build import can_run class CppsortTestConan(ConanFile): settings = "os", "compiler", "build_type", "arch" - generators = "cmake", "cmake_find_package_multi" + generators = "CMakeDeps", "CMakeToolchain" + + def requirements(self): + self.requires(self.tested_reference_str) def build(self): cmake = CMake(self) cmake.configure() cmake.build() + def layout(self): + cmake_layout(self) + def test(self): - if not tools.cross_building(self.settings): - bin_path = os.path.join("bin", "test_package") - self.run(bin_path, run_environment=True) + if can_run(self): + cmd = os.path.join(self.cpp.build.bindir, "test_package") + self.run(cmd, env="conanrun") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4b0cdc25..f194a70a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015-2022 Morwenn +# Copyright (c) 2015-2023 Morwenn # SPDX-License-Identifier: MIT include(cpp-sort-utils) @@ -27,7 +27,7 @@ else() message(STATUS "Catch2 not found") download_project(PROJ Catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2 - GIT_TAG v3.2.1 + GIT_TAG v3.4.0 UPDATE_DISCONNECTED 1 ) add_subdirectory(${Catch2_SOURCE_DIR} ${Catch2_BINARY_DIR}) @@ -61,6 +61,8 @@ macro(configure_tests target) # Somewhat speed up Catch2 compile times CATCH_CONFIG_FAST_COMPILE # Enable assertions for more thorough tests + _GLIBCXX_ASSERTIONS + _LIBCPP_ENABLE_ASSERTIONS=1 CPPSORT_ENABLE_ASSERTIONS # We test deprecated code but we don't want it to warn CPPSORT_DISABLE_DEPRECATION_WARNINGS @@ -150,6 +152,11 @@ add_executable(main-tests adapters/stable_adapter_every_sorter.cpp adapters/verge_adapter_every_sorter.cpp + # Metrics tests + metrics/comparisons.cpp + metrics/projections.cpp + metrics/running_time.cpp + # Comparators tests comparators/case_insensitive_less.cpp comparators/flip_not.cpp @@ -228,6 +235,7 @@ add_executable(main-tests utility/buffer.cpp utility/chainable_projections.cpp utility/iter_swap.cpp + utility/metric_tools.cpp utility/sorted_indices.cpp utility/sorted_iterators.cpp utility/sorting_networks.cpp diff --git a/tests/adapters/drop_merge_adapter_every_sorter.cpp b/tests/adapters/drop_merge_adapter_every_sorter.cpp index e8936e0e..0bb0cb91 100644 --- a/tests/adapters/drop_merge_adapter_every_sorter.cpp +++ b/tests/adapters/drop_merge_adapter_every_sorter.cpp @@ -33,6 +33,7 @@ TEMPLATE_TEST_CASE( "every random-access sorter with drop_merge_adapter", "[drop cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -69,6 +70,7 @@ TEMPLATE_TEST_CASE( "every bidirectional sorter with drop_merge_adapter", "[drop cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/adapters/indirect_adapter_every_sorter.cpp b/tests/adapters/indirect_adapter_every_sorter.cpp index 9ef662df..fd889e96 100644 --- a/tests/adapters/indirect_adapter_every_sorter.cpp +++ b/tests/adapters/indirect_adapter_every_sorter.cpp @@ -32,6 +32,7 @@ TEMPLATE_TEST_CASE( "every random-access sorter with indirect adapter", "[indire cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -60,6 +61,7 @@ TEMPLATE_TEST_CASE( "every bidirectional sorter with indirect_adapter", "[indire cppsort::quick_sorter, cppsort::selection_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list collection; @@ -78,7 +80,8 @@ TEMPLATE_TEST_CASE( "every forward sorter with with indirect_adapter", "[indirec cppsort::pdq_sorter, // Check extended support cppsort::quick_merge_sorter, cppsort::quick_sorter, - cppsort::selection_sorter ) + cppsort::selection_sorter, + cppsort::splay_sorter ) { std::forward_list collection; auto distribution = dist::shuffled{}; diff --git a/tests/adapters/mixed_adapters.cpp b/tests/adapters/mixed_adapters.cpp index 8140d8c0..e7323309 100644 --- a/tests/adapters/mixed_adapters.cpp +++ b/tests/adapters/mixed_adapters.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2022 Morwenn + * Copyright (c) 2016-2023 Morwenn * SPDX-License-Identifier: MIT */ #include @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -236,3 +237,18 @@ TEST_CASE( "stable_adapter over stable_adapter", "[stable_adapter]" ) STATIC_CHECK( std::is_same, sorter>::value ); } } + +TEST_CASE( "stable_t", "[stable_adapter][hybrid_adapter]" ) +{ + using sorter_t = cppsort::hybrid_adapter< + cppsort::poplar_sorter, + cppsort::quick_merge_sorter + >; + using stable_sorter_t = cppsort::stable_t; + + sorter_t sorter; + stable_sorter_t stable_sorter(std::move(sorter)); + (void)stable_sorter; + + CHECK( true ); +} diff --git a/tests/adapters/schwartz_adapter_every_sorter.cpp b/tests/adapters/schwartz_adapter_every_sorter.cpp index 16df64d0..288957dd 100644 --- a/tests/adapters/schwartz_adapter_every_sorter.cpp +++ b/tests/adapters/schwartz_adapter_every_sorter.cpp @@ -43,6 +43,7 @@ TEMPLATE_TEST_CASE( "every random-access sorter with Schwartzian transform adapt cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::tim_sorter, cppsort::verge_sorter, @@ -68,6 +69,7 @@ TEMPLATE_TEST_CASE( "every bidirectional sorter with Schwartzian transform adapt cppsort::quick_sorter, cppsort::selection_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list> collection; @@ -86,7 +88,8 @@ TEMPLATE_TEST_CASE( "every forward sorter with Schwartzian transform adapter", " cppsort::merge_sorter, cppsort::quick_merge_sorter, cppsort::quick_sorter, - cppsort::selection_sorter ) + cppsort::selection_sorter, + cppsort::splay_sorter ) { std::forward_list> collection; auto distribution = dist::shuffled{}; diff --git a/tests/adapters/schwartz_adapter_every_sorter_reversed.cpp b/tests/adapters/schwartz_adapter_every_sorter_reversed.cpp index d44e2c84..036dd5ac 100644 --- a/tests/adapters/schwartz_adapter_every_sorter_reversed.cpp +++ b/tests/adapters/schwartz_adapter_every_sorter_reversed.cpp @@ -43,6 +43,7 @@ TEMPLATE_TEST_CASE( "every sorter with Schwartzian transform adapter and reverse cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::tim_sorter, cppsort::verge_sorter, diff --git a/tests/adapters/split_adapter_every_sorter.cpp b/tests/adapters/split_adapter_every_sorter.cpp index 2c719fa5..b71828c1 100644 --- a/tests/adapters/split_adapter_every_sorter.cpp +++ b/tests/adapters/split_adapter_every_sorter.cpp @@ -33,6 +33,7 @@ TEMPLATE_TEST_CASE( "every random-access sorter with split_adapter", "[split_ada cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -59,7 +60,8 @@ TEMPLATE_TEST_CASE( "every bidirectional sorter with split_adapter", "[split_ada cppsort::quick_merge_sorter, cppsort::quick_sorter, cppsort::selection_sorter, - cppsort::slab_sorter ) + cppsort::slab_sorter, + cppsort::splay_sorter ) { std::list collection; auto distribution = dist::inversions(0.2); // Big enough merges diff --git a/tests/adapters/stable_adapter_every_sorter.cpp b/tests/adapters/stable_adapter_every_sorter.cpp index 7a172d42..b1d3117f 100644 --- a/tests/adapters/stable_adapter_every_sorter.cpp +++ b/tests/adapters/stable_adapter_every_sorter.cpp @@ -46,6 +46,7 @@ TEMPLATE_TEST_CASE( "every random-access sorter with stable_adapter", "[stable_a cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, @@ -53,7 +54,7 @@ TEMPLATE_TEST_CASE( "every random-access sorter with stable_adapter", "[stable_a cppsort::wiki_sorter> ) { cppsort::stable_t sorter; - std::vector collection(412); + std::vector collection(1000); helpers::iota(collection.begin(), collection.end(), 0, &wrapper::order); SECTION( "shuffled_16_values" ) @@ -82,11 +83,12 @@ TEMPLATE_TEST_CASE( "every bidirectional sorter with stable_adapter", "[stable_a cppsort::quick_merge_sorter, cppsort::quick_sorter, cppsort::selection_sorter, + cppsort::splay_sorter, cppsort::slab_sorter, cppsort::verge_sorter ) { cppsort::stable_t sorter; - std::list collection(412); + std::list collection(1000); helpers::iota(collection.begin(), collection.end(), 0, &wrapper::order); SECTION( "shuffled_16_values" ) @@ -112,7 +114,8 @@ TEMPLATE_TEST_CASE( "every forward sorter with with stable_adapter", "[stable_ad cppsort::merge_sorter, cppsort::quick_merge_sorter, cppsort::quick_sorter, - cppsort::selection_sorter ) + cppsort::selection_sorter, + cppsort::splay_sorter ) { cppsort::stable_t sorter; const int size = 412; diff --git a/tests/adapters/verge_adapter_every_sorter.cpp b/tests/adapters/verge_adapter_every_sorter.cpp index 62a265c3..78d6e37f 100644 --- a/tests/adapters/verge_adapter_every_sorter.cpp +++ b/tests/adapters/verge_adapter_every_sorter.cpp @@ -1,9 +1,10 @@ /* - * Copyright (c) 2017-2022 Morwenn + * Copyright (c) 2017-2023 Morwenn * SPDX-License-Identifier: MIT */ #include #include +#include #include #include #include @@ -14,7 +15,7 @@ #include #include -TEMPLATE_TEST_CASE( "every sorter with verge_adapter", "[verge_adapter]", +TEMPLATE_TEST_CASE( "every random-access sorter with verge_adapter", "[verge_adapter]", cppsort::adaptive_shivers_sorter, cppsort::cartesian_tree_sorter, cppsort::d_ary_heap_sorter<4>, @@ -35,6 +36,7 @@ TEMPLATE_TEST_CASE( "every sorter with verge_adapter", "[verge_adapter]", cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -50,7 +52,8 @@ TEMPLATE_TEST_CASE( "every sorter with verge_adapter", "[verge_adapter]", CHECK( std::is_sorted(collection.begin(), collection.end()) ); } -TEMPLATE_TEST_CASE( "every sorter with stable verge_adapter", "[verge_adapter][stable_adapter]", +TEMPLATE_TEST_CASE( "every random-access sorter with stable verge_adapter", + "[verge_adapter][stable_adapter]", cppsort::adaptive_shivers_sorter, cppsort::cartesian_tree_sorter, cppsort::default_sorter, @@ -69,6 +72,7 @@ TEMPLATE_TEST_CASE( "every sorter with stable verge_adapter", "[verge_adapter][s cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, @@ -84,3 +88,25 @@ TEMPLATE_TEST_CASE( "every sorter with stable verge_adapter", "[verge_adapter][s sorter(collection, &wrapper::value); CHECK( std::is_sorted(collection.begin(), collection.end()) ); } + +TEMPLATE_TEST_CASE( "every bidirectiona sorter with verge_adapter", "[verge_adapter]", + cppsort::cartesian_tree_sorter, + cppsort::default_sorter, + cppsort::drop_merge_sorter, + cppsort::insertion_sorter, + cppsort::mel_sorter, + cppsort::merge_sorter, + cppsort::quick_merge_sorter, + cppsort::quick_sorter, + cppsort::selection_sorter, + cppsort::slab_sorter, + cppsort::splay_sorter ) +{ + std::list collection; + auto distribution = dist::shuffled{}; + distribution.call(std::back_inserter(collection), 412); + + cppsort::verge_adapter sorter; + sorter(collection); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); +} diff --git a/tests/distributions/all_equal.cpp b/tests/distributions/all_equal.cpp index ed43740c..4c570632 100644 --- a/tests/distributions/all_equal.cpp +++ b/tests/distributions/all_equal.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test random-access sorters with all_equal distribution", "[ cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/alternating.cpp b/tests/distributions/alternating.cpp index e460e1e6..05586bf1 100644 --- a/tests/distributions/alternating.cpp +++ b/tests/distributions/alternating.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test sorter with alternating distribution", "[distributions cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/ascending.cpp b/tests/distributions/ascending.cpp index 661757d4..68c8e61c 100644 --- a/tests/distributions/ascending.cpp +++ b/tests/distributions/ascending.cpp @@ -36,6 +36,7 @@ TEMPLATE_TEST_CASE( "test sorter with ascending distribution", "[distributions]" cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/ascending_sawtooth.cpp b/tests/distributions/ascending_sawtooth.cpp index 363d60ec..a631b0af 100644 --- a/tests/distributions/ascending_sawtooth.cpp +++ b/tests/distributions/ascending_sawtooth.cpp @@ -32,6 +32,7 @@ TEMPLATE_TEST_CASE( "test random-access sorters with ascending_sawtooth distribu cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -59,6 +60,7 @@ TEMPLATE_TEST_CASE( "test bidirectional sorters with ascending_sawtooth distribu cppsort::quick_merge_sorter, cppsort::quick_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list collection; diff --git a/tests/distributions/descending.cpp b/tests/distributions/descending.cpp index 0506ca64..b173121c 100644 --- a/tests/distributions/descending.cpp +++ b/tests/distributions/descending.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test sorter with descending distribution", "[distributions] cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/descending_sawtooth.cpp b/tests/distributions/descending_sawtooth.cpp index 6ee08f6c..f6968aa1 100644 --- a/tests/distributions/descending_sawtooth.cpp +++ b/tests/distributions/descending_sawtooth.cpp @@ -32,6 +32,7 @@ TEMPLATE_TEST_CASE( "test random-access sorters with descending_sawtooth distrib cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -59,6 +60,7 @@ TEMPLATE_TEST_CASE( "test bidirectional sorters with descending_sawtooth distrib cppsort::quick_merge_sorter, cppsort::quick_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list collection; diff --git a/tests/distributions/median_of_3_killer.cpp b/tests/distributions/median_of_3_killer.cpp index 2913e970..f5f0cb92 100644 --- a/tests/distributions/median_of_3_killer.cpp +++ b/tests/distributions/median_of_3_killer.cpp @@ -30,6 +30,7 @@ TEMPLATE_TEST_CASE( "test random-access sorters with median_of_3_killer distribu cppsort::ska_sorter, cppsort::slab_sorter, cppsort::smooth_sorter, + cppsort::splay_sorter, cppsort::spin_sorter, cppsort::split_sorter, cppsort::spread_sorter, @@ -58,6 +59,7 @@ TEMPLATE_TEST_CASE( "test bidirectional sorters with median_of_3_killer distribu cppsort::quick_merge_sorter, cppsort::quick_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list collection; diff --git a/tests/distributions/pipe_organ.cpp b/tests/distributions/pipe_organ.cpp index 896411de..74aece79 100644 --- a/tests/distributions/pipe_organ.cpp +++ b/tests/distributions/pipe_organ.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test sorter with pipe_organ distribution", "[distributions] cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/push_front.cpp b/tests/distributions/push_front.cpp index 422226ae..37cfc077 100644 --- a/tests/distributions/push_front.cpp +++ b/tests/distributions/push_front.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test sorter with push_front distribution", "[distributions] cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/push_middle.cpp b/tests/distributions/push_middle.cpp index b0c27557..93da47bd 100644 --- a/tests/distributions/push_middle.cpp +++ b/tests/distributions/push_middle.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test sorter with push_middle distribution", "[distributions cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/distributions/shuffled.cpp b/tests/distributions/shuffled.cpp index cc2b6702..5615cc92 100644 --- a/tests/distributions/shuffled.cpp +++ b/tests/distributions/shuffled.cpp @@ -45,6 +45,7 @@ TEMPLATE_TEST_CASE( "test random-access sorters with shuffled distribution", "[d cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, @@ -90,6 +91,7 @@ TEMPLATE_TEST_CASE( "test bidirectional sorters with shuffled distribution", "[d cppsort::quick_sorter, cppsort::selection_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list collection; @@ -108,7 +110,8 @@ TEMPLATE_TEST_CASE( "test forward sorters with shuffled distribution", "[distrib cppsort::merge_sorter, cppsort::quick_merge_sorter, cppsort::quick_sorter, - cppsort::selection_sorter ) + cppsort::selection_sorter, + cppsort::splay_sorter ) { std::forward_list collection; auto distribution = dist::shuffled{}; diff --git a/tests/distributions/shuffled_16_values.cpp b/tests/distributions/shuffled_16_values.cpp index d260b083..1bcd9f66 100644 --- a/tests/distributions/shuffled_16_values.cpp +++ b/tests/distributions/shuffled_16_values.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test sorter with shuffled_16_values distribution", "[distri cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/metrics/comparisons.cpp b/tests/metrics/comparisons.cpp new file mode 100644 index 00000000..d1208c75 --- /dev/null +++ b/tests/metrics/comparisons.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using wrapper = generic_wrapper; + +TEST_CASE( "basic metrics::comparisons tests", + "[metrics][selection_sorter]" ) +{ + // Selection sort always makes the same number of comparisons + // for a given size of arrays, allowing to deterministically + // check that number of comparisons + cppsort::metrics::comparisons< + cppsort::selection_sorter + > sorter; + + SECTION( "without projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 65); + + auto res = sorter(collection); + CHECK( res == 2080 ); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + + SECTION( "with projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 80); + + auto res = sorter(collection, &wrapper::value); + CHECK( res == 3160 ); + CHECK( helpers::is_sorted(collection.begin(), collection.end(), + std::less<>{}, &wrapper::value) ); + } +} + +TEST_CASE( "metrics::comparisons with span", + "[metrics][span][selection_sorter]" ) +{ + cppsort::metrics::comparisons< + cppsort::selection_sorter + > sorter; + + SECTION( "without projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 65, 0); + + auto res = sorter(make_span(collection)); + CHECK( res == 2080 ); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + + SECTION( "with projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 80, 0); + + auto res = sorter(make_span(collection), &wrapper::value); + CHECK( res == 3160 ); + CHECK( helpers::is_sorted(collection.begin(), collection.end(), + std::less<>{}, &wrapper::value) ); + } +} diff --git a/tests/metrics/projections.cpp b/tests/metrics/projections.cpp new file mode 100644 index 00000000..67284601 --- /dev/null +++ b/tests/metrics/projections.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using wrapper = generic_wrapper; + +TEST_CASE( "basic metrics::projections tests", + "[metrics][selection_sorter]" ) +{ + // Selection sort always makes the same number of projections + // for a given size of arrays, allowing to deterministically + // check that number + cppsort::metrics::projections< + cppsort::selection_sorter + > sorter; + + SECTION( "without projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 65); + + auto res = sorter(collection); + CHECK( res == 4160 ); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + + SECTION( "with projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 80); + + auto res = sorter(collection, &wrapper::value); + CHECK( res == 6320 ); + CHECK( helpers::is_sorted(collection.begin(), collection.end(), + std::less<>{}, &wrapper::value) ); + } +} + +TEST_CASE( "metrics::projections with span", + "[metrics][span][selection_sorter]" ) +{ + cppsort::metrics::projections< + cppsort::selection_sorter + > sorter; + + SECTION( "without projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 65, 0); + + auto res = sorter(make_span(collection)); + CHECK( res == 4160 ); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + + SECTION( "with projections" ) + { + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 80, 0); + + auto res = sorter(make_span(collection), &wrapper::value); + CHECK( res == 6320 ); + CHECK( helpers::is_sorted(collection.begin(), collection.end(), + std::less<>{}, &wrapper::value) ); + } +} diff --git a/tests/metrics/running_time.cpp b/tests/metrics/running_time.cpp new file mode 100644 index 00000000..de5369b0 --- /dev/null +++ b/tests/metrics/running_time.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#include +#include +#include +#include +#include +#include +#include +#include + +TEST_CASE( "basic metrics::running_time tests", "[metrics]" ) +{ + using namespace std::chrono_literals; + + std::list collection; + auto distribution = dist::shuffled{}; + distribution(std::back_inserter(collection), 102); + + SECTION( "with default duration type" ) + { + cppsort::metrics::running_time< + cppsort::splay_sorter + > sorter; + + auto res = sorter(collection); + CHECK( res > 0s ); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + + SECTION( "with explicit duration type" ) + { + cppsort::metrics::running_time< + cppsort::splay_sorter, + std::chrono::microseconds + > sorter; + + auto res = sorter(collection); + CHECK( res > 0s ); + CHECK( res < 1s ); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + +} diff --git a/tests/sorter_facade_constexpr.cpp b/tests/sorter_facade_constexpr.cpp index 71bb0c55..f8d0df41 100644 --- a/tests/sorter_facade_constexpr.cpp +++ b/tests/sorter_facade_constexpr.cpp @@ -70,7 +70,7 @@ namespace { constexpr std::size_t size = 13; int collection[size] = { 15, 6, 0, 2, 2, 3, 8, 12, 10, 5, 9, 7, 10 }; - Sorter sorter; + Sorter sorter{}; sorter(collection, collection + size); return helpers::is_sorted(collection, collection + size); } diff --git a/tests/sorters/every_instantiated_sorter.cpp b/tests/sorters/every_instantiated_sorter.cpp index dece397f..7c8a8521 100644 --- a/tests/sorters/every_instantiated_sorter.cpp +++ b/tests/sorters/every_instantiated_sorter.cpp @@ -154,6 +154,12 @@ TEST_CASE( "test every instantiated sorter", "[sorters]" ) CHECK( std::is_sorted(collection.begin(), collection.end()) ); } + SECTION( "splay_sorter" ) + { + cppsort::splay_sort(collection); + CHECK( std::is_sorted(collection.begin(), collection.end()) ); + } + SECTION( "split_sorter" ) { cppsort::split_sort(collection); diff --git a/tests/sorters/every_sorter_internal_compare.cpp b/tests/sorters/every_sorter_internal_compare.cpp index d446217a..cb030a3f 100644 --- a/tests/sorters/every_sorter_internal_compare.cpp +++ b/tests/sorters/every_sorter_internal_compare.cpp @@ -30,6 +30,7 @@ TEMPLATE_TEST_CASE( "test every sorter with a pointer to member function compari cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, diff --git a/tests/sorters/every_sorter_long_string.cpp b/tests/sorters/every_sorter_long_string.cpp index 81b3891e..d4d4088a 100644 --- a/tests/sorters/every_sorter_long_string.cpp +++ b/tests/sorters/every_sorter_long_string.cpp @@ -61,6 +61,7 @@ TEMPLATE_TEST_CASE( "test every sorter with long std::string", "[sorters]", cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, diff --git a/tests/sorters/every_sorter_move_compare_projection.cpp b/tests/sorters/every_sorter_move_compare_projection.cpp index 9ce7c4bf..e0521682 100644 --- a/tests/sorters/every_sorter_move_compare_projection.cpp +++ b/tests/sorters/every_sorter_move_compare_projection.cpp @@ -34,6 +34,7 @@ TEMPLATE_TEST_CASE( "every sorter with comparison function altered by move", "[s cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, @@ -74,6 +75,7 @@ TEMPLATE_TEST_CASE( "every sorter with projection function altered by move", "[s cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/sorters/every_sorter_move_only.cpp b/tests/sorters/every_sorter_move_only.cpp index 6a08d7ab..4b4c4154 100644 --- a/tests/sorters/every_sorter_move_only.cpp +++ b/tests/sorters/every_sorter_move_only.cpp @@ -31,6 +31,7 @@ TEMPLATE_TEST_CASE( "test every sorter with move-only types", "[sorters]", cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, diff --git a/tests/sorters/every_sorter_no_post_iterator.cpp b/tests/sorters/every_sorter_no_post_iterator.cpp index 625976aa..8ebb3781 100644 --- a/tests/sorters/every_sorter_no_post_iterator.cpp +++ b/tests/sorters/every_sorter_no_post_iterator.cpp @@ -35,6 +35,7 @@ TEMPLATE_TEST_CASE( "test most sorters with no_post_iterator", "[sorters]", cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::tim_sorter, diff --git a/tests/sorters/every_sorter_non_const_compare.cpp b/tests/sorters/every_sorter_non_const_compare.cpp index 4d3c72e6..00cb972b 100644 --- a/tests/sorters/every_sorter_non_const_compare.cpp +++ b/tests/sorters/every_sorter_non_const_compare.cpp @@ -30,6 +30,7 @@ TEMPLATE_TEST_CASE( "test extended compatibility with LWG 3031", "[sorters]", cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, diff --git a/tests/sorters/every_sorter_rvalue_projection.cpp b/tests/sorters/every_sorter_rvalue_projection.cpp index d285d921..e2c26a28 100644 --- a/tests/sorters/every_sorter_rvalue_projection.cpp +++ b/tests/sorters/every_sorter_rvalue_projection.cpp @@ -33,6 +33,7 @@ TEMPLATE_TEST_CASE( "random-access sorters with a projection returning an rvalue cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, @@ -76,6 +77,7 @@ TEMPLATE_TEST_CASE( "bidirectional sorters with a projection returning an rvalue cppsort::quick_sorter, cppsort::selection_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { std::list collection; @@ -93,7 +95,8 @@ TEMPLATE_TEST_CASE( "forward sorters with a projection returning an rvalue", "[s cppsort::merge_sorter, cppsort::quick_merge_sorter, cppsort::quick_sorter, - cppsort::selection_sorter ) + cppsort::selection_sorter, + cppsort::splay_sorter ) { std::forward_list collection; auto distribution = dist::shuffled{}; diff --git a/tests/sorters/every_sorter_small_collections.cpp b/tests/sorters/every_sorter_small_collections.cpp index a6ef08e0..9aabc8c6 100644 --- a/tests/sorters/every_sorter_small_collections.cpp +++ b/tests/sorters/every_sorter_small_collections.cpp @@ -28,6 +28,7 @@ TEMPLATE_TEST_CASE( "test every sorter with small collections", "[sorters]", cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/sorters/every_sorter_span.cpp b/tests/sorters/every_sorter_span.cpp index 628ed4dd..e4447c75 100644 --- a/tests/sorters/every_sorter_span.cpp +++ b/tests/sorters/every_sorter_span.cpp @@ -37,6 +37,7 @@ TEMPLATE_TEST_CASE( "test every sorter with temporary span", "[sorters][span]", cppsort::ska_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::spread_sorter, cppsort::std_sorter, diff --git a/tests/sorters/every_sorter_throwing_moves.cpp b/tests/sorters/every_sorter_throwing_moves.cpp index 2baac0c5..9fd17049 100644 --- a/tests/sorters/every_sorter_throwing_moves.cpp +++ b/tests/sorters/every_sorter_throwing_moves.cpp @@ -98,6 +98,7 @@ TEMPLATE_TEST_CASE( "random-access sorters against throwing move operations", "[ cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, @@ -156,6 +157,7 @@ TEMPLATE_TEST_CASE( "bidirectional sorters against throwing move operations", "[ cppsort::quick_sorter, cppsort::selection_sorter, cppsort::slab_sorter, + cppsort::splay_sorter, cppsort::verge_sorter ) { auto distribution = dist::shuffled{}; @@ -184,7 +186,8 @@ TEMPLATE_TEST_CASE( "forward sorters against throwing move operations", "[sorter cppsort::merge_sorter, cppsort::quick_merge_sorter, cppsort::quick_sorter, - cppsort::selection_sorter ) + cppsort::selection_sorter, + cppsort::splay_sorter ) { auto distribution = dist::shuffled{}; // Initialize counters diff --git a/tests/sorters/every_sorter_tricky_difference_type.cpp b/tests/sorters/every_sorter_tricky_difference_type.cpp index e8d3248e..af26396b 100644 --- a/tests/sorters/every_sorter_tricky_difference_type.cpp +++ b/tests/sorters/every_sorter_tricky_difference_type.cpp @@ -36,6 +36,7 @@ TEMPLATE_TEST_CASE( "test every sorter with an int8_t difference_type", "[sorter cppsort::slab_sorter, cppsort::smooth_sorter, cppsort::spin_sorter, + cppsort::splay_sorter, cppsort::split_sorter, cppsort::std_sorter, cppsort::tim_sorter, diff --git a/tests/utility/metric_tools.cpp b/tests/utility/metric_tools.cpp new file mode 100644 index 00000000..56d64e9f --- /dev/null +++ b/tests/utility/metric_tools.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 Morwenn + * SPDX-License-Identifier: MIT + */ +#include +#include +#include +#include +#include +#include + +TEST_CASE("simple utility::metric tests", "[utility][metrics]") +{ + using namespace cppsort::utility; + using namespace std::chrono_literals; + + struct time_tag {}; + + constexpr metric m1(5s); + constexpr metric m2(5000ms); + constexpr metric m3(4000ms); + STATIC_CHECK( m1 == m2 ); + STATIC_CHECK( m3 != m2 ); + STATIC_CHECK( m3 < m1 ); +} + +TEST_CASE("simple utility::metrics tests", "[utility][metrics]") +{ + using std::get; + using namespace cppsort::utility; + + struct foo_tag {}; + struct bar_tag {}; + using metric1 = metric; + using metric2 = metric; + + metrics mm(metric1(42), metric2(140.0)); + auto& m1 = get(mm); + CHECK( m1 == 42 ); + auto m2 = get(mm); + CHECK( m2 == 140.0 ); + + get(mm) = 35; + CHECK( m1 == 35 ); +} diff --git a/tools/generate_sorting_network.py b/tools/generate_sorting_network.py index d6254967..461bd85c 100644 --- a/tools/generate_sorting_network.py +++ b/tools/generate_sorting_network.py @@ -1,21 +1,42 @@ # -*- coding: utf-8 -*- +import argparse import ast -import sys import textwrap +from pathlib import Path import z3 -def parse_network(path) -> list[list[tuple]]: +def find_sorter_hunter_file(path: Path, size: int): """ - Reads a file and returns for each line of list of tuples representing the indices - of elements on which to perform compare-and-swap operations. + Given the SorterHunter directory containing the network files, find the + one corresponding for sorting a network of the given size, pereferring + the ones that minimize the number of compare-exchanges. + """ + return sorted( + path.glob(f"Sort_{size}_*.json"), + key=lambda x: int(x.name.split('_')[2]) + )[0] + + +def parse_sorter_hunter_network(path: Path) -> list[list[tuple]]: + """ + Read a SorterHunter network file and return for each line a list of + tuples representing the indices of elements on which to perform + compare-and-swap operations. + + The SorterHunter files are JSON, but some information is still encoded + in the way indices of a same network are split across lines, so we read + it as a simple text file instead. """ res: list[list[tuple]] = [] - with open(path) as fd: + with path.open() as fd: for line in fd: - res.append(ast.literal_eval(line)) + line = line.strip() + if line.startswith("["): + line = line.rstrip(',') + ',' # Ensure it will always be a tuple + res.append(list(ast.literal_eval(line))) return res @@ -72,7 +93,7 @@ def generate_cxx(network: list[list[tuple]]): template CPPSORT_ATTRIBUTE_NODISCARD - static constexpr auto index_pairs() + static constexpr auto index_pairs() noexcept -> std::array, {nb_indices}> {{ return {{{{ @@ -82,7 +103,7 @@ def generate_cxx(network: list[list[tuple]]): }}; }}}} """) - + pairs = sum(network, []) # Find highest index in pairs @@ -97,12 +118,12 @@ def generate_cxx(network: list[list[tuple]]): lhs = "first" if pair[0] == 0 else f"first + {pair[0]}" rhs = "first" if pair[1] == 0 else f"first + {pair[1]}" swaps.append(f"iter_swap_if({lhs}, {rhs}, compare, projection);") - + # Generate list of indices indices = [] for line in network: indices.append(", ".join(f"{{{pair[0]}, {pair[1]}}}" for pair in line) + ",") - + return template.format( nb_inputs=highest_index + 1, swaps="\n ".join(swaps), @@ -112,7 +133,16 @@ def generate_cxx(network: list[list[tuple]]): def main(): - network = parse_network(sys.argv[1]) + parser = argparse.ArgumentParser(description="Turn a SorterHunter network into a cpp-sort one") + parser.add_argument('-s', '--size', type=int, + help="Number of inputs the network should sort") + parser.add_argument('directory', help="Directory containing the SorterHunter networks") + args = parser.parse_args() + + path = find_sorter_hunter_file(Path(args.directory), args.size) + print(f"Using file {path}") + + network = parse_sorter_hunter_network(path) pairs = sum(network, []) print(f"Number of pairs: {len(pairs)}") diff --git a/tools/release-checklist.md b/tools/release-checklist.md index 74b61c31..8bf74e3f 100644 --- a/tools/release-checklist.md +++ b/tools/release-checklist.md @@ -4,8 +4,8 @@ List of actions to perform when releasing a new cpp-sort version. - [ ] Update the documentation. - [ ] Update the releases notes. -- [ ] Udate `NOTICE.txt` and `README.md` when stealing code. -- [ ] Keep track of the things that will be changed in 2.0.0. +- [ ] Update `NOTICE.txt` and `README.md` when stealing code. +- [ ] Keep track of the things that will change in 2.0.0. ### Before the release diff --git a/tools/rename-library.py b/tools/rename-library.py index 6ecbb5ea..4deccb23 100644 --- a/tools/rename-library.py +++ b/tools/rename-library.py @@ -15,7 +15,6 @@ import fnmatch import os import shutil -import sys import pygit2 @@ -36,9 +35,9 @@ def main(): repo = pygit2.Repository(repo_root) os.chdir(repo_root) - ################################################## + ################################################## # Rename the library mentions in code - + # Files we are interested into match one of these patterns filename_patterns = [ "*.h", @@ -58,7 +57,7 @@ def main(): for pattern in filename_patterns): continue print("Modifying:", os.path.join(root, file)) - + # Replace references to cpp-sort with fileinput.FileInput(os.path.join(root, file), inplace=True) as fd: for line in fd: @@ -68,7 +67,7 @@ def main(): ################################################## # Rename the main include directory - + # Directory is removed after the files have been modified to make # sure that the .gitignore is valid when modifying said files old_dirname = os.path.join(repo_root, 'include', 'cpp-sort')