104eeddc0SDimitry Andric // -*- C++ -*- 204eeddc0SDimitry Andric //===----------------------------------------------------------------------===// 304eeddc0SDimitry Andric // 404eeddc0SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 504eeddc0SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 604eeddc0SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 704eeddc0SDimitry Andric // 804eeddc0SDimitry Andric //===----------------------------------------------------------------------===// 904eeddc0SDimitry Andric 1004eeddc0SDimitry Andric #ifndef _LIBCPP___MEMORY_RANGES_CONSTRUCT_AT_H 1104eeddc0SDimitry Andric #define _LIBCPP___MEMORY_RANGES_CONSTRUCT_AT_H 1204eeddc0SDimitry Andric 1304eeddc0SDimitry Andric #include <__concepts/destructible.h> 1404eeddc0SDimitry Andric #include <__config> 1504eeddc0SDimitry Andric #include <__iterator/incrementable_traits.h> 1606c3fb27SDimitry Andric #include <__iterator/iterator_traits.h> 1704eeddc0SDimitry Andric #include <__memory/concepts.h> 1804eeddc0SDimitry Andric #include <__memory/construct_at.h> 1904eeddc0SDimitry Andric #include <__ranges/access.h> 2004eeddc0SDimitry Andric #include <__ranges/concepts.h> 2104eeddc0SDimitry Andric #include <__ranges/dangling.h> 2204eeddc0SDimitry Andric #include <__utility/declval.h> 2304eeddc0SDimitry Andric #include <__utility/forward.h> 2404eeddc0SDimitry Andric #include <__utility/move.h> 25bdd1243dSDimitry Andric #include <new> 2604eeddc0SDimitry Andric 2704eeddc0SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2804eeddc0SDimitry Andric # pragma GCC system_header 2904eeddc0SDimitry Andric #endif 3004eeddc0SDimitry Andric 3106c3fb27SDimitry Andric _LIBCPP_PUSH_MACROS 3206c3fb27SDimitry Andric #include <__undef_macros> 3306c3fb27SDimitry Andric 3404eeddc0SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 3504eeddc0SDimitry Andric 3606c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20 3704eeddc0SDimitry Andric namespace ranges { 3804eeddc0SDimitry Andric 3904eeddc0SDimitry Andric // construct_at 4004eeddc0SDimitry Andric 4104eeddc0SDimitry Andric namespace __construct_at { 4204eeddc0SDimitry Andric 4304eeddc0SDimitry Andric struct __fn { 44*cb14a3feSDimitry Andric template <class _Tp, class... _Args, class = decltype(::new(std::declval<void*>()) _Tp(std::declval<_Args>()...))> operator__fn45*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Tp* operator()(_Tp* __location, _Args&&... __args) const { 465f757f3fSDimitry Andric return std::construct_at(__location, std::forward<_Args>(__args)...); 4704eeddc0SDimitry Andric } 4804eeddc0SDimitry Andric }; 4904eeddc0SDimitry Andric 5004eeddc0SDimitry Andric } // namespace __construct_at 5104eeddc0SDimitry Andric 5204eeddc0SDimitry Andric inline namespace __cpo { 5304eeddc0SDimitry Andric inline constexpr auto construct_at = __construct_at::__fn{}; 5404eeddc0SDimitry Andric } // namespace __cpo 5504eeddc0SDimitry Andric 5604eeddc0SDimitry Andric // destroy_at 5704eeddc0SDimitry Andric 5804eeddc0SDimitry Andric namespace __destroy_at { 5904eeddc0SDimitry Andric 6004eeddc0SDimitry Andric struct __fn { 6104eeddc0SDimitry Andric template <destructible _Tp> operator__fn62*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr void operator()(_Tp* __location) const noexcept { 635f757f3fSDimitry Andric std::destroy_at(__location); 6404eeddc0SDimitry Andric } 6504eeddc0SDimitry Andric }; 6604eeddc0SDimitry Andric 6704eeddc0SDimitry Andric } // namespace __destroy_at 6804eeddc0SDimitry Andric 6904eeddc0SDimitry Andric inline namespace __cpo { 7004eeddc0SDimitry Andric inline constexpr auto destroy_at = __destroy_at::__fn{}; 7104eeddc0SDimitry Andric } // namespace __cpo 7204eeddc0SDimitry Andric 7304eeddc0SDimitry Andric // destroy 7404eeddc0SDimitry Andric 7504eeddc0SDimitry Andric namespace __destroy { 7604eeddc0SDimitry Andric 7704eeddc0SDimitry Andric struct __fn { 7804eeddc0SDimitry Andric template <__nothrow_input_iterator _InputIterator, __nothrow_sentinel_for<_InputIterator> _Sentinel> 7904eeddc0SDimitry Andric requires destructible<iter_value_t<_InputIterator>> operator__fn80*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _InputIterator operator()(_InputIterator __first, _Sentinel __last) const noexcept { 815f757f3fSDimitry Andric return std::__destroy(std::move(__first), std::move(__last)); 8204eeddc0SDimitry Andric } 8304eeddc0SDimitry Andric 8404eeddc0SDimitry Andric template <__nothrow_input_range _InputRange> 8504eeddc0SDimitry Andric requires destructible<range_value_t<_InputRange>> operator__fn86*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_InputRange> operator()(_InputRange&& __range) const noexcept { 8704eeddc0SDimitry Andric return (*this)(ranges::begin(__range), ranges::end(__range)); 8804eeddc0SDimitry Andric } 8904eeddc0SDimitry Andric }; 9004eeddc0SDimitry Andric 9104eeddc0SDimitry Andric } // namespace __destroy 9204eeddc0SDimitry Andric 9304eeddc0SDimitry Andric inline namespace __cpo { 9404eeddc0SDimitry Andric inline constexpr auto destroy = __destroy::__fn{}; 9504eeddc0SDimitry Andric } // namespace __cpo 9604eeddc0SDimitry Andric 9704eeddc0SDimitry Andric // destroy_n 9804eeddc0SDimitry Andric 9904eeddc0SDimitry Andric namespace __destroy_n { 10004eeddc0SDimitry Andric 10104eeddc0SDimitry Andric struct __fn { 10204eeddc0SDimitry Andric template <__nothrow_input_iterator _InputIterator> 10304eeddc0SDimitry Andric requires destructible<iter_value_t<_InputIterator>> 104*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _InputIterator operator__fn105*cb14a3feSDimitry Andric operator()(_InputIterator __first, iter_difference_t<_InputIterator> __n) const noexcept { 1065f757f3fSDimitry Andric return std::destroy_n(std::move(__first), __n); 10704eeddc0SDimitry Andric } 10804eeddc0SDimitry Andric }; 10904eeddc0SDimitry Andric 11004eeddc0SDimitry Andric } // namespace __destroy_n 11104eeddc0SDimitry Andric 11204eeddc0SDimitry Andric inline namespace __cpo { 11304eeddc0SDimitry Andric inline constexpr auto destroy_n = __destroy_n::__fn{}; 11404eeddc0SDimitry Andric } // namespace __cpo 11504eeddc0SDimitry Andric 11604eeddc0SDimitry Andric } // namespace ranges 11704eeddc0SDimitry Andric 11806c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20 11904eeddc0SDimitry Andric 12004eeddc0SDimitry Andric _LIBCPP_END_NAMESPACE_STD 12104eeddc0SDimitry Andric 12206c3fb27SDimitry Andric _LIBCPP_POP_MACROS 12306c3fb27SDimitry Andric 12404eeddc0SDimitry Andric #endif // _LIBCPP___MEMORY_RANGES_CONSTRUCT_AT_H 125