xref: /freebsd-src/contrib/llvm-project/libcxx/include/__memory/ranges_construct_at.h (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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