From f86a3a40bb72685e241b101b9db47f1634a39869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Wed, 23 Mar 2016 22:10:27 +0100 Subject: [PATCH] Added adaptive merge test --- proj/vc7ide/Move.sln | 8 ++ proj/vc7ide/adaptive_merge_test.vcproj | 134 +++++++++++++++++++++++++ test/adaptive_merge_test.cpp | 87 ++++++++++++++++ 3 files changed, 229 insertions(+) create mode 100644 proj/vc7ide/adaptive_merge_test.vcproj create mode 100644 test/adaptive_merge_test.cpp diff --git a/proj/vc7ide/Move.sln b/proj/vc7ide/Move.sln index 905c497..6a1d7a4 100644 --- a/proj/vc7ide/Move.sln +++ b/proj/vc7ide/Move.sln @@ -123,6 +123,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adaptive_sort_test", "adapt ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adaptive_merge_test", "adaptive_merge_test.vcproj", "{CD617A28-6217-B79E-4CE2-6BA035379A6A}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -255,6 +259,10 @@ Global {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Debug.Build.0 = Debug|Win32 {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Release.ActiveCfg = Release|Win32 {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Release.Build.0 = Release|Win32 + {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Debug.ActiveCfg = Debug|Win32 + {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Debug.Build.0 = Debug|Win32 + {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Release.ActiveCfg = Release|Win32 + {CD617A28-6217-B79E-4CE2-6BA035379A6A}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionItems) = postSolution ..\..\..\..\boost\move\algo\adaptive_merge.hpp = ..\..\..\..\boost\move\algo\adaptive_merge.hpp diff --git a/proj/vc7ide/adaptive_merge_test.vcproj b/proj/vc7ide/adaptive_merge_test.vcproj new file mode 100644 index 0000000..516f1b1 --- /dev/null +++ b/proj/vc7ide/adaptive_merge_test.vcproj @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/adaptive_merge_test.cpp b/test/adaptive_merge_test.cpp new file mode 100644 index 0000000..5365e78 --- /dev/null +++ b/test/adaptive_merge_test.cpp @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2015-2016. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// See http://www.boost.org/libs/move for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include //std::srand +#include //std::next_permutation +#include //std::cout + +#include + +#include +#include +#include + +using boost::timer::cpu_timer; +using boost::timer::cpu_times; +using boost::timer::nanosecond_type; + +#include "order_type.hpp" + +#include +#include + + +template +bool test_random_shuffled(std::size_t const element_count, std::size_t const num_keys, std::size_t const num_iter) +{ + boost::movelib::unique_ptr elements(new T[element_count]); + boost::movelib::unique_ptr key_reps(new std::size_t[num_keys ? num_keys : element_count]); + std::cout << "- - N: " << element_count << ", Keys: " << num_keys << ", It: " << num_iter << " \n"; + + //Initialize keys + for(std::size_t i=0; i < element_count; ++i){ + std::size_t key = num_keys ? (i % num_keys) : i; + elements[i].key=key; + } + + std::srand(0); + + for (std::size_t i = 0; i != num_iter; ++i) + { + std::random_shuffle(elements.get(), elements.get() + element_count); + for(std::size_t i = 0; i < (num_keys ? num_keys : element_count); ++i){ + key_reps[i]=0; + } + for(std::size_t i = 0; i < element_count; ++i){ + elements[i].val = key_reps[elements[i].key]++; + } + + boost::container::vector tmp(elements.get(), elements.get()+element_count); + std::size_t const split = std::size_t(std::rand()) % element_count; + std::stable_sort(tmp.data(), tmp.data()+split, order_type_less()); + std::stable_sort(tmp.data()+split, tmp.data()+element_count, order_type_less()); + + boost::movelib::adaptive_merge(tmp.data(), tmp.data()+split, tmp.data()+element_count, order_type_less()); + + if (!is_order_type_ordered(tmp.data(), element_count)) + { + std::cout << "\n ERROR\n"; + throw int(0); + } + } + return true; +} + +int main() +{ + #ifdef NDEBUG + const std::size_t NIter = 100; + #else + const std::size_t NIter = 10; + #endif + test_random_shuffled(10001, 65, NIter); + test_random_shuffled(10001, 101, NIter); + test_random_shuffled(10001, 1023, NIter); + test_random_shuffled(10001, 4095, NIter); + test_random_shuffled(10001, 0, NIter); + + return 0; +}