1
0

reserved_bits.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <cstddef>
  2. #include <cstdint>
  3. #include <iterator>
  4. #include <gtest/gtest.h>
  5. #include <entt/config/config.h>
  6. #include <entt/core/enum.hpp>
  7. #include <entt/core/fwd.hpp>
  8. #include <entt/entity/entity.hpp>
  9. #include <entt/entity/mixin.hpp>
  10. #include <entt/entity/registry.hpp>
  11. #include <entt/entity/view.hpp>
  12. enum class my_entity : entt::id_type {
  13. disabled = 0x10000000,
  14. _entt_enum_as_bitmask
  15. };
  16. struct entity_traits {
  17. using value_type = my_entity;
  18. using entity_type = std::uint32_t;
  19. using version_type = std::uint16_t;
  20. static constexpr entity_type entity_mask = 0xFFFF; // 16b
  21. static constexpr entity_type version_mask = 0x0FFF; // 12b
  22. };
  23. template<>
  24. struct entt::entt_traits<my_entity>: entt::basic_entt_traits<entity_traits> {
  25. static constexpr std::size_t page_size = ENTT_SPARSE_PAGE;
  26. };
  27. namespace {
  28. [[nodiscard]] bool is_disabled(const my_entity entity) {
  29. return ((entity & my_entity::disabled) == my_entity::disabled);
  30. }
  31. } // namespace
  32. TEST(Example, DisabledEntity) {
  33. entt::basic_registry<my_entity> registry{};
  34. auto view = registry.view<my_entity, int>();
  35. const my_entity entity = registry.create(entt::entt_traits<my_entity>::construct(4u, 1u));
  36. const my_entity other = registry.create(entt::entt_traits<my_entity>::construct(3u, 0u));
  37. registry.emplace<int>(entity);
  38. registry.emplace<int>(other);
  39. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(entity)));
  40. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(other)));
  41. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(entity)));
  42. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(other)));
  43. registry.storage<my_entity>().bump(entity | my_entity::disabled);
  44. ASSERT_TRUE(is_disabled(*registry.storage<my_entity>().find(entity)));
  45. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(other)));
  46. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(entity)));
  47. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(other)));
  48. view.use<my_entity>();
  49. ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
  50. for(auto entt: view) {
  51. if(entt::to_entity(entt) == entt::to_entity(entity)) {
  52. ASSERT_NE(entt, entity);
  53. ASSERT_EQ(entt::to_version(entt), entt::to_version(entity));
  54. ASSERT_TRUE(is_disabled(entt));
  55. } else {
  56. ASSERT_EQ(entt, other);
  57. ASSERT_EQ(entt::to_version(entt), entt::to_version(other));
  58. ASSERT_FALSE(is_disabled(entt));
  59. }
  60. }
  61. view.use<int>();
  62. ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
  63. for(auto entt: view) {
  64. ASSERT_FALSE(is_disabled(entt));
  65. }
  66. registry.storage<my_entity>().bump(entity);
  67. registry.storage<int>().bump(other | my_entity::disabled);
  68. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(entity)));
  69. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(other)));
  70. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(entity)));
  71. ASSERT_TRUE(is_disabled(*registry.storage<int>().find(other)));
  72. view.use<my_entity>();
  73. ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
  74. for(auto entt: view) {
  75. ASSERT_FALSE(is_disabled(entt));
  76. }
  77. view.use<int>();
  78. ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
  79. for(auto entt: view) {
  80. if(entt::to_entity(entt) == entt::to_entity(other)) {
  81. ASSERT_NE(entt, other);
  82. ASSERT_EQ(entt::to_version(entt), entt::to_version(other));
  83. ASSERT_TRUE(is_disabled(entt));
  84. } else {
  85. ASSERT_EQ(entt, entity);
  86. ASSERT_EQ(entt::to_version(entt), entt::to_version(entity));
  87. ASSERT_FALSE(is_disabled(entt));
  88. }
  89. }
  90. registry.storage<int>().bump(other);
  91. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(entity)));
  92. ASSERT_FALSE(is_disabled(*registry.storage<my_entity>().find(other)));
  93. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(entity)));
  94. ASSERT_FALSE(is_disabled(*registry.storage<int>().find(other)));
  95. view.use<my_entity>();
  96. ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
  97. for(auto entt: view) {
  98. ASSERT_FALSE(is_disabled(entt));
  99. }
  100. view.use<int>();
  101. ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
  102. for(auto entt: view) {
  103. ASSERT_FALSE(is_disabled(entt));
  104. }
  105. }