sparse_set.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. #include <cstdint>
  2. #include <utility>
  3. #include <iterator>
  4. #include <algorithm>
  5. #include <functional>
  6. #include <type_traits>
  7. #include <gtest/gtest.h>
  8. #include <entt/entity/sparse_set.hpp>
  9. #include <entt/entity/fwd.hpp>
  10. struct empty_type {};
  11. struct boxed_int { int value; };
  12. TEST(SparseSet, Functionalities) {
  13. entt::sparse_set set;
  14. set.reserve(42);
  15. ASSERT_EQ(set.capacity(), 42u);
  16. ASSERT_TRUE(set.empty());
  17. ASSERT_EQ(set.size(), 0u);
  18. ASSERT_EQ(std::as_const(set).begin(), std::as_const(set).end());
  19. ASSERT_EQ(set.begin(), set.end());
  20. ASSERT_FALSE(set.contains(entt::entity{0}));
  21. ASSERT_FALSE(set.contains(entt::entity{42}));
  22. set.emplace(entt::entity{42});
  23. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  24. ASSERT_FALSE(set.empty());
  25. ASSERT_EQ(set.size(), 1u);
  26. ASSERT_NE(std::as_const(set).begin(), std::as_const(set).end());
  27. ASSERT_NE(set.begin(), set.end());
  28. ASSERT_FALSE(set.contains(entt::entity{0}));
  29. ASSERT_TRUE(set.contains(entt::entity{42}));
  30. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  31. set.erase(entt::entity{42});
  32. ASSERT_TRUE(set.empty());
  33. ASSERT_EQ(set.size(), 0u);
  34. ASSERT_EQ(std::as_const(set).begin(), std::as_const(set).end());
  35. ASSERT_EQ(set.begin(), set.end());
  36. ASSERT_FALSE(set.contains(entt::entity{0}));
  37. ASSERT_FALSE(set.contains(entt::entity{42}));
  38. set.emplace(entt::entity{42});
  39. ASSERT_FALSE(set.empty());
  40. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  41. ASSERT_TRUE(std::is_move_constructible_v<decltype(set)>);
  42. ASSERT_TRUE(std::is_move_assignable_v<decltype(set)>);
  43. entt::sparse_set other{std::move(set)};
  44. set = std::move(other);
  45. other = std::move(set);
  46. ASSERT_TRUE(set.empty());
  47. ASSERT_FALSE(other.empty());
  48. ASSERT_EQ(other.index(entt::entity{42}), 0u);
  49. other.clear();
  50. ASSERT_TRUE(other.empty());
  51. ASSERT_EQ(other.size(), 0u);
  52. ASSERT_EQ(std::as_const(other).begin(), std::as_const(other).end());
  53. ASSERT_EQ(other.begin(), other.end());
  54. ASSERT_FALSE(other.contains(entt::entity{0}));
  55. ASSERT_FALSE(other.contains(entt::entity{42}));
  56. }
  57. TEST(SparseSet, Pagination) {
  58. entt::sparse_set set;
  59. constexpr auto entt_per_page = ENTT_PAGE_SIZE / sizeof(entt::entity);
  60. ASSERT_EQ(set.extent(), 0u);
  61. set.emplace(entt::entity{entt_per_page-1});
  62. ASSERT_EQ(set.extent(), entt_per_page);
  63. ASSERT_TRUE(set.contains(entt::entity{entt_per_page-1}));
  64. set.emplace(entt::entity{entt_per_page});
  65. ASSERT_EQ(set.extent(), 2 * entt_per_page);
  66. ASSERT_TRUE(set.contains(entt::entity{entt_per_page-1}));
  67. ASSERT_TRUE(set.contains(entt::entity{entt_per_page}));
  68. ASSERT_FALSE(set.contains(entt::entity{entt_per_page+1}));
  69. set.erase(entt::entity{entt_per_page-1});
  70. ASSERT_EQ(set.extent(), 2 * entt_per_page);
  71. ASSERT_FALSE(set.contains(entt::entity{entt_per_page-1}));
  72. ASSERT_TRUE(set.contains(entt::entity{entt_per_page}));
  73. set.shrink_to_fit();
  74. set.erase(entt::entity{entt_per_page});
  75. ASSERT_EQ(set.extent(), 2 * entt_per_page);
  76. ASSERT_FALSE(set.contains(entt::entity{entt_per_page-1}));
  77. ASSERT_FALSE(set.contains(entt::entity{entt_per_page}));
  78. set.shrink_to_fit();
  79. ASSERT_EQ(set.extent(), 0u);
  80. }
  81. TEST(SparseSet, Insert) {
  82. entt::sparse_set set;
  83. entt::entity entities[2];
  84. entities[0] = entt::entity{3};
  85. entities[1] = entt::entity{42};
  86. set.emplace(entt::entity{12});
  87. set.insert(std::begin(entities), std::end(entities));
  88. set.emplace(entt::entity{24});
  89. ASSERT_TRUE(set.contains(entities[0]));
  90. ASSERT_TRUE(set.contains(entities[1]));
  91. ASSERT_FALSE(set.contains(entt::entity{0}));
  92. ASSERT_FALSE(set.contains(entt::entity{9}));
  93. ASSERT_TRUE(set.contains(entt::entity{12}));
  94. ASSERT_TRUE(set.contains(entt::entity{24}));
  95. ASSERT_FALSE(set.empty());
  96. ASSERT_EQ(set.size(), 4u);
  97. ASSERT_EQ(set.index(entt::entity{12}), 0u);
  98. ASSERT_EQ(set.index(entities[0]), 1u);
  99. ASSERT_EQ(set.index(entities[1]), 2u);
  100. ASSERT_EQ(set.index(entt::entity{24}), 3u);
  101. ASSERT_EQ(set.data()[set.index(entt::entity{12})], entt::entity{12});
  102. ASSERT_EQ(set.data()[set.index(entities[0])], entities[0]);
  103. ASSERT_EQ(set.data()[set.index(entities[1])], entities[1]);
  104. ASSERT_EQ(set.data()[set.index(entt::entity{24})], entt::entity{24});
  105. }
  106. TEST(SparseSet, Iterator) {
  107. using iterator = typename entt::sparse_set::iterator;
  108. entt::sparse_set set;
  109. set.emplace(entt::entity{3});
  110. iterator end{set.begin()};
  111. iterator begin{};
  112. begin = set.end();
  113. std::swap(begin, end);
  114. ASSERT_EQ(begin, set.begin());
  115. ASSERT_EQ(end, set.end());
  116. ASSERT_NE(begin, end);
  117. ASSERT_EQ(begin++, set.begin());
  118. ASSERT_EQ(begin--, set.end());
  119. ASSERT_EQ(begin+1, set.end());
  120. ASSERT_EQ(end-1, set.begin());
  121. ASSERT_EQ(++begin, set.end());
  122. ASSERT_EQ(--begin, set.begin());
  123. ASSERT_EQ(begin += 1, set.end());
  124. ASSERT_EQ(begin -= 1, set.begin());
  125. ASSERT_EQ(begin + (end - begin), set.end());
  126. ASSERT_EQ(begin - (begin - end), set.end());
  127. ASSERT_EQ(end - (end - begin), set.begin());
  128. ASSERT_EQ(end + (begin - end), set.begin());
  129. ASSERT_EQ(begin[0], *set.begin());
  130. ASSERT_LT(begin, end);
  131. ASSERT_LE(begin, set.begin());
  132. ASSERT_GT(end, begin);
  133. ASSERT_GE(end, set.end());
  134. ASSERT_EQ(*begin, entt::entity{3});
  135. ASSERT_EQ(*begin.operator->(), entt::entity{3});
  136. }
  137. TEST(SparseSet, ReverseIterator) {
  138. using reverse_iterator = typename entt::sparse_set::reverse_iterator;
  139. entt::sparse_set set;
  140. set.emplace(entt::entity{3});
  141. reverse_iterator end{set.rbegin()};
  142. reverse_iterator begin{};
  143. begin = set.rend();
  144. std::swap(begin, end);
  145. ASSERT_EQ(begin, set.rbegin());
  146. ASSERT_EQ(end, set.rend());
  147. ASSERT_NE(begin, end);
  148. ASSERT_EQ(begin++, set.rbegin());
  149. ASSERT_EQ(begin--, set.rend());
  150. ASSERT_EQ(begin+1, set.rend());
  151. ASSERT_EQ(end-1, set.rbegin());
  152. ASSERT_EQ(++begin, set.rend());
  153. ASSERT_EQ(--begin, set.rbegin());
  154. ASSERT_EQ(begin += 1, set.rend());
  155. ASSERT_EQ(begin -= 1, set.rbegin());
  156. ASSERT_EQ(begin + (end - begin), set.rend());
  157. ASSERT_EQ(begin - (begin - end), set.rend());
  158. ASSERT_EQ(end - (end - begin), set.rbegin());
  159. ASSERT_EQ(end + (begin - end), set.rbegin());
  160. ASSERT_EQ(begin[0], *set.rbegin());
  161. ASSERT_LT(begin, end);
  162. ASSERT_LE(begin, set.rbegin());
  163. ASSERT_GT(end, begin);
  164. ASSERT_GE(end, set.rend());
  165. ASSERT_EQ(*begin, entt::entity{3});
  166. }
  167. TEST(SparseSet, Find) {
  168. entt::sparse_set set;
  169. set.emplace(entt::entity{3});
  170. set.emplace(entt::entity{42});
  171. set.emplace(entt::entity{99});
  172. ASSERT_NE(set.find(entt::entity{3}), set.end());
  173. ASSERT_NE(set.find(entt::entity{42}), set.end());
  174. ASSERT_NE(set.find(entt::entity{99}), set.end());
  175. ASSERT_EQ(set.find(entt::entity{0}), set.end());
  176. auto it = set.find(entt::entity{99});
  177. ASSERT_EQ(*it, entt::entity{99});
  178. ASSERT_EQ(*(++it), entt::entity{42});
  179. ASSERT_EQ(*(++it), entt::entity{3});
  180. ASSERT_EQ(++it, set.end());
  181. ASSERT_EQ(++set.find(entt::entity{3}), set.end());
  182. }
  183. TEST(SparseSet, Data) {
  184. entt::sparse_set set;
  185. set.emplace(entt::entity{3});
  186. set.emplace(entt::entity{12});
  187. set.emplace(entt::entity{42});
  188. ASSERT_EQ(set.index(entt::entity{3}), 0u);
  189. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  190. ASSERT_EQ(set.index(entt::entity{42}), 2u);
  191. ASSERT_EQ(*(set.data() + 0u), entt::entity{3});
  192. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  193. ASSERT_EQ(*(set.data() + 2u), entt::entity{42});
  194. }
  195. TEST(SparseSet, SortOrdered) {
  196. entt::sparse_set set;
  197. set.emplace(entt::entity{42});
  198. set.emplace(entt::entity{12});
  199. set.emplace(entt::entity{9});
  200. set.emplace(entt::entity{7});
  201. set.emplace(entt::entity{3});
  202. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  203. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  204. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  205. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  206. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  207. set.sort(set.begin(), set.end(), std::less{});
  208. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  209. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  210. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  211. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  212. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  213. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  214. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  215. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  216. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  217. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  218. auto begin = set.begin();
  219. auto end = set.end();
  220. ASSERT_EQ(*(begin++), entt::entity{3});
  221. ASSERT_EQ(*(begin++), entt::entity{7});
  222. ASSERT_EQ(*(begin++), entt::entity{9});
  223. ASSERT_EQ(*(begin++), entt::entity{12});
  224. ASSERT_EQ(*(begin++), entt::entity{42});
  225. ASSERT_EQ(begin, end);
  226. }
  227. TEST(SparseSet, SortReverse) {
  228. entt::sparse_set set;
  229. set.emplace(entt::entity{3});
  230. set.emplace(entt::entity{7});
  231. set.emplace(entt::entity{9});
  232. set.emplace(entt::entity{12});
  233. set.emplace(entt::entity{42});
  234. ASSERT_EQ(*(set.data() + 0u), entt::entity{3});
  235. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  236. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  237. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  238. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  239. set.sort(set.begin(), set.end(), std::less{});
  240. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  241. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  242. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  243. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  244. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  245. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  246. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  247. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  248. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  249. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  250. auto begin = set.begin();
  251. auto end = set.end();
  252. ASSERT_EQ(*(begin++), entt::entity{3});
  253. ASSERT_EQ(*(begin++), entt::entity{7});
  254. ASSERT_EQ(*(begin++), entt::entity{9});
  255. ASSERT_EQ(*(begin++), entt::entity{12});
  256. ASSERT_EQ(*(begin++), entt::entity{42});
  257. ASSERT_EQ(begin, end);
  258. }
  259. TEST(SparseSet, SortUnordered) {
  260. entt::sparse_set set;
  261. set.emplace(entt::entity{9});
  262. set.emplace(entt::entity{7});
  263. set.emplace(entt::entity{3});
  264. set.emplace(entt::entity{12});
  265. set.emplace(entt::entity{42});
  266. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  267. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  268. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  269. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  270. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  271. set.sort(set.begin(), set.end(), std::less{});
  272. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  273. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  274. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  275. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  276. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  277. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  278. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  279. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  280. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  281. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  282. auto begin = set.begin();
  283. auto end = set.end();
  284. ASSERT_EQ(*(begin++), entt::entity{3});
  285. ASSERT_EQ(*(begin++), entt::entity{7});
  286. ASSERT_EQ(*(begin++), entt::entity{9});
  287. ASSERT_EQ(*(begin++), entt::entity{12});
  288. ASSERT_EQ(*(begin++), entt::entity{42});
  289. ASSERT_EQ(begin, end);
  290. }
  291. TEST(SparseSet, SortRange) {
  292. entt::sparse_set set;
  293. set.emplace(entt::entity{9});
  294. set.emplace(entt::entity{7});
  295. set.emplace(entt::entity{3});
  296. set.emplace(entt::entity{12});
  297. set.emplace(entt::entity{42});
  298. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  299. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  300. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  301. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  302. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  303. set.sort(set.end(), set.end(), std::less{});
  304. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  305. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  306. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  307. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  308. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  309. set.sort(set.begin(), set.begin(), std::less{});
  310. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  311. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  312. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  313. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  314. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  315. set.sort(set.begin()+2, set.begin()+3, std::less{});
  316. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  317. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  318. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  319. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  320. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  321. set.sort(++set.begin(), --set.end(), std::less{});
  322. ASSERT_EQ(set.index(entt::entity{9}), 0u);
  323. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  324. ASSERT_EQ(set.index(entt::entity{7}), 2u);
  325. ASSERT_EQ(set.index(entt::entity{3}), 3u);
  326. ASSERT_EQ(set.index(entt::entity{42}), 4u);
  327. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  328. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  329. ASSERT_EQ(*(set.data() + 2u), entt::entity{7});
  330. ASSERT_EQ(*(set.data() + 3u), entt::entity{3});
  331. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  332. auto begin = set.begin();
  333. auto end = set.end();
  334. ASSERT_EQ(*(begin++), entt::entity{42});
  335. ASSERT_EQ(*(begin++), entt::entity{3});
  336. ASSERT_EQ(*(begin++), entt::entity{7});
  337. ASSERT_EQ(*(begin++), entt::entity{12});
  338. ASSERT_EQ(*(begin++), entt::entity{9});
  339. ASSERT_EQ(begin, end);
  340. }
  341. TEST(SparseSet, ArrangOrdered) {
  342. entt::sparse_set set;
  343. entt::entity entities[5]{entt::entity{42}, entt::entity{12}, entt::entity{9}, entt::entity{7}, entt::entity{3}};
  344. set.insert(std::begin(entities), std::end(entities));
  345. set.arrange(set.begin(), set.end(), [](auto...) { FAIL(); }, std::less{});
  346. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  347. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  348. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  349. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  350. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  351. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  352. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  353. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  354. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  355. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  356. ASSERT_TRUE(std::equal(std::begin(entities), std::end(entities), set.data()));
  357. }
  358. TEST(SparseSet, ArrangeReverse) {
  359. entt::sparse_set set;
  360. entt::entity entities[5]{entt::entity{3}, entt::entity{7}, entt::entity{9}, entt::entity{12}, entt::entity{42}};
  361. set.insert(std::begin(entities), std::end(entities));
  362. set.arrange(set.begin(), set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  363. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  364. }, std::less{});
  365. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  366. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  367. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  368. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  369. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  370. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  371. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  372. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  373. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  374. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  375. ASSERT_TRUE(std::equal(std::begin(entities), std::end(entities), set.data()));
  376. }
  377. TEST(SparseSet, ArrangeUnordered) {
  378. entt::sparse_set set;
  379. entt::entity entities[5]{entt::entity{9}, entt::entity{7}, entt::entity{3}, entt::entity{12}, entt::entity{42}};
  380. set.insert(std::begin(entities), std::end(entities));
  381. set.arrange(set.begin(), set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  382. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  383. }, std::less{});
  384. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  385. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  386. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  387. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  388. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  389. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  390. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  391. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  392. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  393. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  394. ASSERT_TRUE(std::equal(std::begin(entities), std::end(entities), set.data()));
  395. }
  396. TEST(SparseSet, ArrangeRange) {
  397. entt::sparse_set set;
  398. entt::entity entities[5]{entt::entity{9}, entt::entity{7}, entt::entity{3}, entt::entity{12}, entt::entity{42}};
  399. set.insert(std::begin(entities), std::end(entities));
  400. set.arrange(set.end(), set.end(), [](const auto, const auto) { FAIL(); }, std::less{});
  401. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  402. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  403. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  404. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  405. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  406. set.arrange(set.begin(), set.begin(), [](const auto, const auto) { FAIL(); }, std::less{});
  407. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  408. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  409. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  410. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  411. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  412. set.arrange(set.begin()+2, set.begin()+3, [](const auto, const auto) { FAIL(); }, std::less{});
  413. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  414. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  415. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  416. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  417. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  418. set.arrange(++set.begin(), --set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  419. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  420. }, std::less{});
  421. ASSERT_EQ(set.index(entt::entity{9}), 0u);
  422. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  423. ASSERT_EQ(set.index(entt::entity{7}), 2u);
  424. ASSERT_EQ(set.index(entt::entity{3}), 3u);
  425. ASSERT_EQ(set.index(entt::entity{42}), 4u);
  426. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  427. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  428. ASSERT_EQ(*(set.data() + 2u), entt::entity{7});
  429. ASSERT_EQ(*(set.data() + 3u), entt::entity{3});
  430. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  431. }
  432. TEST(SparseSet, ArrangeCornerCase) {
  433. entt::sparse_set set;
  434. entt::entity entities[5]{entt::entity{0}, entt::entity{1}, entt::entity{4}, entt::entity{3}, entt::entity{2}};
  435. set.insert(std::begin(entities), std::end(entities));
  436. set.arrange(++set.begin(), set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  437. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  438. }, std::less{});
  439. ASSERT_EQ(set.index(entt::entity{4}), 0u);
  440. ASSERT_EQ(set.index(entt::entity{3}), 1u);
  441. ASSERT_EQ(set.index(entt::entity{1}), 2u);
  442. ASSERT_EQ(set.index(entt::entity{0}), 3u);
  443. ASSERT_EQ(set.index(entt::entity{2}), 4u);
  444. ASSERT_EQ(*(set.data() + 0u), entt::entity{4});
  445. ASSERT_EQ(*(set.data() + 1u), entt::entity{3});
  446. ASSERT_EQ(*(set.data() + 2u), entt::entity{1});
  447. ASSERT_EQ(*(set.data() + 3u), entt::entity{0});
  448. ASSERT_EQ(*(set.data() + 4u), entt::entity{2});
  449. }
  450. TEST(SparseSet, RespectDisjoint) {
  451. entt::sparse_set lhs;
  452. entt::sparse_set rhs;
  453. lhs.emplace(entt::entity{3});
  454. lhs.emplace(entt::entity{12});
  455. lhs.emplace(entt::entity{42});
  456. ASSERT_EQ(lhs.index(entt::entity{3}), 0u);
  457. ASSERT_EQ(lhs.index(entt::entity{12}), 1u);
  458. ASSERT_EQ(lhs.index(entt::entity{42}), 2u);
  459. lhs.respect(rhs);
  460. ASSERT_EQ(std::as_const(lhs).index(entt::entity{3}), 0u);
  461. ASSERT_EQ(std::as_const(lhs).index(entt::entity{12}), 1u);
  462. ASSERT_EQ(std::as_const(lhs).index(entt::entity{42}), 2u);
  463. }
  464. TEST(SparseSet, RespectOverlap) {
  465. entt::sparse_set lhs;
  466. entt::sparse_set rhs;
  467. lhs.emplace(entt::entity{3});
  468. lhs.emplace(entt::entity{12});
  469. lhs.emplace(entt::entity{42});
  470. rhs.emplace(entt::entity{12});
  471. ASSERT_EQ(lhs.index(entt::entity{3}), 0u);
  472. ASSERT_EQ(lhs.index(entt::entity{12}), 1u);
  473. ASSERT_EQ(lhs.index(entt::entity{42}), 2u);
  474. lhs.respect(rhs);
  475. ASSERT_EQ(std::as_const(lhs).index(entt::entity{3}), 0u);
  476. ASSERT_EQ(std::as_const(lhs).index(entt::entity{12}), 2u);
  477. ASSERT_EQ(std::as_const(lhs).index(entt::entity{42}), 1u);
  478. }
  479. TEST(SparseSet, RespectOrdered) {
  480. entt::sparse_set lhs;
  481. entt::sparse_set rhs;
  482. lhs.emplace(entt::entity{1});
  483. lhs.emplace(entt::entity{2});
  484. lhs.emplace(entt::entity{3});
  485. lhs.emplace(entt::entity{4});
  486. lhs.emplace(entt::entity{5});
  487. ASSERT_EQ(lhs.index(entt::entity{1}), 0u);
  488. ASSERT_EQ(lhs.index(entt::entity{2}), 1u);
  489. ASSERT_EQ(lhs.index(entt::entity{3}), 2u);
  490. ASSERT_EQ(lhs.index(entt::entity{4}), 3u);
  491. ASSERT_EQ(lhs.index(entt::entity{5}), 4u);
  492. rhs.emplace(entt::entity{6});
  493. rhs.emplace(entt::entity{1});
  494. rhs.emplace(entt::entity{2});
  495. rhs.emplace(entt::entity{3});
  496. rhs.emplace(entt::entity{4});
  497. rhs.emplace(entt::entity{5});
  498. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  499. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  500. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  501. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  502. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  503. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  504. rhs.respect(lhs);
  505. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  506. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  507. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  508. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  509. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  510. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  511. }
  512. TEST(SparseSet, RespectReverse) {
  513. entt::sparse_set lhs;
  514. entt::sparse_set rhs;
  515. lhs.emplace(entt::entity{1});
  516. lhs.emplace(entt::entity{2});
  517. lhs.emplace(entt::entity{3});
  518. lhs.emplace(entt::entity{4});
  519. lhs.emplace(entt::entity{5});
  520. ASSERT_EQ(lhs.index(entt::entity{1}), 0u);
  521. ASSERT_EQ(lhs.index(entt::entity{2}), 1u);
  522. ASSERT_EQ(lhs.index(entt::entity{3}), 2u);
  523. ASSERT_EQ(lhs.index(entt::entity{4}), 3u);
  524. ASSERT_EQ(lhs.index(entt::entity{5}), 4u);
  525. rhs.emplace(entt::entity{5});
  526. rhs.emplace(entt::entity{4});
  527. rhs.emplace(entt::entity{3});
  528. rhs.emplace(entt::entity{2});
  529. rhs.emplace(entt::entity{1});
  530. rhs.emplace(entt::entity{6});
  531. ASSERT_EQ(rhs.index(entt::entity{5}), 0u);
  532. ASSERT_EQ(rhs.index(entt::entity{4}), 1u);
  533. ASSERT_EQ(rhs.index(entt::entity{3}), 2u);
  534. ASSERT_EQ(rhs.index(entt::entity{2}), 3u);
  535. ASSERT_EQ(rhs.index(entt::entity{1}), 4u);
  536. ASSERT_EQ(rhs.index(entt::entity{6}), 5u);
  537. rhs.respect(lhs);
  538. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  539. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  540. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  541. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  542. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  543. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  544. }
  545. TEST(SparseSet, RespectUnordered) {
  546. entt::sparse_set lhs;
  547. entt::sparse_set rhs;
  548. lhs.emplace(entt::entity{1});
  549. lhs.emplace(entt::entity{2});
  550. lhs.emplace(entt::entity{3});
  551. lhs.emplace(entt::entity{4});
  552. lhs.emplace(entt::entity{5});
  553. ASSERT_EQ(lhs.index(entt::entity{1}), 0u);
  554. ASSERT_EQ(lhs.index(entt::entity{2}), 1u);
  555. ASSERT_EQ(lhs.index(entt::entity{3}), 2u);
  556. ASSERT_EQ(lhs.index(entt::entity{4}), 3u);
  557. ASSERT_EQ(lhs.index(entt::entity{5}), 4u);
  558. rhs.emplace(entt::entity{3});
  559. rhs.emplace(entt::entity{2});
  560. rhs.emplace(entt::entity{6});
  561. rhs.emplace(entt::entity{1});
  562. rhs.emplace(entt::entity{4});
  563. rhs.emplace(entt::entity{5});
  564. ASSERT_EQ(rhs.index(entt::entity{3}), 0u);
  565. ASSERT_EQ(rhs.index(entt::entity{2}), 1u);
  566. ASSERT_EQ(rhs.index(entt::entity{6}), 2u);
  567. ASSERT_EQ(rhs.index(entt::entity{1}), 3u);
  568. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  569. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  570. rhs.respect(lhs);
  571. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  572. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  573. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  574. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  575. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  576. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  577. }
  578. TEST(SparseSet, CanModifyDuringIteration) {
  579. entt::sparse_set set;
  580. set.emplace(entt::entity{0});
  581. ASSERT_EQ(set.capacity(), 1u);
  582. const auto it = set.begin();
  583. set.reserve(2u);
  584. ASSERT_EQ(set.capacity(), 2u);
  585. // this should crash with asan enabled if we break the constraint
  586. const auto entity = *it;
  587. (void)entity;
  588. }