13f630cffSKonstantin Varlamov // -*- C++ -*- 23f630cffSKonstantin Varlamov //===----------------------------------------------------------------------===// 33f630cffSKonstantin Varlamov // 43f630cffSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 53f630cffSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 63f630cffSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73f630cffSKonstantin Varlamov // 83f630cffSKonstantin Varlamov //===----------------------------------------------------------------------===// 93f630cffSKonstantin Varlamov 103f630cffSKonstantin Varlamov #ifndef _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H 113f630cffSKonstantin Varlamov #define _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H 123f630cffSKonstantin Varlamov 138d23b742SKonstantin Varlamov #include <__algorithm/in_out_result.h> 143f630cffSKonstantin Varlamov #include <__concepts/constructible.h> 153f630cffSKonstantin Varlamov #include <__config> 168d23b742SKonstantin Varlamov #include <__iterator/concepts.h> 173f630cffSKonstantin Varlamov #include <__iterator/incrementable_traits.h> 188d23b742SKonstantin Varlamov #include <__iterator/iter_move.h> 193f630cffSKonstantin Varlamov #include <__iterator/iterator_traits.h> 203f630cffSKonstantin Varlamov #include <__iterator/readable_traits.h> 213f630cffSKonstantin Varlamov #include <__memory/concepts.h> 223f630cffSKonstantin Varlamov #include <__memory/uninitialized_algorithms.h> 233f630cffSKonstantin Varlamov #include <__ranges/access.h> 243f630cffSKonstantin Varlamov #include <__ranges/concepts.h> 253f630cffSKonstantin Varlamov #include <__ranges/dangling.h> 26e0a66116SNikolas Klauser #include <__type_traits/remove_reference.h> 27754ea6fdSKonstantin Varlamov #include <__utility/move.h> 283f630cffSKonstantin Varlamov 293f630cffSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 303f630cffSKonstantin Varlamov # pragma GCC system_header 313f630cffSKonstantin Varlamov #endif 323f630cffSKonstantin Varlamov 337b462251SLouis Dionne _LIBCPP_PUSH_MACROS 347b462251SLouis Dionne #include <__undef_macros> 357b462251SLouis Dionne 363f630cffSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 373f630cffSKonstantin Varlamov 384f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 3953406fb6SArthur O'Dwyer 403f630cffSKonstantin Varlamov namespace ranges { 413f630cffSKonstantin Varlamov 423f630cffSKonstantin Varlamov // uninitialized_default_construct 433f630cffSKonstantin Varlamov 44*d10dc5a0SChristopher Di Bella struct __uninitialized_default_construct { 459783f28cSLouis Dionne template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel> 463f630cffSKonstantin Varlamov requires default_initializable<iter_value_t<_ForwardIterator>> 4783ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const { 483f630cffSKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>; 499783f28cSLouis Dionne return std::__uninitialized_default_construct<_ValueType>(std::move(__first), std::move(__last)); 503f630cffSKonstantin Varlamov } 513f630cffSKonstantin Varlamov 523f630cffSKonstantin Varlamov template <__nothrow_forward_range _ForwardRange> 533f630cffSKonstantin Varlamov requires default_initializable<range_value_t<_ForwardRange>> 5483ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const { 553f630cffSKonstantin Varlamov return (*this)(ranges::begin(__range), ranges::end(__range)); 563f630cffSKonstantin Varlamov } 573f630cffSKonstantin Varlamov }; 583f630cffSKonstantin Varlamov 593f630cffSKonstantin Varlamov inline namespace __cpo { 60*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_default_construct = __uninitialized_default_construct{}; 613f630cffSKonstantin Varlamov } // namespace __cpo 623f630cffSKonstantin Varlamov 633f630cffSKonstantin Varlamov // uninitialized_default_construct_n 643f630cffSKonstantin Varlamov 65*d10dc5a0SChristopher Di Bella struct __uninitialized_default_construct_n { 663f630cffSKonstantin Varlamov template <__nothrow_forward_iterator _ForwardIterator> 673f630cffSKonstantin Varlamov requires default_initializable<iter_value_t<_ForwardIterator>> 689783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardIterator 699783f28cSLouis Dionne operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n) const { 703f630cffSKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>; 7177a00c0dSLouis Dionne return std::__uninitialized_default_construct_n<_ValueType>(std::move(__first), __n); 723f630cffSKonstantin Varlamov } 733f630cffSKonstantin Varlamov }; 743f630cffSKonstantin Varlamov 753f630cffSKonstantin Varlamov inline namespace __cpo { 76*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_default_construct_n = __uninitialized_default_construct_n{}; 773f630cffSKonstantin Varlamov } // namespace __cpo 783f630cffSKonstantin Varlamov 79754ea6fdSKonstantin Varlamov // uninitialized_value_construct 80754ea6fdSKonstantin Varlamov 81*d10dc5a0SChristopher Di Bella struct __uninitialized_value_construct { 829783f28cSLouis Dionne template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel> 83754ea6fdSKonstantin Varlamov requires default_initializable<iter_value_t<_ForwardIterator>> 8483ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const { 85754ea6fdSKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>; 869783f28cSLouis Dionne return std::__uninitialized_value_construct<_ValueType>(std::move(__first), std::move(__last)); 87754ea6fdSKonstantin Varlamov } 88754ea6fdSKonstantin Varlamov 89754ea6fdSKonstantin Varlamov template <__nothrow_forward_range _ForwardRange> 90754ea6fdSKonstantin Varlamov requires default_initializable<range_value_t<_ForwardRange>> 9183ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const { 92754ea6fdSKonstantin Varlamov return (*this)(ranges::begin(__range), ranges::end(__range)); 93754ea6fdSKonstantin Varlamov } 94754ea6fdSKonstantin Varlamov }; 95754ea6fdSKonstantin Varlamov 96754ea6fdSKonstantin Varlamov inline namespace __cpo { 97*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_value_construct = __uninitialized_value_construct{}; 98754ea6fdSKonstantin Varlamov } // namespace __cpo 99754ea6fdSKonstantin Varlamov 100754ea6fdSKonstantin Varlamov // uninitialized_value_construct_n 101754ea6fdSKonstantin Varlamov 102*d10dc5a0SChristopher Di Bella struct __uninitialized_value_construct_n { 103754ea6fdSKonstantin Varlamov template <__nothrow_forward_iterator _ForwardIterator> 104754ea6fdSKonstantin Varlamov requires default_initializable<iter_value_t<_ForwardIterator>> 1059783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardIterator 1069783f28cSLouis Dionne operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n) const { 107754ea6fdSKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>; 10877a00c0dSLouis Dionne return std::__uninitialized_value_construct_n<_ValueType>(std::move(__first), __n); 109754ea6fdSKonstantin Varlamov } 110754ea6fdSKonstantin Varlamov }; 111754ea6fdSKonstantin Varlamov 112754ea6fdSKonstantin Varlamov inline namespace __cpo { 113*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_value_construct_n = __uninitialized_value_construct_n{}; 114754ea6fdSKonstantin Varlamov } // namespace __cpo 115754ea6fdSKonstantin Varlamov 116754ea6fdSKonstantin Varlamov // uninitialized_fill 117754ea6fdSKonstantin Varlamov 118*d10dc5a0SChristopher Di Bella struct __uninitialized_fill { 1199783f28cSLouis Dionne template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel, class _Tp> 120754ea6fdSKonstantin Varlamov requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&> 12183ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last, const _Tp& __x) const { 122754ea6fdSKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>; 12377a00c0dSLouis Dionne return std::__uninitialized_fill<_ValueType>(std::move(__first), std::move(__last), __x); 124754ea6fdSKonstantin Varlamov } 125754ea6fdSKonstantin Varlamov 126754ea6fdSKonstantin Varlamov template <__nothrow_forward_range _ForwardRange, class _Tp> 127754ea6fdSKonstantin Varlamov requires constructible_from<range_value_t<_ForwardRange>, const _Tp&> 12883ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range, const _Tp& __x) const { 129754ea6fdSKonstantin Varlamov return (*this)(ranges::begin(__range), ranges::end(__range), __x); 130754ea6fdSKonstantin Varlamov } 131754ea6fdSKonstantin Varlamov }; 132754ea6fdSKonstantin Varlamov 133754ea6fdSKonstantin Varlamov inline namespace __cpo { 134*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_fill = __uninitialized_fill{}; 135754ea6fdSKonstantin Varlamov } // namespace __cpo 136754ea6fdSKonstantin Varlamov 137754ea6fdSKonstantin Varlamov // uninitialized_fill_n 138754ea6fdSKonstantin Varlamov 139*d10dc5a0SChristopher Di Bella struct __uninitialized_fill_n { 140754ea6fdSKonstantin Varlamov template <__nothrow_forward_iterator _ForwardIterator, class _Tp> 141754ea6fdSKonstantin Varlamov requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&> 1429783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardIterator 1439783f28cSLouis Dionne operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n, const _Tp& __x) const { 144754ea6fdSKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>; 14577a00c0dSLouis Dionne return std::__uninitialized_fill_n<_ValueType>(std::move(__first), __n, __x); 146754ea6fdSKonstantin Varlamov } 147754ea6fdSKonstantin Varlamov }; 148754ea6fdSKonstantin Varlamov 149754ea6fdSKonstantin Varlamov inline namespace __cpo { 150*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_fill_n = __uninitialized_fill_n{}; 151754ea6fdSKonstantin Varlamov } // namespace __cpo 152754ea6fdSKonstantin Varlamov 1538d23b742SKonstantin Varlamov // uninitialized_copy 1548d23b742SKonstantin Varlamov 1558d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator> 1568d23b742SKonstantin Varlamov using uninitialized_copy_result = in_out_result<_InputIterator, _OutputIterator>; 1578d23b742SKonstantin Varlamov 158*d10dc5a0SChristopher Di Bella struct __uninitialized_copy { 1598d23b742SKonstantin Varlamov template <input_iterator _InputIterator, 1608d23b742SKonstantin Varlamov sentinel_for<_InputIterator> _Sentinel1, 1618d23b742SKonstantin Varlamov __nothrow_forward_iterator _OutputIterator, 1628d23b742SKonstantin Varlamov __nothrow_sentinel_for<_OutputIterator> _Sentinel2> 1638d23b742SKonstantin Varlamov requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>> 16483ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<_InputIterator, _OutputIterator> 1658d23b742SKonstantin Varlamov operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const { 1668d23b742SKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>; 1678d23b742SKonstantin Varlamov 16802540b2fSLouis Dionne auto __stop_copying = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; }; 1697961fa36SLouis Dionne auto __result = std::__uninitialized_copy<_ValueType>( 1707961fa36SLouis Dionne std::move(__ifirst), std::move(__ilast), std::move(__ofirst), __stop_copying); 17177a00c0dSLouis Dionne return {std::move(__result.first), std::move(__result.second)}; 1728d23b742SKonstantin Varlamov } 1738d23b742SKonstantin Varlamov 1748d23b742SKonstantin Varlamov template <input_range _InputRange, __nothrow_forward_range _OutputRange> 1758d23b742SKonstantin Varlamov requires constructible_from<range_value_t<_OutputRange>, range_reference_t<_InputRange>> 17683ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>> 1778d23b742SKonstantin Varlamov operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const { 1789783f28cSLouis Dionne return (*this)( 1799783f28cSLouis Dionne ranges::begin(__in_range), ranges::end(__in_range), ranges::begin(__out_range), ranges::end(__out_range)); 1808d23b742SKonstantin Varlamov } 1818d23b742SKonstantin Varlamov }; 1828d23b742SKonstantin Varlamov 1838d23b742SKonstantin Varlamov inline namespace __cpo { 184*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_copy = __uninitialized_copy{}; 1858d23b742SKonstantin Varlamov } // namespace __cpo 1868d23b742SKonstantin Varlamov 1878d23b742SKonstantin Varlamov // uninitialized_copy_n 1888d23b742SKonstantin Varlamov 1898d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator> 1908d23b742SKonstantin Varlamov using uninitialized_copy_n_result = in_out_result<_InputIterator, _OutputIterator>; 1918d23b742SKonstantin Varlamov 192*d10dc5a0SChristopher Di Bella struct __uninitialized_copy_n { 1938d23b742SKonstantin Varlamov template <input_iterator _InputIterator, 1948d23b742SKonstantin Varlamov __nothrow_forward_iterator _OutputIterator, 1958d23b742SKonstantin Varlamov __nothrow_sentinel_for<_OutputIterator> _Sentinel> 1968d23b742SKonstantin Varlamov requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>> 19783ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI uninitialized_copy_n_result<_InputIterator, _OutputIterator> 1989783f28cSLouis Dionne operator()(_InputIterator __ifirst, 1999783f28cSLouis Dionne iter_difference_t<_InputIterator> __n, 2009783f28cSLouis Dionne _OutputIterator __ofirst, 2019783f28cSLouis Dionne _Sentinel __olast) const { 2028d23b742SKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>; 20302540b2fSLouis Dionne auto __stop_copying = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; }; 2047961fa36SLouis Dionne auto __result = 2057961fa36SLouis Dionne std::__uninitialized_copy_n<_ValueType>(std::move(__ifirst), __n, std::move(__ofirst), __stop_copying); 20677a00c0dSLouis Dionne return {std::move(__result.first), std::move(__result.second)}; 2078d23b742SKonstantin Varlamov } 2088d23b742SKonstantin Varlamov }; 2098d23b742SKonstantin Varlamov 2108d23b742SKonstantin Varlamov inline namespace __cpo { 211*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_copy_n = __uninitialized_copy_n{}; 2128d23b742SKonstantin Varlamov } // namespace __cpo 2138d23b742SKonstantin Varlamov 2148d23b742SKonstantin Varlamov // uninitialized_move 2158d23b742SKonstantin Varlamov 2168d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator> 2178d23b742SKonstantin Varlamov using uninitialized_move_result = in_out_result<_InputIterator, _OutputIterator>; 2188d23b742SKonstantin Varlamov 219*d10dc5a0SChristopher Di Bella struct __uninitialized_move { 2208d23b742SKonstantin Varlamov template <input_iterator _InputIterator, 2218d23b742SKonstantin Varlamov sentinel_for<_InputIterator> _Sentinel1, 2228d23b742SKonstantin Varlamov __nothrow_forward_iterator _OutputIterator, 2238d23b742SKonstantin Varlamov __nothrow_sentinel_for<_OutputIterator> _Sentinel2> 224dff3eba7SNikolas Klauser requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>> 22583ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI uninitialized_move_result<_InputIterator, _OutputIterator> 2268d23b742SKonstantin Varlamov operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const { 2278d23b742SKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>; 2288d23b742SKonstantin Varlamov auto __iter_move = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); }; 22902540b2fSLouis Dionne auto __stop_moving = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; }; 2307961fa36SLouis Dionne auto __result = std::__uninitialized_move<_ValueType>( 2317961fa36SLouis Dionne std::move(__ifirst), std::move(__ilast), std::move(__ofirst), __stop_moving, __iter_move); 23277a00c0dSLouis Dionne return {std::move(__result.first), std::move(__result.second)}; 2338d23b742SKonstantin Varlamov } 2348d23b742SKonstantin Varlamov 2358d23b742SKonstantin Varlamov template <input_range _InputRange, __nothrow_forward_range _OutputRange> 236dff3eba7SNikolas Klauser requires constructible_from<range_value_t<_OutputRange>, range_rvalue_reference_t<_InputRange>> 23783ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI uninitialized_move_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>> 2388d23b742SKonstantin Varlamov operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const { 2399783f28cSLouis Dionne return (*this)( 2409783f28cSLouis Dionne ranges::begin(__in_range), ranges::end(__in_range), ranges::begin(__out_range), ranges::end(__out_range)); 2418d23b742SKonstantin Varlamov } 2428d23b742SKonstantin Varlamov }; 2438d23b742SKonstantin Varlamov 2448d23b742SKonstantin Varlamov inline namespace __cpo { 245*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_move = __uninitialized_move{}; 2468d23b742SKonstantin Varlamov } // namespace __cpo 2478d23b742SKonstantin Varlamov 2488d23b742SKonstantin Varlamov // uninitialized_move_n 2498d23b742SKonstantin Varlamov 2508d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator> 2518d23b742SKonstantin Varlamov using uninitialized_move_n_result = in_out_result<_InputIterator, _OutputIterator>; 2528d23b742SKonstantin Varlamov 253*d10dc5a0SChristopher Di Bella struct __uninitialized_move_n { 2548d23b742SKonstantin Varlamov template <input_iterator _InputIterator, 2558d23b742SKonstantin Varlamov __nothrow_forward_iterator _OutputIterator, 2568d23b742SKonstantin Varlamov __nothrow_sentinel_for<_OutputIterator> _Sentinel> 257dff3eba7SNikolas Klauser requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>> 25883ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI uninitialized_move_n_result<_InputIterator, _OutputIterator> 2599783f28cSLouis Dionne operator()(_InputIterator __ifirst, 2609783f28cSLouis Dionne iter_difference_t<_InputIterator> __n, 2619783f28cSLouis Dionne _OutputIterator __ofirst, 2629783f28cSLouis Dionne _Sentinel __olast) const { 2638d23b742SKonstantin Varlamov using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>; 2648d23b742SKonstantin Varlamov auto __iter_move = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); }; 26502540b2fSLouis Dionne auto __stop_moving = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; }; 2667961fa36SLouis Dionne auto __result = std::__uninitialized_move_n<_ValueType>( 2677961fa36SLouis Dionne std::move(__ifirst), __n, std::move(__ofirst), __stop_moving, __iter_move); 26877a00c0dSLouis Dionne return {std::move(__result.first), std::move(__result.second)}; 2698d23b742SKonstantin Varlamov } 2708d23b742SKonstantin Varlamov }; 2718d23b742SKonstantin Varlamov 2728d23b742SKonstantin Varlamov inline namespace __cpo { 273*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_move_n = __uninitialized_move_n{}; 2748d23b742SKonstantin Varlamov } // namespace __cpo 2758d23b742SKonstantin Varlamov 2763f630cffSKonstantin Varlamov } // namespace ranges 27753406fb6SArthur O'Dwyer 2784f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 2793f630cffSKonstantin Varlamov 2803f630cffSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 2813f630cffSKonstantin Varlamov 2827b462251SLouis Dionne _LIBCPP_POP_MACROS 2837b462251SLouis Dionne 2843f630cffSKonstantin Varlamov #endif // _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H 285