pair.hpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #pragma once
  2. #include <utility>
  3. #include <types/cplusplus.hpp>
  4. namespace types {
  5. template <typename Key, typename Value>
  6. struct pair {
  7. using key_type = Key;
  8. using value_type = Value;
  9. key_type key;
  10. value_type value;
  11. constexpr pair(void) = delete;
  12. constexpr ~pair()
  13. {
  14. }
  15. template <typename _key_type, typename _value_type>
  16. constexpr pair(_key_type&& _key, _value_type&& _value)
  17. : key(std::forward<_key_type>(_key))
  18. , value(std::forward<_value_type>(_value))
  19. {
  20. }
  21. template <typename _key_type, typename _value_type>
  22. constexpr pair(const pair<_key_type, _value_type>& val)
  23. : key(val.key)
  24. , value(val.value)
  25. {
  26. static_assert(is_same<typename traits::decay<_key_type>::type, typename traits::decay<key_type>::type>::value);
  27. static_assert(is_same<typename traits::decay<_value_type>::type, typename traits::decay<value_type>::type>::value);
  28. }
  29. template <typename _key_type, typename _value_type>
  30. constexpr pair(pair<_key_type, _value_type>&& val)
  31. : key(std::move(val.key))
  32. , value(std::move(val.value))
  33. {
  34. static_assert(is_same<typename traits::decay<_key_type>::type, typename traits::decay<key_type>::type>::value);
  35. static_assert(is_same<typename traits::decay<_value_type>::type, typename traits::decay<value_type>::type>::value);
  36. }
  37. constexpr pair(const pair& val)
  38. : key(val.key)
  39. , value(val.value)
  40. {
  41. }
  42. constexpr pair(pair&& val)
  43. : key(std::move(val.key))
  44. , value(std::move(val.value))
  45. {
  46. }
  47. constexpr pair& operator=(const pair& val)
  48. {
  49. key = val.key;
  50. value = val.vaule;
  51. }
  52. constexpr pair& operator=(pair&& val)
  53. {
  54. key = std::move(val.key);
  55. value = std::move(val.value);
  56. }
  57. constexpr bool key_eq(const pair& p)
  58. {
  59. return key == p.key;
  60. }
  61. constexpr bool value_eq(const pair& p)
  62. {
  63. return value == p.value;
  64. }
  65. constexpr bool operator==(const pair& p)
  66. {
  67. return key_eq(p) && value_eq(p);
  68. }
  69. constexpr bool operator!=(const pair& p)
  70. {
  71. return !this->operator==(p);
  72. }
  73. };
  74. template <typename T1, typename T2>
  75. constexpr pair<typename traits::decay<T1>::type, typename traits::decay<T2>::type>
  76. make_pair(T1&& t1, T2&& t2)
  77. {
  78. return pair<typename traits::decay<T1>::type, typename traits::decay<T2>::type> { std::forward<T1>(t1), std::forward<T2>(t2) };
  79. }
  80. } // namespace types