compressed_pair.cpp 5.2 KB

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