| // -*- C++ -*- | |
| //===-- memory_impl.h -----------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef _PSTL_MEMORY_IMPL_H | |
| #define _PSTL_MEMORY_IMPL_H | |
| #include <iterator> | |
| #include "unseq_backend_simd.h" | |
| namespace __pstl | |
| { | |
| namespace __internal | |
| { | |
| //------------------------------------------------------------------------ | |
| // uninitialized_move | |
| //------------------------------------------------------------------------ | |
| template <typename _ForwardIterator, typename _OutputIterator> | |
| _OutputIterator | |
| __brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, | |
| /*vector=*/std::false_type) noexcept | |
| { | |
| using _ValueType = typename std::iterator_traits<_OutputIterator>::value_type; | |
| for (; __first != __last; ++__first, (void) ++__result) | |
| { | |
| ::new (std::addressof(*__result)) _ValueType(std::move(*__first)); | |
| } | |
| return __result; | |
| } | |
| template <typename _RandomAccessIterator, typename _OutputIterator> | |
| _OutputIterator | |
| __brick_uninitialized_move(_RandomAccessIterator __first, _RandomAccessIterator __last, _OutputIterator __result, | |
| /*vector=*/std::true_type) noexcept | |
| { | |
| using __ValueType = typename std::iterator_traits<_OutputIterator>::value_type; | |
| using _ReferenceType1 = typename std::iterator_traits<_RandomAccessIterator>::reference; | |
| using _ReferenceType2 = typename std::iterator_traits<_OutputIterator>::reference; | |
| return __unseq_backend::__simd_walk_2( | |
| __first, __last - __first, __result, | |
| [](_ReferenceType1 __x, _ReferenceType2 __y) { ::new (std::addressof(__y)) __ValueType(std::move(__x)); }); | |
| } | |
| template <typename _Iterator> | |
| void | |
| __brick_destroy(_Iterator __first, _Iterator __last, /*vector*/ std::false_type) noexcept | |
| { | |
| using _ValueType = typename std::iterator_traits<_Iterator>::value_type; | |
| for (; __first != __last; ++__first) | |
| __first->~_ValueType(); | |
| } | |
| template <typename _RandomAccessIterator> | |
| void | |
| __brick_destroy(_RandomAccessIterator __first, _RandomAccessIterator __last, /*vector*/ std::true_type) noexcept | |
| { | |
| using _ValueType = typename std::iterator_traits<_RandomAccessIterator>::value_type; | |
| using _ReferenceType = typename std::iterator_traits<_RandomAccessIterator>::reference; | |
| __unseq_backend::__simd_walk_1(__first, __last - __first, [](_ReferenceType __x) { __x.~_ValueType(); }); | |
| } | |
| //------------------------------------------------------------------------ | |
| // uninitialized copy | |
| //------------------------------------------------------------------------ | |
| template <typename _ForwardIterator, typename _OutputIterator> | |
| _OutputIterator | |
| __brick_uninitialized_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, | |
| /*vector=*/std::false_type) noexcept | |
| { | |
| using _ValueType = typename std::iterator_traits<_OutputIterator>::value_type; | |
| for (; __first != __last; ++__first, (void) ++__result) | |
| { | |
| ::new (std::addressof(*__result)) _ValueType(*__first); | |
| } | |
| return __result; | |
| } | |
| template <typename _RandomAccessIterator, typename _OutputIterator> | |
| _OutputIterator | |
| __brick_uninitialized_copy(_RandomAccessIterator __first, _RandomAccessIterator __last, _OutputIterator __result, | |
| /*vector=*/std::true_type) noexcept | |
| { | |
| using __ValueType = typename std::iterator_traits<_OutputIterator>::value_type; | |
| using _ReferenceType1 = typename std::iterator_traits<_RandomAccessIterator>::reference; | |
| using _ReferenceType2 = typename std::iterator_traits<_OutputIterator>::reference; | |
| return __unseq_backend::__simd_walk_2( | |
| __first, __last - __first, __result, | |
| [](_ReferenceType1 __x, _ReferenceType2 __y) { ::new (std::addressof(__y)) __ValueType(__x); }); | |
| } | |
| } // namespace __internal | |
| } // namespace __pstl | |
| #endif /* _PSTL_MEMORY_IMPL_H */ |