General Purpose library for Freestanding C++ and POSIX systems
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

63 líneas
1.7 KiB

  1. #pragma once
  2. #include "gp/algorithm/tmp_manip.hpp"
  3. #include "gp/range.hpp"
  4. namespace gp{
  5. template<typename T>
  6. typename gp::remove_reference<T>::type&& move(T&& value)
  7. {
  8. return (typename gp::remove_reference<T>::type&&)value;
  9. }
  10. template<typename T>
  11. constexpr T&& forward(typename gp::remove_reference<T>::type& t) noexcept
  12. {
  13. return static_cast<T&&>(t);
  14. }
  15. template<typename T>
  16. constexpr T&& forward(typename gp::remove_reference<T>::type&& t) noexcept
  17. {
  18. static_assert(!std::is_lvalue_reference_v<T>,"bad forward of rvalue as lvalue");
  19. return static_cast<T&&>(t);
  20. }
  21. template<typename T>
  22. constexpr void swap(
  23. T& lhs,
  24. T& rhs
  25. )
  26. {
  27. auto tmp = lhs;
  28. lhs = rhs;
  29. rhs = tmp;
  30. }
  31. template<typename range_in, typename range_out>
  32. nameless_range<typename range_out::associated_iterator> move(range_in src, range_out dest)
  33. {
  34. if(src.size()>dest.size())
  35. return nameless_range<typename range_out::associated_iterator>(dest.begin(), dest.end());
  36. auto in = src.begin();
  37. auto in_close = src.end();
  38. auto out = dest.begin();
  39. while(in != in_close)
  40. {
  41. *(out++) = gp::move(*(in++));
  42. }
  43. return nameless_range<typename range_out::associated_iterator>{out, dest.end()};
  44. }
  45. template<typename T, typename range_in, typename range_out>
  46. nameless_range<typename range_out::associated_iterator> move_uninitialized(range_in src, range_out dest)
  47. {
  48. if(src.size()>dest.size())
  49. return nameless_range<typename range_out::associated_iterator>(dest.begin(), dest.end());
  50. auto in = src.begin();
  51. auto in_close = src.end();
  52. auto out = dest.begin();
  53. while(in != in_close)
  54. {
  55. new(&*(out++)) T{gp::move(*(in++))};
  56. }
  57. return nameless_range<typename range_out::associated_iterator>{out, dest.end()};
  58. }
  59. }