1 // A minimal conforming implementation of std::construct_at/destroy_at,
2 // used by some C++20 constexpr tests to avoid including all of <memory>.
6 typedef __SIZE_TYPE__
size_t;
11 constexpr allocator () noexcept
{}
13 constexpr T
*allocate (size_t n
)
14 { return static_cast<T
*> (::operator new (n
* sizeof(T
))); }
17 deallocate (T
*p
, size_t n
)
18 { ::operator delete (p
); }
21 template <typename T
, typename U
= T
&&>
26 auto declval () noexcept
-> decltype (__declval
<T
> (0));
29 struct remove_reference
32 struct remove_reference
<T
&>
35 struct remove_reference
<T
&&>
40 forward (typename
std::remove_reference
<T
>::type
&t
) noexcept
41 { return static_cast<T
&&> (t
); }
45 forward (typename
std::remove_reference
<T
>::type
&&t
) noexcept
46 { return static_cast<T
&&> (t
); }
48 template <typename T
, typename
... A
>
50 construct_at (T
*l
, A
&&... a
)
51 noexcept (noexcept (::new ((void *) 0) T (std::declval
<A
> ()...)))
52 -> decltype (::new ((void *) 0) T (std::declval
<A
> ()...))
53 { return ::new ((void *) l
) T (std::forward
<A
> (a
)...); }
61 inline void *operator new (std::size_t, void *p
) noexcept