summaryrefslogtreecommitdiffstats
path: root/pstl/test/test_uninitialized_copy_move.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'pstl/test/test_uninitialized_copy_move.cpp')
-rw-r--r--pstl/test/test_uninitialized_copy_move.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/pstl/test/test_uninitialized_copy_move.cpp b/pstl/test/test_uninitialized_copy_move.cpp
new file mode 100644
index 00000000000..b9893b06a99
--- /dev/null
+++ b/pstl/test/test_uninitialized_copy_move.cpp
@@ -0,0 +1,143 @@
+// -*- C++ -*-
+//===-- test_uninitialized_copy_move.cpp ----------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests for uninitialized_copy, uninitialized_copy_n, uninitialized_move, uninitialized_move_n
+
+#include "pstl_test_config.h"
+
+#include "pstl/execution"
+#include "pstl/memory"
+#include "utils.h"
+
+using namespace TestUtils;
+
+// function of checking correctness for uninitialized.construct.value
+template <typename InputIterator, typename OutputIterator, typename Size>
+bool
+IsCheckValueCorrectness(InputIterator first1, OutputIterator first2, Size n)
+{
+ for (Size i = 0; i < n; ++i, ++first1, ++first2)
+ {
+ if (*first1 != *first2)
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+struct test_uninitialized_copy_move
+{
+ template <typename Policy, typename InputIterator, typename OutputIterator>
+ void
+ operator()(Policy&& exec, InputIterator first, InputIterator last, OutputIterator out_first, size_t n,
+ /*is_trivial<T>=*/std::false_type)
+ {
+ typedef typename std::iterator_traits<InputIterator>::value_type T;
+ // it needs for cleaning memory that was filled by default constructors in unique_ptr<T[]> p(new T[n])
+ // and for cleaning memory after last calling of uninitialized_value_construct_n.
+ // It is important for non-trivial types
+ std::destroy_n(exec, out_first, n);
+
+ // reset counter of constructors
+ T::SetCount(0);
+ // run algorithm
+ std::uninitialized_copy(exec, first, last, out_first);
+ // compare counter of constructors to length of container
+ EXPECT_TRUE(T::Count() == n, "wrong uninitialized_copy");
+ // destroy objects for testing new algorithms on same memory
+ std::destroy_n(exec, out_first, n);
+
+ std::uninitialized_copy_n(exec, first, n, out_first);
+ EXPECT_TRUE(T::Count() == n, "wrong uninitialized_copy_n");
+ std::destroy_n(exec, out_first, n);
+
+ // For move
+ std::uninitialized_move(exec, first, last, out_first);
+ // compare counter of constructors to length of container
+ EXPECT_TRUE(T::MoveCount() == n, "wrong uninitialized_move");
+ // destroy objects for testing new algorithms on same memory
+ std::destroy_n(exec, out_first, n);
+
+ std::uninitialized_move_n(exec, first, n, out_first);
+ EXPECT_TRUE(T::MoveCount() == n, "wrong uninitialized_move_n");
+ std::destroy_n(exec, out_first, n);
+ }
+
+#if __PSTL_ICC_17_VC141_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN || __PSTL_ICC_16_VC14_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN
+ template <typename InputIterator, typename OutputIterator>
+ void
+ operator()(pstl::execution::unsequenced_policy, InputIterator first, InputIterator last, OutputIterator out_first,
+ size_t n, /*is_trivial<T>=*/std::true_type)
+ {
+ }
+ template <typename InputIterator, typename OutputIterator>
+ void
+ operator()(pstl::execution::parallel_unsequenced_policy, InputIterator first, InputIterator last,
+ OutputIterator out_first, size_t n, /*is_trivial<T>=*/std::true_type)
+ {
+ }
+#endif
+
+ template <typename Policy, typename InputIterator, typename OutputIterator>
+ void
+ operator()(Policy&& exec, InputIterator first, InputIterator last, OutputIterator out_first, size_t n,
+ /*is_trivial<T>=*/std::true_type)
+ {
+ typedef typename std::iterator_traits<InputIterator>::value_type T;
+
+ std::uninitialized_copy(exec, first, last, out_first);
+ EXPECT_TRUE(IsCheckValueCorrectness(first, out_first, n), "wrong uninitialized_copy");
+ std::destroy_n(exec, out_first, n);
+
+ std::uninitialized_copy_n(exec, first, n, out_first);
+ EXPECT_TRUE(IsCheckValueCorrectness(first, out_first, n), "wrong uninitialized_copy_n");
+ std::destroy_n(exec, out_first, n);
+
+ std::uninitialized_move(exec, first, last, out_first);
+ EXPECT_TRUE(IsCheckValueCorrectness(first, out_first, n), "wrong uninitialized_move");
+ std::destroy_n(exec, out_first, n);
+
+ std::uninitialized_move_n(exec, first, n, out_first);
+ EXPECT_TRUE(IsCheckValueCorrectness(first, out_first, n), "wrong uninitialized_move_n");
+ std::destroy_n(exec, out_first, n);
+ }
+};
+
+template <typename T>
+void
+test_uninitialized_copy_move_by_type()
+{
+ std::size_t N = 100000;
+ for (size_t n = 0; n <= N; n = n <= 16 ? n + 1 : size_t(3.1415 * n))
+ {
+ Sequence<T> in(n, [=](size_t k) -> T { return T(k); });
+ std::unique_ptr<T[]> p(new T[n]);
+ invoke_on_all_policies(test_uninitialized_copy_move(), in.begin(), in.end(), p.get(), n, std::is_trivial<T>());
+ }
+}
+
+int32_t
+main()
+{
+
+ // for trivial types
+ test_uninitialized_copy_move_by_type<int16_t>();
+ test_uninitialized_copy_move_by_type<float64_t>();
+
+ // for user-defined types
+#if !__PSTL_ICC_17_VC141_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN && !__PSTL_ICC_16_VC14_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN && \
+ !__PSTL_ICC_16_VC14_TEST_PAR_TBB_RT_RELEASE_64_BROKEN
+ test_uninitialized_copy_move_by_type<Wrapper<int8_t>>();
+#endif
+
+ std::cout << done() << std::endl;
+ return 0;
+}
OpenPOWER on IntegriCloud