5#include "type_traits.h"
11inline typename removeReference<T>::type &&move(T &&arg)
13 return static_cast<typename removeReference<T>::type &&
>(arg);
18inline constexpr T &&forward(
typename removeReference<T>::type &arg)
20 return static_cast<T &&
>(arg);
24inline constexpr T &&forward(
typename removeReference<T>::type &&arg)
26 static_assert(!isLValueReference<T>::value,
"Invalid lvalue to rvalue conversion");
27 return static_cast<T &&
>(arg);
32inline void swap(T &a, T &b)
34 T temp = nctl::move(a);
41inline bool equalTo(
const T &a,
const T &b) {
return a == b; }
45inline bool equalTo(
const T *a,
const T *b) {
return a == b; }
48inline bool equalTo<char>(
const char *a,
const char *b)
50 while (*a && (*a == *b))
70 static constexpr bool value =
97template <
typename T,
typename Tag>
103 static void constructObject(T *ptr) {}
111 static void constructObject(T *ptr) {
new (ptr) T(); }
112 static void copyConstructObject(T *
dest,
const T *
src) {
new (
dest) T(*
src); }
113 static void moveConstructObject(T *
dest, T *
src) {
new (
dest) T(nctl::move(*
src)); }
119 static void constructObject(T *ptr) {
new (ptr) T(); }
120 static void copyConstructObject(T *
dest,
const T *
src) {
new (
dest) T(nctl::move(*
src)); }
121 static void moveConstructObject(T *
dest, T *
src) {
new (
dest) T(nctl::move(*
src)); }
127 static void constructObject(T *ptr) {
new (ptr) T(); }
128 static void copyConstructObject(T *
dest,
const T *
src) {
new (
dest) T(*
src); }
129 static void moveConstructObject(T *
dest, T *
src) {
new (
dest) T(*
src); }
135 static void constructObject(T *) {
static_assert(
sizeof(T) == 0,
"Cannot construct this type"); }
136 static void copyConstructObject(T *,
const T *) {
static_assert(
sizeof(T) == 0,
"Cannot copy construct this type"); }
137 static void moveConstructObject(T *, T *) {
static_assert(
sizeof(T) == 0,
"Cannot move construct this type"); }
141template <
typename T,
typename Tag>
144 static void constructArray(T *ptr,
unsigned int numElements)
154 static void constructArray(T *,
unsigned int) {}
160 static void constructArray(T *,
unsigned int numElements)
163 static_assert(
sizeof(T) == 0,
"Cannot construct elements of this type");
168template <
typename T,
typename Tag>
236 static void moveConstructArray(T *, T *,
unsigned int numElements)
239 static_assert(
sizeof(T) == 0,
"Cannot move construct elements of this type");
242 static void copyConstructArray(T *,
const T *,
unsigned int numElements)
245 static_assert(
sizeof(T) == 0,
"Cannot copy construct elements of this type");
253 using Tag =
typename ObjectPolicyTag<T>::type;
255 static void constructObject(T *ptr)
259 static void constructArray(T *ptr,
unsigned int numElements)
264 static void copyConstructObject(T *
dest,
const T *
src)
274 static void moveConstructObject(T *
dest, T *
src)
286template <
bool Trivial>
290 static void destructObject(T *ptr) { ptr->~T(); }
293 static void destructArray(T *ptr,
unsigned int numElements)
304 static void destructObject(T *) {}
307 static void destructArray(T *,
unsigned int) {}
311template <
typename T,
typename Tag>
382 static_assert(
sizeof(T) == 0,
"Cannot move assign elements of this type");
385 static void copyAssignArray(T *,
const T *,
unsigned int numElements)
388 static_assert(
sizeof(T) == 0,
"Cannot copy assign elements of this type");
398inline void constructArray(T *ptr,
unsigned int numElements) { detail::constructHelpers<T>::constructArray(ptr, numElements); }
401inline void copyConstructObject(T *dest,
const T *src) { detail::constructHelpers<T>::copyConstructObject(dest, src); }
404inline void copyConstructArray(T *dest,
const T *src,
unsigned int numElements) { detail::constructHelpers<T>::copyConstructArray(dest, src, numElements); }
407inline void moveConstructObject(T *dest, T *src) { detail::constructHelpers<T>::moveConstructObject(dest, src); }
410inline void moveConstructArray(T *dest, T *src,
unsigned int numElements) { detail::constructHelpers<T>::moveConstructArray(dest, src, numElements); }
413inline void destructObject(T *ptr) { detail::destructHelpers<isTriviallyDestructible<T>::value>::destructObject(ptr); }
416inline void destructArray(T *ptr,
unsigned int numElements) { detail::destructHelpers<isTriviallyDestructible<T>::value>::destructArray(ptr, numElements); }
419inline void copyAssignObject(T *dest,
const T *src)
421 using Tag =
typename detail::ObjectPolicyTag<T>::type;
422 detail::copyHelpersImpl<T, Tag>::copyAssignArray(dest, src, 1);
426inline void copyAssignArray(T *dest,
const T *src,
unsigned int numElements)
428 using Tag =
typename detail::ObjectPolicyTag<T>::type;
429 detail::copyHelpersImpl<T, Tag>::copyAssignArray(dest, src, numElements);
433inline void moveAssignObject(T *dest, T *src)
435 using Tag =
typename detail::ObjectPolicyTag<T>::type;
436 detail::copyHelpersImpl<T, Tag>::moveAssignArray(dest, src, 1);
440inline void moveAssignArray(T *dest, T *src,
unsigned int numElements)
442 using Tag =
typename detail::ObjectPolicyTag<T>::type;
443 detail::copyHelpersImpl<T, Tag>::moveAssignArray(dest, src, numElements);
A unique pointer implementation.
Definition UniquePtr.h:118
Definition type_traits.h:161
Definition type_traits.h:117
Definition type_traits.h:111