brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.1 KiB · 57a7a46 Raw
285 lines · c
1// -*- C++ -*-2//===----------------------------------------------------------------------===//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-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H11#define _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H12 13#include <__algorithm/in_out_result.h>14#include <__concepts/constructible.h>15#include <__config>16#include <__iterator/concepts.h>17#include <__iterator/incrementable_traits.h>18#include <__iterator/iter_move.h>19#include <__iterator/iterator_traits.h>20#include <__iterator/readable_traits.h>21#include <__memory/concepts.h>22#include <__memory/uninitialized_algorithms.h>23#include <__ranges/access.h>24#include <__ranges/concepts.h>25#include <__ranges/dangling.h>26#include <__type_traits/remove_reference.h>27#include <__utility/move.h>28 29#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)30#  pragma GCC system_header31#endif32 33_LIBCPP_PUSH_MACROS34#include <__undef_macros>35 36_LIBCPP_BEGIN_NAMESPACE_STD37 38#if _LIBCPP_STD_VER >= 2039 40namespace ranges {41 42// uninitialized_default_construct43 44struct __uninitialized_default_construct {45  template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel>46    requires default_initializable<iter_value_t<_ForwardIterator>>47  _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const {48    using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;49    return std::__uninitialized_default_construct<_ValueType>(std::move(__first), std::move(__last));50  }51 52  template <__nothrow_forward_range _ForwardRange>53    requires default_initializable<range_value_t<_ForwardRange>>54  _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const {55    return (*this)(ranges::begin(__range), ranges::end(__range));56  }57};58 59inline namespace __cpo {60inline constexpr auto uninitialized_default_construct = __uninitialized_default_construct{};61} // namespace __cpo62 63// uninitialized_default_construct_n64 65struct __uninitialized_default_construct_n {66  template <__nothrow_forward_iterator _ForwardIterator>67    requires default_initializable<iter_value_t<_ForwardIterator>>68  _LIBCPP_HIDE_FROM_ABI _ForwardIterator69  operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n) const {70    using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;71    return std::__uninitialized_default_construct_n<_ValueType>(std::move(__first), __n);72  }73};74 75inline namespace __cpo {76inline constexpr auto uninitialized_default_construct_n = __uninitialized_default_construct_n{};77} // namespace __cpo78 79// uninitialized_value_construct80 81struct __uninitialized_value_construct {82  template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel>83    requires default_initializable<iter_value_t<_ForwardIterator>>84  _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const {85    using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;86    return std::__uninitialized_value_construct<_ValueType>(std::move(__first), std::move(__last));87  }88 89  template <__nothrow_forward_range _ForwardRange>90    requires default_initializable<range_value_t<_ForwardRange>>91  _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const {92    return (*this)(ranges::begin(__range), ranges::end(__range));93  }94};95 96inline namespace __cpo {97inline constexpr auto uninitialized_value_construct = __uninitialized_value_construct{};98} // namespace __cpo99 100// uninitialized_value_construct_n101 102struct __uninitialized_value_construct_n {103  template <__nothrow_forward_iterator _ForwardIterator>104    requires default_initializable<iter_value_t<_ForwardIterator>>105  _LIBCPP_HIDE_FROM_ABI _ForwardIterator106  operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n) const {107    using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;108    return std::__uninitialized_value_construct_n<_ValueType>(std::move(__first), __n);109  }110};111 112inline namespace __cpo {113inline constexpr auto uninitialized_value_construct_n = __uninitialized_value_construct_n{};114} // namespace __cpo115 116// uninitialized_fill117 118struct __uninitialized_fill {119  template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel, class _Tp>120    requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&>121  _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last, const _Tp& __x) const {122    using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;123    return std::__uninitialized_fill<_ValueType>(std::move(__first), std::move(__last), __x);124  }125 126  template <__nothrow_forward_range _ForwardRange, class _Tp>127    requires constructible_from<range_value_t<_ForwardRange>, const _Tp&>128  _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range, const _Tp& __x) const {129    return (*this)(ranges::begin(__range), ranges::end(__range), __x);130  }131};132 133inline namespace __cpo {134inline constexpr auto uninitialized_fill = __uninitialized_fill{};135} // namespace __cpo136 137// uninitialized_fill_n138 139struct __uninitialized_fill_n {140  template <__nothrow_forward_iterator _ForwardIterator, class _Tp>141    requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&>142  _LIBCPP_HIDE_FROM_ABI _ForwardIterator143  operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n, const _Tp& __x) const {144    using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;145    return std::__uninitialized_fill_n<_ValueType>(std::move(__first), __n, __x);146  }147};148 149inline namespace __cpo {150inline constexpr auto uninitialized_fill_n = __uninitialized_fill_n{};151} // namespace __cpo152 153// uninitialized_copy154 155template <class _InputIterator, class _OutputIterator>156using uninitialized_copy_result = in_out_result<_InputIterator, _OutputIterator>;157 158struct __uninitialized_copy {159  template <input_iterator _InputIterator,160            sentinel_for<_InputIterator> _Sentinel1,161            __nothrow_forward_iterator _OutputIterator,162            __nothrow_sentinel_for<_OutputIterator> _Sentinel2>163    requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>>164  _LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<_InputIterator, _OutputIterator>165  operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const {166    using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>;167 168    auto __stop_copying = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };169    auto __result       = std::__uninitialized_copy<_ValueType>(170        std::move(__ifirst), std::move(__ilast), std::move(__ofirst), __stop_copying);171    return {std::move(__result.first), std::move(__result.second)};172  }173 174  template <input_range _InputRange, __nothrow_forward_range _OutputRange>175    requires constructible_from<range_value_t<_OutputRange>, range_reference_t<_InputRange>>176  _LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>>177  operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const {178    return (*this)(179        ranges::begin(__in_range), ranges::end(__in_range), ranges::begin(__out_range), ranges::end(__out_range));180  }181};182 183inline namespace __cpo {184inline constexpr auto uninitialized_copy = __uninitialized_copy{};185} // namespace __cpo186 187// uninitialized_copy_n188 189template <class _InputIterator, class _OutputIterator>190using uninitialized_copy_n_result = in_out_result<_InputIterator, _OutputIterator>;191 192struct __uninitialized_copy_n {193  template <input_iterator _InputIterator,194            __nothrow_forward_iterator _OutputIterator,195            __nothrow_sentinel_for<_OutputIterator> _Sentinel>196    requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>>197  _LIBCPP_HIDE_FROM_ABI uninitialized_copy_n_result<_InputIterator, _OutputIterator>198  operator()(_InputIterator __ifirst,199             iter_difference_t<_InputIterator> __n,200             _OutputIterator __ofirst,201             _Sentinel __olast) const {202    using _ValueType    = remove_reference_t<iter_reference_t<_OutputIterator>>;203    auto __stop_copying = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };204    auto __result =205        std::__uninitialized_copy_n<_ValueType>(std::move(__ifirst), __n, std::move(__ofirst), __stop_copying);206    return {std::move(__result.first), std::move(__result.second)};207  }208};209 210inline namespace __cpo {211inline constexpr auto uninitialized_copy_n = __uninitialized_copy_n{};212} // namespace __cpo213 214// uninitialized_move215 216template <class _InputIterator, class _OutputIterator>217using uninitialized_move_result = in_out_result<_InputIterator, _OutputIterator>;218 219struct __uninitialized_move {220  template <input_iterator _InputIterator,221            sentinel_for<_InputIterator> _Sentinel1,222            __nothrow_forward_iterator _OutputIterator,223            __nothrow_sentinel_for<_OutputIterator> _Sentinel2>224    requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>>225  _LIBCPP_HIDE_FROM_ABI uninitialized_move_result<_InputIterator, _OutputIterator>226  operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const {227    using _ValueType   = remove_reference_t<iter_reference_t<_OutputIterator>>;228    auto __iter_move   = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); };229    auto __stop_moving = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };230    auto __result      = std::__uninitialized_move<_ValueType>(231        std::move(__ifirst), std::move(__ilast), std::move(__ofirst), __stop_moving, __iter_move);232    return {std::move(__result.first), std::move(__result.second)};233  }234 235  template <input_range _InputRange, __nothrow_forward_range _OutputRange>236    requires constructible_from<range_value_t<_OutputRange>, range_rvalue_reference_t<_InputRange>>237  _LIBCPP_HIDE_FROM_ABI uninitialized_move_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>>238  operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const {239    return (*this)(240        ranges::begin(__in_range), ranges::end(__in_range), ranges::begin(__out_range), ranges::end(__out_range));241  }242};243 244inline namespace __cpo {245inline constexpr auto uninitialized_move = __uninitialized_move{};246} // namespace __cpo247 248// uninitialized_move_n249 250template <class _InputIterator, class _OutputIterator>251using uninitialized_move_n_result = in_out_result<_InputIterator, _OutputIterator>;252 253struct __uninitialized_move_n {254  template <input_iterator _InputIterator,255            __nothrow_forward_iterator _OutputIterator,256            __nothrow_sentinel_for<_OutputIterator> _Sentinel>257    requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>>258  _LIBCPP_HIDE_FROM_ABI uninitialized_move_n_result<_InputIterator, _OutputIterator>259  operator()(_InputIterator __ifirst,260             iter_difference_t<_InputIterator> __n,261             _OutputIterator __ofirst,262             _Sentinel __olast) const {263    using _ValueType   = remove_reference_t<iter_reference_t<_OutputIterator>>;264    auto __iter_move   = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); };265    auto __stop_moving = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };266    auto __result      = std::__uninitialized_move_n<_ValueType>(267        std::move(__ifirst), __n, std::move(__ofirst), __stop_moving, __iter_move);268    return {std::move(__result.first), std::move(__result.second)};269  }270};271 272inline namespace __cpo {273inline constexpr auto uninitialized_move_n = __uninitialized_move_n{};274} // namespace __cpo275 276} // namespace ranges277 278#endif // _LIBCPP_STD_VER >= 20279 280_LIBCPP_END_NAMESPACE_STD281 282_LIBCPP_POP_MACROS283 284#endif // _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H285