1 | // -*- C++ -*-
|
---|
2 | //===-- memory_impl.h -----------------------------------------------------===//
|
---|
3 | //
|
---|
4 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
---|
5 | // See https://llvm.org/LICENSE.txt for license information.
|
---|
6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
---|
7 | //
|
---|
8 | //===----------------------------------------------------------------------===//
|
---|
9 |
|
---|
10 | #ifndef _PSTL_MEMORY_IMPL_H
|
---|
11 | #define _PSTL_MEMORY_IMPL_H
|
---|
12 |
|
---|
13 | #include <iterator>
|
---|
14 |
|
---|
15 | #include "unseq_backend_simd.h"
|
---|
16 |
|
---|
17 | namespace __pstl
|
---|
18 | {
|
---|
19 | namespace __internal
|
---|
20 | {
|
---|
21 |
|
---|
22 | //------------------------------------------------------------------------
|
---|
23 | // uninitialized_move
|
---|
24 | //------------------------------------------------------------------------
|
---|
25 |
|
---|
26 | template <typename _ForwardIterator, typename _OutputIterator>
|
---|
27 | _OutputIterator
|
---|
28 | __brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
---|
29 | /*vector=*/std::false_type) noexcept
|
---|
30 | {
|
---|
31 | using _ValueType = typename std::iterator_traits<_OutputIterator>::value_type;
|
---|
32 | for (; __first != __last; ++__first, ++__result)
|
---|
33 | {
|
---|
34 | ::new (std::addressof(*__result)) _ValueType(std::move(*__first));
|
---|
35 | }
|
---|
36 | return __result;
|
---|
37 | }
|
---|
38 |
|
---|
39 | template <typename _ForwardIterator, typename _OutputIterator>
|
---|
40 | _OutputIterator
|
---|
41 | __brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
---|
42 | /*vector=*/std::true_type) noexcept
|
---|
43 | {
|
---|
44 | using __ValueType = typename std::iterator_traits<_OutputIterator>::value_type;
|
---|
45 | using _ReferenceType1 = typename std::iterator_traits<_ForwardIterator>::reference;
|
---|
46 | using _ReferenceType2 = typename std::iterator_traits<_OutputIterator>::reference;
|
---|
47 |
|
---|
48 | return __unseq_backend::__simd_walk_2(
|
---|
49 | __first, __last - __first, __result,
|
---|
50 | [](_ReferenceType1 __x, _ReferenceType2 __y) { ::new (std::addressof(__y)) __ValueType(std::move(__x)); });
|
---|
51 | }
|
---|
52 |
|
---|
53 | template <typename _Iterator>
|
---|
54 | void
|
---|
55 | __brick_destroy(_Iterator __first, _Iterator __last, /*vector*/ std::false_type) noexcept
|
---|
56 | {
|
---|
57 | using _ValueType = typename std::iterator_traits<_Iterator>::value_type;
|
---|
58 |
|
---|
59 | for (; __first != __last; ++__first)
|
---|
60 | __first->~_ValueType();
|
---|
61 | }
|
---|
62 |
|
---|
63 | template <typename _Iterator>
|
---|
64 | void
|
---|
65 | __brick_destroy(_Iterator __first, _Iterator __last, /*vector*/ std::true_type) noexcept
|
---|
66 | {
|
---|
67 | using _ValueType = typename std::iterator_traits<_Iterator>::value_type;
|
---|
68 | using _ReferenceType = typename std::iterator_traits<_Iterator>::reference;
|
---|
69 |
|
---|
70 | __unseq_backend::__simd_walk_1(__first, __last - __first, [](_ReferenceType __x) { __x.~_ValueType(); });
|
---|
71 | }
|
---|
72 |
|
---|
73 | //------------------------------------------------------------------------
|
---|
74 | // uninitialized copy
|
---|
75 | //------------------------------------------------------------------------
|
---|
76 |
|
---|
77 | template <typename _ForwardIterator, typename _OutputIterator>
|
---|
78 | _OutputIterator
|
---|
79 | __brick_uninitialized_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
---|
80 | /*vector=*/std::false_type) noexcept
|
---|
81 | {
|
---|
82 | using _ValueType = typename std::iterator_traits<_OutputIterator>::value_type;
|
---|
83 | for (; __first != __last; ++__first, ++__result)
|
---|
84 | {
|
---|
85 | ::new (std::addressof(*__result)) _ValueType(*__first);
|
---|
86 | }
|
---|
87 | return __result;
|
---|
88 | }
|
---|
89 |
|
---|
90 | template <typename _ForwardIterator, typename _OutputIterator>
|
---|
91 | _OutputIterator
|
---|
92 | __brick_uninitialized_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
---|
93 | /*vector=*/std::true_type) noexcept
|
---|
94 | {
|
---|
95 | using __ValueType = typename std::iterator_traits<_OutputIterator>::value_type;
|
---|
96 | using _ReferenceType1 = typename std::iterator_traits<_ForwardIterator>::reference;
|
---|
97 | using _ReferenceType2 = typename std::iterator_traits<_OutputIterator>::reference;
|
---|
98 |
|
---|
99 | return __unseq_backend::__simd_walk_2(
|
---|
100 | __first, __last - __first, __result,
|
---|
101 | [](_ReferenceType1 __x, _ReferenceType2 __y) { ::new (std::addressof(__y)) __ValueType(__x); });
|
---|
102 | }
|
---|
103 |
|
---|
104 | } // namespace __internal
|
---|
105 | } // namespace __pstl
|
---|
106 |
|
---|
107 | #endif /* _PSTL_MEMORY_IMPL_H */
|
---|