compressed_pair.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include <cstddef>
  2. #include <memory>
  3. #include <tuple>
  4. #include <type_traits>
  5. #include <utility>
  6. #include <vector>
  7. #include <gtest/gtest.h>
  8. #include <entt/core/compressed_pair.hpp>
  9. #include "../../common/value_type.h"
  10. TEST(CompressedPair, Size) {
  11. struct local {
  12. int value;
  13. test::empty empty;
  14. };
  15. ASSERT_EQ(sizeof(entt::compressed_pair<int, int>), sizeof(int) * 2u);
  16. ASSERT_EQ(sizeof(entt::compressed_pair<test::empty, int>), sizeof(int));
  17. ASSERT_EQ(sizeof(entt::compressed_pair<int, test::empty>), sizeof(int));
  18. ASSERT_LT(sizeof(entt::compressed_pair<int, test::empty>), sizeof(local));
  19. ASSERT_LT(sizeof(entt::compressed_pair<int, test::empty>), sizeof(std::pair<int, test::empty>));
  20. }
  21. TEST(CompressedPair, ConstructCopyMove) {
  22. static_assert(!std::is_default_constructible_v<entt::compressed_pair<test::non_default_constructible, test::empty>>, "Default constructible type not allowed");
  23. static_assert(std::is_default_constructible_v<entt::compressed_pair<std::unique_ptr<int>, test::empty>>, "Default constructible type required");
  24. static_assert(std::is_copy_constructible_v<entt::compressed_pair<test::non_default_constructible, test::empty>>, "Copy constructible type required");
  25. static_assert(!std::is_copy_constructible_v<entt::compressed_pair<std::unique_ptr<int>, test::empty>>, "Copy constructible type not allowed");
  26. static_assert(std::is_copy_assignable_v<entt::compressed_pair<test::non_default_constructible, test::empty>>, "Copy assignable type required");
  27. static_assert(!std::is_copy_assignable_v<entt::compressed_pair<std::unique_ptr<int>, test::empty>>, "Copy assignable type not allowed");
  28. static_assert(std::is_move_constructible_v<entt::compressed_pair<std::unique_ptr<int>, test::empty>>, "Move constructible type required");
  29. static_assert(std::is_move_assignable_v<entt::compressed_pair<std::unique_ptr<int>, test::empty>>, "Move assignable type required");
  30. entt::compressed_pair copyable{test::non_default_constructible{2}, test::empty{}};
  31. auto by_copy{copyable};
  32. ASSERT_EQ(by_copy.first().value, 2);
  33. by_copy.first().value = 3;
  34. copyable = by_copy;
  35. ASSERT_EQ(copyable.first().value, 3);
  36. entt::compressed_pair<test::empty, std::unique_ptr<int>> movable{test::empty{}, std::make_unique<int>(1)};
  37. auto by_move{std::move(movable)};
  38. ASSERT_TRUE(by_move.second());
  39. ASSERT_EQ(*by_move.second(), 1);
  40. *by_move.second() = 3;
  41. movable = std::move(by_move);
  42. ASSERT_TRUE(movable.second());
  43. ASSERT_EQ(*movable.second(), 3);
  44. }
  45. TEST(CompressedPair, PiecewiseConstruct) {
  46. const entt::compressed_pair<test::empty, test::empty> empty{std::piecewise_construct, std::make_tuple(), std::make_tuple()};
  47. const entt::compressed_pair<std::vector<int>, std::size_t> pair{std::piecewise_construct, std::forward_as_tuple(std::vector<int>{2}), std::make_tuple(sizeof(empty))};
  48. ASSERT_EQ(pair.first().size(), 1u);
  49. ASSERT_EQ(pair.second(), sizeof(empty));
  50. }
  51. TEST(CompressedPair, DeductionGuide) {
  52. const int value = 2;
  53. const test::empty empty{};
  54. entt::compressed_pair pair{value, 3};
  55. testing::StaticAssertTypeEq<decltype(entt::compressed_pair{test::empty{}, empty}), entt::compressed_pair<test::empty, test::empty>>();
  56. testing::StaticAssertTypeEq<decltype(pair), entt::compressed_pair<int, int>>();
  57. ASSERT_EQ(pair.first(), 2);
  58. ASSERT_EQ(pair.second(), 3);
  59. }
  60. TEST(CompressedPair, Getters) {
  61. entt::compressed_pair pair{3, test::empty{}};
  62. const auto &cpair = pair;
  63. testing::StaticAssertTypeEq<decltype(pair.first()), int &>();
  64. testing::StaticAssertTypeEq<decltype(pair.second()), test::empty &>();
  65. testing::StaticAssertTypeEq<decltype(cpair.first()), const int &>();
  66. testing::StaticAssertTypeEq<decltype(cpair.second()), const test::empty &>();
  67. ASSERT_EQ(pair.first(), cpair.first());
  68. ASSERT_EQ(&pair.second(), &cpair.second());
  69. }
  70. TEST(CompressedPair, Swap) {
  71. entt::compressed_pair pair{1, 2};
  72. entt::compressed_pair other{3, 4};
  73. swap(pair, other);
  74. ASSERT_EQ(pair.first(), 3);
  75. ASSERT_EQ(pair.second(), 4);
  76. ASSERT_EQ(other.first(), 1);
  77. ASSERT_EQ(other.second(), 2);
  78. pair.swap(other);
  79. ASSERT_EQ(pair.first(), 1);
  80. ASSERT_EQ(pair.second(), 2);
  81. ASSERT_EQ(other.first(), 3);
  82. ASSERT_EQ(other.second(), 4);
  83. }
  84. TEST(CompressedPair, Get) {
  85. entt::compressed_pair pair{1, 2};
  86. ASSERT_EQ(pair.get<0>(), 1);
  87. ASSERT_EQ(pair.get<1>(), 2);
  88. ASSERT_EQ(&pair.get<0>(), &pair.first());
  89. ASSERT_EQ(&pair.get<1>(), &pair.second());
  90. auto &&[first, second] = pair;
  91. ASSERT_EQ(first, 1);
  92. ASSERT_EQ(second, 2);
  93. first = 3;
  94. second = 4;
  95. ASSERT_EQ(pair.first(), 3);
  96. ASSERT_EQ(pair.second(), 4);
  97. // NOLINTNEXTLINE(readability-qualified-auto)
  98. auto &[cfirst, csecond] = std::as_const(pair);
  99. ASSERT_EQ(cfirst, 3);
  100. ASSERT_EQ(csecond, 4);
  101. testing::StaticAssertTypeEq<decltype(cfirst), const int>();
  102. testing::StaticAssertTypeEq<decltype(csecond), const int>();
  103. auto [tfirst, tsecond] = entt::compressed_pair{32, 64};
  104. ASSERT_EQ(tfirst, 32);
  105. ASSERT_EQ(tsecond, 64);
  106. testing::StaticAssertTypeEq<decltype(cfirst), const int>();
  107. testing::StaticAssertTypeEq<decltype(csecond), const int>();
  108. }