General Purpose library for Freestanding C++ and POSIX systems
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.0 KiB

3 years ago
  1. #pragma once
  2. #include "gp/algorithms/move.hpp"
  3. namespace gp{
  4. template<typename T1, typename T2>
  5. struct pair{
  6. T1 first;
  7. T2 second;
  8. pair() : first(), second() {}
  9. pair(T1& a, T2& b) : first(a), second(b) {}
  10. pair(T1& a, T2&& b) : first(a), second(gp::move(b)) {}
  11. pair(T1&& a, T2& b) : first(gp::move(a)), second(b) {}
  12. pair(T1&& a, T2&& b) : first(gp::move(a)), second(gp::move(b)) {}
  13. pair(const pair& v)
  14. : first(v.first)
  15. , second(v.second)
  16. {}
  17. pair(pair& v)
  18. : first(v.first)
  19. , second(v.second)
  20. {}
  21. pair(pair&& v)
  22. : first(gp::move(v.first))
  23. , second(gp::move(v.second))
  24. {}
  25. template<typename U1, typename U2>
  26. pair(pair<U1, U2>&& v)
  27. : first(gp::move(v.first))
  28. , second(gp::move(v.second))
  29. {}
  30. pair& operator=(pair&& v)
  31. {
  32. first = gp::move(v.first);
  33. second = gp::move(v.second);
  34. return *this;
  35. }
  36. };
  37. template<typename T1, typename T2>
  38. pair<T1, T2> make_pair(T1 f, T2 s) {
  39. return pair<T1, T2>(f, s);
  40. }
  41. template<typename F, typename S>
  42. bool operator==(const pair<F, S>& lhs, const pair<F, S>& rhs) {
  43. return lhs.first == rhs.first and lhs.second == rhs.second;
  44. }
  45. template<typename F, typename S>
  46. bool operator!=(const pair<F, S>& lhs, const pair<F, S>& rhs) {
  47. return lhs.first != rhs.first or lhs.second != rhs.second;
  48. }
  49. template<typename F, typename S>
  50. bool operator<=(const pair<F, S>& lhs, const pair<F, S>& rhs) {
  51. if(lhs.first > rhs.first) {
  52. return false;
  53. } else if(lhs.first == rhs.first) {
  54. return lhs.second <= rhs.second;
  55. }
  56. return true;
  57. }
  58. template<typename F, typename S>
  59. bool operator>=(const pair<F, S>& lhs, const pair<F, S>& rhs) {
  60. if(lhs.first < rhs.first) {
  61. return false;
  62. } else if(lhs.first == rhs.first) {
  63. return lhs.second >= rhs.second;
  64. }
  65. return true;
  66. }
  67. template<typename F, typename S>
  68. bool operator<(const pair<F, S>& lhs, const pair<F, S>& rhs) {
  69. return !(lhs >= rhs);
  70. }
  71. template<typename F, typename S>
  72. bool operator>(const pair<F, S>& lhs, const pair<F, S>& rhs) {
  73. return !(lhs <= rhs);
  74. }
  75. }