X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0a7de7458d150b5d4dffc935ba399be265ef0a1a..cb3231590a3c94ab4375e2228bd5e86b0cf1ad7e:/libkern/os/cpp_util.h?ds=inline diff --git a/libkern/os/cpp_util.h b/libkern/os/cpp_util.h new file mode 100644 index 000000000..dc7236bff --- /dev/null +++ b/libkern/os/cpp_util.h @@ -0,0 +1,49 @@ +#ifndef _OS_CPP_UTIL_H +#define _OS_CPP_UTIL_H + +#include + +#if __has_feature(cxx_nullptr) && __has_feature(cxx_decltype) +# define OS_HAS_NULLPTR 1 +#endif + +#if __has_feature(cxx_rvalue_references) || __has_extension(cxx_rvalue_references) +# define OS_HAS_RVALUE_REFERENCES 1 +#endif + +namespace os { +#if OS_HAS_NULLPTR +typedef decltype(nullptr) nullptr_t; +#endif + +/* + * Reference removal + */ + +template struct remove_reference {typedef _T type;}; +template struct remove_reference<_T&> {typedef _T type;}; +template struct remove_reference<_T &&> {typedef _T type;}; +template using remove_reference_t = typename remove_reference<_T>::type; + +/* + * Const removal + */ + +template struct remove_const {typedef _T type;}; +template struct remove_const {typedef _T type;}; +template using remove_const_t = typename remove_const<_T>::type; + +/* + * Move + */ + +template +inline typename remove_reference<_T>::type && +move(_T && _t) +{ + typedef typename os::remove_reference<_T>::type _U; + return static_cast<_U &&>(_t); +} +} + +#endif /* _OS_CPP_UTIL_H */