| // A minimal conforming implementation of std::construct_at/destroy_at, |
| // used by some C++20 constexpr tests to avoid including all of <memory>. |
| |
| namespace std |
| { |
| typedef __SIZE_TYPE__ size_t; |
| |
| template <typename T> |
| struct allocator |
| { |
| constexpr allocator () noexcept {} |
| |
| constexpr T *allocate (size_t n) |
| { return static_cast<T *> (::operator new (n * sizeof(T))); } |
| |
| constexpr void |
| deallocate (T *p, size_t n) |
| { ::operator delete (p); } |
| }; |
| |
| template <typename T, typename U = T &&> |
| U __declval (int); |
| template <typename T> |
| T __declval (long); |
| template <typename T> |
| auto declval () noexcept -> decltype (__declval<T> (0)); |
| |
| template <typename T> |
| struct remove_reference |
| { typedef T type; }; |
| template <typename T> |
| struct remove_reference<T &> |
| { typedef T type; }; |
| template <typename T> |
| struct remove_reference<T &&> |
| { typedef T type; }; |
| |
| template <typename T> |
| constexpr T && |
| forward (typename std::remove_reference<T>::type &t) noexcept |
| { return static_cast<T&&> (t); } |
| |
| template<typename T> |
| constexpr T && |
| forward (typename std::remove_reference<T>::type &&t) noexcept |
| { return static_cast<T&&> (t); } |
| |
| template <typename T, typename... A> |
| constexpr auto |
| construct_at (T *l, A &&... a) |
| noexcept (noexcept (::new ((void *) 0) T (std::declval<A> ()...))) |
| -> decltype (::new ((void *) 0) T (std::declval<A> ()...)) |
| { return ::new ((void *) l) T (std::forward<A> (a)...); } |
| |
| template <typename T> |
| constexpr inline void |
| destroy_at (T *l) |
| { l->~T (); } |
| } |
| |
| inline void *operator new (std::size_t, void *p) noexcept |
| { return p; } |