]>
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>
19 #include <boost/move/detail/force_ptr.hpp>
21 #include "order_type.hpp"
22 #include "random_shuffle.hpp"
24 #include <boost/move/algo/adaptive_merge.hpp>
25 #include <boost/move/core.hpp>
30 bool test_random_shuffled(std::size_t const element_count
, std::size_t const num_keys
, std::size_t const num_iter
)
32 boost::movelib::unique_ptr
<T
[]> elements(new T
[element_count
]);
33 boost::movelib::unique_ptr
<std::size_t[]> key_reps(new std::size_t[num_keys
? num_keys
: element_count
]);
34 std::cout
<< "- - N: " << element_count
<< ", Keys: " << num_keys
<< ", It: " << num_iter
<< " \n";
37 for(std::size_t i
=0; i
< element_count
; ++i
){
38 std::size_t key
= num_keys
? (i
% num_keys
) : i
;
44 for (std::size_t i
= 0; i
!= num_iter
; ++i
)
46 ::random_shuffle(elements
.get(), elements
.get() + element_count
);
47 for(std::size_t j
= 0; j
< (num_keys
? num_keys
: element_count
); ++j
){
50 for(std::size_t j
= 0; j
< element_count
; ++j
){
51 elements
[j
].val
= key_reps
[elements
[j
].key
]++;
54 boost::movelib::unique_ptr
<char[]> buf(new char [sizeof(T
)*(element_count
-element_count
/2)]);
56 std::size_t const split
= std::size_t(std::rand()) % element_count
;
57 boost::movelib::merge_sort(elements
.get(), elements
.get()+split
, order_type_less(), boost::move_detail::force_ptr
<T
*>(buf
.get()));
58 boost::movelib::merge_sort(elements
.get()+split
, elements
.get()+element_count
, order_type_less(), boost::move_detail::force_ptr
<T
*>(buf
.get()));
60 boost::movelib::adaptive_merge(elements
.get(), elements
.get()+split
, elements
.get()+element_count
, order_type_less());
62 if (!is_order_type_ordered(elements
.get(), element_count
))
64 std::cout
<< "\n ERROR\n";
71 void instantiate_smalldiff_iterators()
73 typedef randit
<int, short> short_rand_it_t
;
74 boost::movelib::adaptive_merge(short_rand_it_t(), short_rand_it_t(), short_rand_it_t(), less_int());
76 typedef randit
<int, signed char> schar_rand_it_t
;
77 boost::movelib::adaptive_merge(schar_rand_it_t(), schar_rand_it_t(), schar_rand_it_t(), less_int());
82 instantiate_smalldiff_iterators();
84 const std::size_t NIter
= 100;
85 test_random_shuffled
<order_move_type
>(10001, 3, NIter
);
86 test_random_shuffled
<order_move_type
>(10001, 65, NIter
);
87 test_random_shuffled
<order_move_type
>(10001, 101, NIter
);
88 test_random_shuffled
<order_move_type
>(10001, 1023, NIter
);
89 test_random_shuffled
<order_move_type
>(10001, 4095, NIter
);
90 test_random_shuffled
<order_move_type
>(10001, 0, NIter
);