Viewing file: construct_at.h (1.58 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// 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; }
|