summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/move/test/inplace_merge_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/move/test/inplace_merge_test.cpp')
-rw-r--r--src/boost/libs/move/test/inplace_merge_test.cpp283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/boost/libs/move/test/inplace_merge_test.cpp b/src/boost/libs/move/test/inplace_merge_test.cpp
new file mode 100644
index 000000000..b69bce0cb
--- /dev/null
+++ b/src/boost/libs/move/test/inplace_merge_test.cpp
@@ -0,0 +1,283 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2016-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.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//#define BOOST_MOVE_ADAPTIVE_SORT_INVARIANTS
+#define BOOST_MOVE_ADAPTIVE_SORT_STATS
+
+#include "order_type.hpp"
+
+#include <iostream> //std::cout
+#include <boost/config.hpp>
+
+#include <boost/move/algo/detail/adaptive_sort_merge.hpp>
+#include <boost/move/core.hpp>
+#include <boost/move/unique_ptr.hpp>
+#include <boost/move/make_unique.hpp>
+
+#include <boost/move/detail/type_traits.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstddef>
+
+const std::size_t BlockSize = 7u;
+
+#if defined(BOOST_MSVC)
+#pragma warning (disable : 4267)
+#endif
+
+
+const std::size_t left_merge = 0;
+const std::size_t buf_merge = 1;
+const std::size_t unbuf_merge= 2;
+const std::size_t max_merge = 3;
+
+template<class Op>
+void alternating_test(
+ const std::size_t NumBlocksA,
+ const std::size_t NumBlocksB,
+ const std::size_t ExtraA,
+ const std::size_t ExtraB,
+ Op op)
+{
+ using namespace boost::movelib::detail_adaptive;
+
+
+ const std::size_t DataSize = ExtraA + NumBlocksA*BlockSize + NumBlocksB*BlockSize + ExtraB;
+ const std::size_t KeySize = NumBlocksA + NumBlocksB + 1;
+ const std::size_t HdrSize = BlockSize + KeySize;
+ const std::size_t ArraySize = HdrSize + DataSize;
+
+ boost::movelib::unique_ptr<order_move_type[]> testarray(boost::movelib::make_unique<order_move_type[]>(ArraySize));
+
+
+ for(std::size_t szt_merge = 0; szt_merge != max_merge; ++szt_merge){
+ //Order keys
+ for (std::size_t szt_i = 0u; szt_i != KeySize; ++szt_i) {
+ testarray[szt_i].key = szt_i;
+ testarray[szt_i].val = std::size_t(-1);
+ }
+
+ //Order buffer
+ for (std::size_t szt_i = 0u; szt_i != BlockSize; ++szt_i) {
+ testarray[KeySize+szt_i].key = std::size_t(-1);
+ testarray[KeySize+szt_i].val = szt_i;
+ }
+
+ //Block A
+ std::size_t szt_k = 0;
+ for (std::size_t szt_i = 0u; szt_i != ExtraA; ++szt_i) {
+ testarray[HdrSize+szt_k].key = (szt_k/2)*2;
+ testarray[HdrSize+szt_k].val = szt_k & 1;
+ ++szt_k;
+ }
+
+ for (std::size_t szt_b = 0u; szt_b != NumBlocksA; ++szt_b)
+ for (std::size_t szt_i = 0u; szt_i != BlockSize; ++szt_i) {
+ testarray[HdrSize+szt_k].key = (szt_k/2)*2;
+ testarray[HdrSize+szt_k].val = szt_k & 1;
+ ++szt_k;
+ }
+
+ //Block B
+ std::size_t szt_l = 0;
+ for (std::size_t szt_b = 0u, szt_t = 0; szt_b != NumBlocksB; ++szt_b)
+ for (std::size_t szt_i = 0u; szt_i != BlockSize; ++szt_i, ++szt_t) {
+ testarray[HdrSize+szt_k].key = (szt_l/2)*2+1;
+ testarray[HdrSize+szt_k].val = szt_l & 1;
+ ++szt_k;
+ ++szt_l;
+ }
+
+ for (std::size_t szt_i = 0u; szt_i != ExtraB; ++szt_i) {
+ testarray[HdrSize+szt_k].key = (szt_l/2)*2+1;
+ testarray[HdrSize+szt_k].val = szt_l & 1;
+ ++szt_k;
+ ++szt_l;
+ }
+
+ if(szt_merge == left_merge){
+ //Merge Left
+ op_merge_blocks_left
+ ( testarray.get(), order_type_less()
+ , testarray.get()+HdrSize, BlockSize, ExtraA, NumBlocksA, NumBlocksB, ExtraB
+ , order_type_less(), op );
+ BOOST_TEST( is_order_type_ordered(testarray.get()+KeySize, DataSize) );
+ BOOST_TEST( is_key(testarray.get(), KeySize) );
+ BOOST_TEST(( !boost::move_detail::is_same<Op, boost::movelib::swap_op>::value
+ || is_buffer(testarray.get()+ KeySize+DataSize, BlockSize) ));
+ }
+ else if(szt_merge == buf_merge){
+ //Merge with buf
+ op_merge_blocks_with_buf
+ ( testarray.get(), order_type_less()
+ , testarray.get()+HdrSize, BlockSize, ExtraA, NumBlocksA, NumBlocksB, ExtraB
+ , order_type_less(), op, testarray.get()+KeySize );
+ BOOST_TEST( is_order_type_ordered(testarray.get()+HdrSize, DataSize) );
+ BOOST_TEST( is_key(testarray.get(), KeySize) );
+ BOOST_TEST(( !boost::move_detail::is_same<Op, boost::movelib::swap_op>::value
+ || is_buffer(testarray.get()+ KeySize, BlockSize) ));
+ }
+ else if(szt_merge == unbuf_merge){
+ //Merge Left
+ merge_blocks_bufferless
+ ( testarray.get(), order_type_less()
+ , testarray.get()+HdrSize, BlockSize, ExtraA, NumBlocksA, NumBlocksB, ExtraB
+ , order_type_less());
+ BOOST_TEST( is_order_type_ordered(testarray.get()+HdrSize, DataSize) );
+ BOOST_TEST( is_key(testarray.get(), KeySize) );
+ BOOST_TEST(( !boost::move_detail::is_same<Op, boost::movelib::swap_op>::value
+ || is_buffer(testarray.get()+ KeySize, BlockSize) ));
+ }
+ }
+}
+
+int main()
+{
+ {
+ const std::size_t NumBlocksA = 3u;
+ const std::size_t NumBlocksB = 3u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = ExtraA;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 3u;
+ const std::size_t NumBlocksB = 3u;
+ const std::size_t ExtraA = 0u;
+ const std::size_t ExtraB = BlockSize/2;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 3u;
+ const std::size_t NumBlocksB = 3u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 3u;
+ const std::size_t NumBlocksB = 3u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 6u;
+ const std::size_t NumBlocksB = 3u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = ExtraA;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 6u;
+ const std::size_t NumBlocksB = 3u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 3u;
+ const std::size_t NumBlocksB = 5u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = ExtraA;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 3u;
+ const std::size_t NumBlocksB = 5u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 0u;
+ const std::size_t NumBlocksB = 0u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 0u;
+ const std::size_t NumBlocksB = 0u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 0u;
+ const std::size_t NumBlocksB = 0u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = BlockSize/2;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ //
+ {
+ const std::size_t NumBlocksA = 0u;
+ const std::size_t NumBlocksB = 1u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 1u;
+ const std::size_t NumBlocksB = 0u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 1u;
+ const std::size_t NumBlocksB = 0u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 0u;
+ const std::size_t NumBlocksB = 1u;
+ const std::size_t ExtraA = BlockSize/2;
+ const std::size_t ExtraB = 0;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 1u;
+ const std::size_t NumBlocksB = 0u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = BlockSize/2;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+ {
+ const std::size_t NumBlocksA = 0u;
+ const std::size_t NumBlocksB = 1u;
+ const std::size_t ExtraA = 0;
+ const std::size_t ExtraB = BlockSize/2;
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::move_op());
+ alternating_test(NumBlocksA, NumBlocksB, ExtraA, ExtraB, boost::movelib::swap_op());
+ }
+
+ return ::boost::report_errors();
+}