reserved_bits.cpp 4.2 KB

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