pair.hpp 2.4 KB

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