| // -*- C++ -*- |
| //===----------------------------------------------------------------------===// |
| // |
| // 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 _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H |
| #define _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H |
| |
| #include <__config> |
| #include <__memory/addressof.h> |
| #include <__memory/construct_at.h> |
| #include <iterator> |
| #include <utility> |
| |
| #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
| #pragma GCC system_header |
| #endif |
| |
| _LIBCPP_BEGIN_NAMESPACE_STD |
| |
| template <class _InputIterator, class _ForwardIterator> |
| _ForwardIterator |
| uninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) |
| { |
| typedef typename iterator_traits<_ForwardIterator>::value_type value_type; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| _ForwardIterator __s = __r; |
| try |
| { |
| #endif |
| for (; __f != __l; ++__f, (void) ++__r) |
| ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f); |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } |
| catch (...) |
| { |
| for (; __s != __r; ++__s) |
| __s->~value_type(); |
| throw; |
| } |
| #endif |
| return __r; |
| } |
| |
| template <class _InputIterator, class _Size, class _ForwardIterator> |
| _ForwardIterator |
| uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) |
| { |
| typedef typename iterator_traits<_ForwardIterator>::value_type value_type; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| _ForwardIterator __s = __r; |
| try |
| { |
| #endif |
| for (; __n > 0; ++__f, (void) ++__r, (void) --__n) |
| ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f); |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } |
| catch (...) |
| { |
| for (; __s != __r; ++__s) |
| __s->~value_type(); |
| throw; |
| } |
| #endif |
| return __r; |
| } |
| |
| template <class _ForwardIterator, class _Tp> |
| void |
| uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) |
| { |
| typedef typename iterator_traits<_ForwardIterator>::value_type value_type; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| _ForwardIterator __s = __f; |
| try |
| { |
| #endif |
| for (; __f != __l; ++__f) |
| ::new ((void*)_VSTD::addressof(*__f)) value_type(__x); |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } |
| catch (...) |
| { |
| for (; __s != __f; ++__s) |
| __s->~value_type(); |
| throw; |
| } |
| #endif |
| } |
| |
| template <class _ForwardIterator, class _Size, class _Tp> |
| _ForwardIterator |
| uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) |
| { |
| typedef typename iterator_traits<_ForwardIterator>::value_type value_type; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| _ForwardIterator __s = __f; |
| try |
| { |
| #endif |
| for (; __n > 0; ++__f, (void) --__n) |
| ::new ((void*)_VSTD::addressof(*__f)) value_type(__x); |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } |
| catch (...) |
| { |
| for (; __s != __f; ++__s) |
| __s->~value_type(); |
| throw; |
| } |
| #endif |
| return __f; |
| } |
| |
| #if _LIBCPP_STD_VER > 14 |
| |
| template <class _ForwardIterator> |
| inline _LIBCPP_INLINE_VISIBILITY |
| void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { |
| using _Vt = typename iterator_traits<_ForwardIterator>::value_type; |
| auto __idx = __first; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| try { |
| #endif |
| for (; __idx != __last; ++__idx) |
| ::new ((void*)_VSTD::addressof(*__idx)) _Vt; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } catch (...) { |
| _VSTD::destroy(__first, __idx); |
| throw; |
| } |
| #endif |
| } |
| |
| template <class _ForwardIterator, class _Size> |
| inline _LIBCPP_INLINE_VISIBILITY |
| _ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { |
| using _Vt = typename iterator_traits<_ForwardIterator>::value_type; |
| auto __idx = __first; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| try { |
| #endif |
| for (; __n > 0; ++__idx, (void) --__n) |
| ::new ((void*)_VSTD::addressof(*__idx)) _Vt; |
| return __idx; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } catch (...) { |
| _VSTD::destroy(__first, __idx); |
| throw; |
| } |
| #endif |
| } |
| |
| |
| template <class _ForwardIterator> |
| inline _LIBCPP_INLINE_VISIBILITY |
| void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { |
| using _Vt = typename iterator_traits<_ForwardIterator>::value_type; |
| auto __idx = __first; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| try { |
| #endif |
| for (; __idx != __last; ++__idx) |
| ::new ((void*)_VSTD::addressof(*__idx)) _Vt(); |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } catch (...) { |
| _VSTD::destroy(__first, __idx); |
| throw; |
| } |
| #endif |
| } |
| |
| template <class _ForwardIterator, class _Size> |
| inline _LIBCPP_INLINE_VISIBILITY |
| _ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { |
| using _Vt = typename iterator_traits<_ForwardIterator>::value_type; |
| auto __idx = __first; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| try { |
| #endif |
| for (; __n > 0; ++__idx, (void) --__n) |
| ::new ((void*)_VSTD::addressof(*__idx)) _Vt(); |
| return __idx; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } catch (...) { |
| _VSTD::destroy(__first, __idx); |
| throw; |
| } |
| #endif |
| } |
| |
| |
| template <class _InputIt, class _ForwardIt> |
| inline _LIBCPP_INLINE_VISIBILITY |
| _ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { |
| using _Vt = typename iterator_traits<_ForwardIt>::value_type; |
| auto __idx = __first_res; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| try { |
| #endif |
| for (; __first != __last; ++__idx, (void) ++__first) |
| ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first)); |
| return __idx; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } catch (...) { |
| _VSTD::destroy(__first_res, __idx); |
| throw; |
| } |
| #endif |
| } |
| |
| template <class _InputIt, class _Size, class _ForwardIt> |
| inline _LIBCPP_INLINE_VISIBILITY |
| pair<_InputIt, _ForwardIt> |
| uninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { |
| using _Vt = typename iterator_traits<_ForwardIt>::value_type; |
| auto __idx = __first_res; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| try { |
| #endif |
| for (; __n > 0; ++__idx, (void) ++__first, --__n) |
| ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first)); |
| return {__first, __idx}; |
| #ifndef _LIBCPP_NO_EXCEPTIONS |
| } catch (...) { |
| _VSTD::destroy(__first_res, __idx); |
| throw; |
| } |
| #endif |
| } |
| |
| #endif // _LIBCPP_STD_VER > 14 |
| |
| _LIBCPP_END_NAMESPACE_STD |
| |
| #endif // _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H |