+
+template <class T>
+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 <class T>
+constexpr T && forward(os::remove_reference_t<T>&t) noexcept {
+ return static_cast<T &&>(t);
+}
+
+template <class T>
+constexpr T && forward(os::remove_reference_t<T>&& t) noexcept {
+ static_assert(!os::is_lvalue_reference<T>::value,
+ "can not forward an rvalue as an lvalue");
+ return static_cast<T &&>(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 <class T>
+T*
+move_backward(T* first, T* last, T* d_last)
+{
+ while (first != last) {
+ *(--d_last) = os::move(*(--last));
+ }
+ return d_last;
+}
+
+template <class T>
+T*
+uninitialized_move(T* first, T* last, T* d_first)
+{
+ for (; first != last; ++d_first, (void) ++first) {
+ ::new (static_cast<void*>(d_first)) T(os::move(*first));
+ }
+ return first;
+}
+
+template <class T>
+void
+destroy(T* first, T* last)
+{
+ for (; first != last; ++first) {
+ first->~T();
+ }
+}
+
+template <class T>
+void
+uninitialized_value_construct(T* first, T* last)
+{
+ for (; first != last; ++first) {
+ ::new (static_cast<void*>(first)) T();
+ }
+}