]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/move/test/adaptive_merge_test.cpp
1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2015-2016.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 // See http://www.boost.org/libs/move for documentation.
10 //////////////////////////////////////////////////////////////////////////////
12 #include <cstdlib> //std::srand
13 #include <iostream> //std::cout
15 #include <boost/config.hpp>
17 #include <boost/move/unique_ptr.hpp>
18 #include <boost/move/algo/detail/merge_sort.hpp>
20 #include "order_type.hpp"
21 #include "random_shuffle.hpp"
23 #include <boost/move/algo/adaptive_merge.hpp>
24 #include <boost/move/core.hpp>
28 bool test_random_shuffled(std::size_t const element_count
, std::size_t const num_keys
, std::size_t const num_iter
)
30 boost::movelib::unique_ptr
<T
[]> elements(new T
[element_count
]);
31 boost::movelib::unique_ptr
<std::size_t[]> key_reps(new std::size_t[num_keys
? num_keys
: element_count
]);
32 std::cout
<< "- - N: " << element_count
<< ", Keys: " << num_keys
<< ", It: " << num_iter
<< " \n";
35 for(std::size_t i
=0; i
< element_count
; ++i
){
36 std::size_t key
= num_keys
? (i
% num_keys
) : i
;
42 for (std::size_t i
= 0; i
!= num_iter
; ++i
)
44 ::random_shuffle(elements
.get(), elements
.get() + element_count
);
45 for(std::size_t i
= 0; i
< (num_keys
? num_keys
: element_count
); ++i
){
48 for(std::size_t i
= 0; i
< element_count
; ++i
){
49 elements
[i
].val
= key_reps
[elements
[i
].key
]++;
52 boost::movelib::unique_ptr
<char[]> buf(new char [sizeof(T
)*(element_count
-element_count
/2)]);
54 std::size_t const split
= std::size_t(std::rand()) % element_count
;
55 boost::movelib::merge_sort(elements
.get(), elements
.get()+split
, order_type_less(), (T
*)buf
.get());
56 boost::movelib::merge_sort(elements
.get()+split
, elements
.get()+element_count
, order_type_less(), (T
*)buf
.get());
58 boost::movelib::adaptive_merge(elements
.get(), elements
.get()+split
, elements
.get()+element_count
, order_type_less());
60 if (!is_order_type_ordered(elements
.get(), element_count
))
62 std::cout
<< "\n ERROR\n";
71 const std::size_t NIter
= 100;
72 test_random_shuffled
<order_move_type
>(10001, 3, NIter
);
73 test_random_shuffled
<order_move_type
>(10001, 65, NIter
);
74 test_random_shuffled
<order_move_type
>(10001, 101, NIter
);
75 test_random_shuffled
<order_move_type
>(10001, 1023, NIter
);
76 test_random_shuffled
<order_move_type
>(10001, 4095, NIter
);
77 test_random_shuffled
<order_move_type
>(10001, 0, NIter
);