X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/cb3231590a3c94ab4375e2228bd5e86b0cf1ad7e..HEAD:/libkern/os/cpp_util.h?ds=sidebyside diff --git a/libkern/os/cpp_util.h b/libkern/os/cpp_util.h index dc7236bff..5821f1f08 100644 --- a/libkern/os/cpp_util.h +++ b/libkern/os/cpp_util.h @@ -11,6 +11,8 @@ # define OS_HAS_RVALUE_REFERENCES 1 #endif +void* operator new(size_t, void*); + namespace os { #if OS_HAS_NULLPTR typedef decltype(nullptr) nullptr_t; @@ -33,6 +35,9 @@ template struct remove_const {typedef _T type;}; template struct remove_const {typedef _T type;}; template using remove_const_t = typename remove_const<_T>::type; +template struct is_lvalue_reference { static constexpr bool value = false; }; +template struct is_lvalue_reference { static constexpr bool value = true; }; + /* * Move */ @@ -44,6 +49,69 @@ move(_T && _t) typedef typename os::remove_reference<_T>::type _U; return static_cast<_U &&>(_t); } + +template +T* +move(T* first, T* last, T* d_first) +{ + for (; first != last; ++d_first, (void)++first) { + *d_first = os::move(*first); + } + return d_first; +} + +template +constexpr T && forward(os::remove_reference_t&t) noexcept { + return static_cast(t); +} + +template +constexpr T && forward(os::remove_reference_t&& t) noexcept { + static_assert(!os::is_lvalue_reference::value, + "can not forward an rvalue as an lvalue"); + return static_cast(t); +} + +// Moves [first, last) into the range ending at d_last, +// proceeding backwards (from last to first) +// UB if d_last is within (first, last] +template +T* +move_backward(T* first, T* last, T* d_last) +{ + while (first != last) { + *(--d_last) = os::move(*(--last)); + } + return d_last; +} + +template +T* +uninitialized_move(T* first, T* last, T* d_first) +{ + for (; first != last; ++d_first, (void) ++first) { + ::new (static_cast(d_first)) T(os::move(*first)); + } + return first; +} + +template +void +destroy(T* first, T* last) +{ + for (; first != last; ++first) { + first->~T(); + } +} + +template +void +uninitialized_value_construct(T* first, T* last) +{ + for (; first != last; ++first) { + ::new (static_cast(first)) T(); + } +} } #endif /* _OS_CPP_UTIL_H */