#pragma once #include "gp/algorithm/tmp_manip.hpp" #include "gp/range.hpp" namespace gp{ template typename gp::remove_reference::type&& move(T&& value) { return (typename gp::remove_reference::type&&)value; } template constexpr T&& forward(typename gp::remove_reference::type& t) noexcept { return static_cast(t); } template constexpr T&& forward(typename gp::remove_reference::type&& t) noexcept { static_assert(!std::is_lvalue_reference_v,"bad forward of rvalue as lvalue"); return static_cast(t); } template constexpr void swap( T& lhs, T& rhs ) { auto tmp = lhs; lhs = rhs; rhs = tmp; } template constexpr void swap( T&& lhs, T&& rhs ) { auto tmp = lhs; lhs = rhs; rhs = tmp; } template nameless_range move(range_in src, range_out dest) { if(src.size()>dest.size()) return nameless_range(dest.begin(), dest.end()); auto in = src.begin(); auto in_close = src.end(); auto out = dest.begin(); while(in != in_close) { *(out++) = gp::move(*(in++)); } return nameless_range{out, dest.end()}; } template nameless_range::type::associated_iterator> move_uninitialized(range_in&& src, range_out&& dest) { using T = typename gp::remove_reference::type; if(src.size()>dest.size()) return nameless_range::type::associated_iterator>(dest.begin(), dest.end()); auto in = src.begin(); auto in_close = src.end(); auto out = dest.begin(); while(in != in_close) { new(&*(out++)) T{gp::move(*(in++))}; } return nameless_range::type::associated_iterator>{out, dest.end()}; } }