sparse_set.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  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.remove(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.remove(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.remove(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, Erase) {
  107. entt::sparse_set set;
  108. entt::entity entities[3];
  109. entities[0] = entt::entity{3};
  110. entities[1] = entt::entity{42};
  111. entities[2] = entt::entity{9};
  112. set.insert(std::begin(entities), std::end(entities));
  113. set.erase(set.begin(), set.end());
  114. ASSERT_TRUE(set.empty());
  115. set.insert(std::begin(entities), std::end(entities));
  116. set.erase(set.rbegin(), set.rend());
  117. ASSERT_TRUE(set.empty());
  118. set.insert(std::begin(entities), std::end(entities));
  119. set.erase(entities, entities + 2u);
  120. ASSERT_FALSE(set.empty());
  121. ASSERT_EQ(*set.begin(), entt::entity{9});
  122. set.clear();
  123. set.insert(std::begin(entities), std::end(entities));
  124. std::swap(entities[1], entities[2]);
  125. set.erase(entities, entities + 2u);
  126. ASSERT_FALSE(set.empty());
  127. ASSERT_EQ(*set.begin(), entt::entity{42});
  128. }
  129. TEST(SparseSet, Iterator) {
  130. using iterator = typename entt::sparse_set::iterator;
  131. entt::sparse_set set;
  132. set.emplace(entt::entity{3});
  133. iterator end{set.begin()};
  134. iterator begin{};
  135. begin = set.end();
  136. std::swap(begin, end);
  137. ASSERT_EQ(begin, set.begin());
  138. ASSERT_EQ(end, set.end());
  139. ASSERT_NE(begin, end);
  140. ASSERT_EQ(begin++, set.begin());
  141. ASSERT_EQ(begin--, set.end());
  142. ASSERT_EQ(begin+1, set.end());
  143. ASSERT_EQ(end-1, set.begin());
  144. ASSERT_EQ(++begin, set.end());
  145. ASSERT_EQ(--begin, set.begin());
  146. ASSERT_EQ(begin += 1, set.end());
  147. ASSERT_EQ(begin -= 1, set.begin());
  148. ASSERT_EQ(begin + (end - begin), set.end());
  149. ASSERT_EQ(begin - (begin - end), set.end());
  150. ASSERT_EQ(end - (end - begin), set.begin());
  151. ASSERT_EQ(end + (begin - end), set.begin());
  152. ASSERT_EQ(begin[0], *set.begin());
  153. ASSERT_LT(begin, end);
  154. ASSERT_LE(begin, set.begin());
  155. ASSERT_GT(end, begin);
  156. ASSERT_GE(end, set.end());
  157. ASSERT_EQ(*begin, entt::entity{3});
  158. ASSERT_EQ(*begin.operator->(), entt::entity{3});
  159. }
  160. TEST(SparseSet, ReverseIterator) {
  161. using reverse_iterator = typename entt::sparse_set::reverse_iterator;
  162. entt::sparse_set set;
  163. set.emplace(entt::entity{3});
  164. reverse_iterator end{set.rbegin()};
  165. reverse_iterator begin{};
  166. begin = set.rend();
  167. std::swap(begin, end);
  168. ASSERT_EQ(begin, set.rbegin());
  169. ASSERT_EQ(end, set.rend());
  170. ASSERT_NE(begin, end);
  171. ASSERT_EQ(begin++, set.rbegin());
  172. ASSERT_EQ(begin--, set.rend());
  173. ASSERT_EQ(begin+1, set.rend());
  174. ASSERT_EQ(end-1, set.rbegin());
  175. ASSERT_EQ(++begin, set.rend());
  176. ASSERT_EQ(--begin, set.rbegin());
  177. ASSERT_EQ(begin += 1, set.rend());
  178. ASSERT_EQ(begin -= 1, set.rbegin());
  179. ASSERT_EQ(begin + (end - begin), set.rend());
  180. ASSERT_EQ(begin - (begin - end), set.rend());
  181. ASSERT_EQ(end - (end - begin), set.rbegin());
  182. ASSERT_EQ(end + (begin - end), set.rbegin());
  183. ASSERT_EQ(begin[0], *set.rbegin());
  184. ASSERT_LT(begin, end);
  185. ASSERT_LE(begin, set.rbegin());
  186. ASSERT_GT(end, begin);
  187. ASSERT_GE(end, set.rend());
  188. ASSERT_EQ(*begin, entt::entity{3});
  189. }
  190. TEST(SparseSet, Find) {
  191. entt::sparse_set set;
  192. set.emplace(entt::entity{3});
  193. set.emplace(entt::entity{42});
  194. set.emplace(entt::entity{99});
  195. ASSERT_NE(set.find(entt::entity{3}), set.end());
  196. ASSERT_NE(set.find(entt::entity{42}), set.end());
  197. ASSERT_NE(set.find(entt::entity{99}), set.end());
  198. ASSERT_EQ(set.find(entt::entity{0}), set.end());
  199. auto it = set.find(entt::entity{99});
  200. ASSERT_EQ(*it, entt::entity{99});
  201. ASSERT_EQ(*(++it), entt::entity{42});
  202. ASSERT_EQ(*(++it), entt::entity{3});
  203. ASSERT_EQ(++it, set.end());
  204. ASSERT_EQ(++set.find(entt::entity{3}), set.end());
  205. }
  206. TEST(SparseSet, Data) {
  207. entt::sparse_set set;
  208. set.emplace(entt::entity{3});
  209. set.emplace(entt::entity{12});
  210. set.emplace(entt::entity{42});
  211. ASSERT_EQ(set.index(entt::entity{3}), 0u);
  212. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  213. ASSERT_EQ(set.index(entt::entity{42}), 2u);
  214. ASSERT_EQ(*(set.data() + 0u), entt::entity{3});
  215. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  216. ASSERT_EQ(*(set.data() + 2u), entt::entity{42});
  217. }
  218. TEST(SparseSet, SortOrdered) {
  219. entt::sparse_set set;
  220. set.emplace(entt::entity{42});
  221. set.emplace(entt::entity{12});
  222. set.emplace(entt::entity{9});
  223. set.emplace(entt::entity{7});
  224. set.emplace(entt::entity{3});
  225. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  226. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  227. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  228. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  229. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  230. set.sort(set.begin(), set.end(), std::less{});
  231. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  232. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  233. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  234. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  235. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  236. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  237. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  238. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  239. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  240. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  241. auto begin = set.begin();
  242. auto end = set.end();
  243. ASSERT_EQ(*(begin++), entt::entity{3});
  244. ASSERT_EQ(*(begin++), entt::entity{7});
  245. ASSERT_EQ(*(begin++), entt::entity{9});
  246. ASSERT_EQ(*(begin++), entt::entity{12});
  247. ASSERT_EQ(*(begin++), entt::entity{42});
  248. ASSERT_EQ(begin, end);
  249. }
  250. TEST(SparseSet, SortReverse) {
  251. entt::sparse_set set;
  252. set.emplace(entt::entity{3});
  253. set.emplace(entt::entity{7});
  254. set.emplace(entt::entity{9});
  255. set.emplace(entt::entity{12});
  256. set.emplace(entt::entity{42});
  257. ASSERT_EQ(*(set.data() + 0u), entt::entity{3});
  258. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  259. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  260. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  261. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  262. set.sort(set.begin(), set.end(), std::less{});
  263. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  264. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  265. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  266. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  267. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  268. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  269. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  270. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  271. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  272. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  273. auto begin = set.begin();
  274. auto end = set.end();
  275. ASSERT_EQ(*(begin++), entt::entity{3});
  276. ASSERT_EQ(*(begin++), entt::entity{7});
  277. ASSERT_EQ(*(begin++), entt::entity{9});
  278. ASSERT_EQ(*(begin++), entt::entity{12});
  279. ASSERT_EQ(*(begin++), entt::entity{42});
  280. ASSERT_EQ(begin, end);
  281. }
  282. TEST(SparseSet, SortUnordered) {
  283. entt::sparse_set set;
  284. set.emplace(entt::entity{9});
  285. set.emplace(entt::entity{7});
  286. set.emplace(entt::entity{3});
  287. set.emplace(entt::entity{12});
  288. set.emplace(entt::entity{42});
  289. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  290. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  291. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  292. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  293. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  294. set.sort(set.begin(), set.end(), std::less{});
  295. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  296. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  297. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  298. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  299. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  300. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  301. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  302. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  303. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  304. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  305. auto begin = set.begin();
  306. auto end = set.end();
  307. ASSERT_EQ(*(begin++), entt::entity{3});
  308. ASSERT_EQ(*(begin++), entt::entity{7});
  309. ASSERT_EQ(*(begin++), entt::entity{9});
  310. ASSERT_EQ(*(begin++), entt::entity{12});
  311. ASSERT_EQ(*(begin++), entt::entity{42});
  312. ASSERT_EQ(begin, end);
  313. }
  314. TEST(SparseSet, SortRange) {
  315. entt::sparse_set set;
  316. set.emplace(entt::entity{9});
  317. set.emplace(entt::entity{7});
  318. set.emplace(entt::entity{3});
  319. set.emplace(entt::entity{12});
  320. set.emplace(entt::entity{42});
  321. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  322. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  323. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  324. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  325. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  326. set.sort(set.end(), set.end(), std::less{});
  327. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  328. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  329. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  330. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  331. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  332. set.sort(set.begin(), set.begin(), std::less{});
  333. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  334. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  335. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  336. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  337. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  338. set.sort(set.begin()+2, set.begin()+3, std::less{});
  339. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  340. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  341. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  342. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  343. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  344. set.sort(++set.begin(), --set.end(), std::less{});
  345. ASSERT_EQ(set.index(entt::entity{9}), 0u);
  346. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  347. ASSERT_EQ(set.index(entt::entity{7}), 2u);
  348. ASSERT_EQ(set.index(entt::entity{3}), 3u);
  349. ASSERT_EQ(set.index(entt::entity{42}), 4u);
  350. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  351. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  352. ASSERT_EQ(*(set.data() + 2u), entt::entity{7});
  353. ASSERT_EQ(*(set.data() + 3u), entt::entity{3});
  354. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  355. auto begin = set.begin();
  356. auto end = set.end();
  357. ASSERT_EQ(*(begin++), entt::entity{42});
  358. ASSERT_EQ(*(begin++), entt::entity{3});
  359. ASSERT_EQ(*(begin++), entt::entity{7});
  360. ASSERT_EQ(*(begin++), entt::entity{12});
  361. ASSERT_EQ(*(begin++), entt::entity{9});
  362. ASSERT_EQ(begin, end);
  363. }
  364. TEST(SparseSet, ArrangOrdered) {
  365. entt::sparse_set set;
  366. entt::entity entities[5]{entt::entity{42}, entt::entity{12}, entt::entity{9}, entt::entity{7}, entt::entity{3}};
  367. set.insert(std::begin(entities), std::end(entities));
  368. set.arrange(set.begin(), set.end(), [](auto...) { FAIL(); }, std::less{});
  369. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  370. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  371. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  372. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  373. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  374. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  375. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  376. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  377. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  378. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  379. ASSERT_TRUE(std::equal(std::begin(entities), std::end(entities), set.data()));
  380. }
  381. TEST(SparseSet, ArrangeReverse) {
  382. entt::sparse_set set;
  383. entt::entity entities[5]{entt::entity{3}, entt::entity{7}, entt::entity{9}, entt::entity{12}, entt::entity{42}};
  384. set.insert(std::begin(entities), std::end(entities));
  385. set.arrange(set.begin(), set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  386. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  387. }, std::less{});
  388. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  389. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  390. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  391. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  392. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  393. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  394. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  395. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  396. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  397. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  398. ASSERT_TRUE(std::equal(std::begin(entities), std::end(entities), set.data()));
  399. }
  400. TEST(SparseSet, ArrangeUnordered) {
  401. entt::sparse_set set;
  402. entt::entity entities[5]{entt::entity{9}, entt::entity{7}, entt::entity{3}, entt::entity{12}, entt::entity{42}};
  403. set.insert(std::begin(entities), std::end(entities));
  404. set.arrange(set.begin(), set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  405. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  406. }, std::less{});
  407. ASSERT_EQ(set.index(entt::entity{42}), 0u);
  408. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  409. ASSERT_EQ(set.index(entt::entity{9}), 2u);
  410. ASSERT_EQ(set.index(entt::entity{7}), 3u);
  411. ASSERT_EQ(set.index(entt::entity{3}), 4u);
  412. ASSERT_EQ(*(set.data() + 0u), entt::entity{42});
  413. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  414. ASSERT_EQ(*(set.data() + 2u), entt::entity{9});
  415. ASSERT_EQ(*(set.data() + 3u), entt::entity{7});
  416. ASSERT_EQ(*(set.data() + 4u), entt::entity{3});
  417. ASSERT_TRUE(std::equal(std::begin(entities), std::end(entities), set.data()));
  418. }
  419. TEST(SparseSet, ArrangeRange) {
  420. entt::sparse_set set;
  421. entt::entity entities[5]{entt::entity{9}, entt::entity{7}, entt::entity{3}, entt::entity{12}, entt::entity{42}};
  422. set.insert(std::begin(entities), std::end(entities));
  423. set.arrange(set.end(), set.end(), [](const auto, const auto) { FAIL(); }, std::less{});
  424. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  425. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  426. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  427. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  428. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  429. set.arrange(set.begin(), set.begin(), [](const auto, const auto) { FAIL(); }, std::less{});
  430. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  431. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  432. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  433. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  434. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  435. set.arrange(set.begin()+2, set.begin()+3, [](const auto, const auto) { FAIL(); }, std::less{});
  436. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  437. ASSERT_EQ(*(set.data() + 1u), entt::entity{7});
  438. ASSERT_EQ(*(set.data() + 2u), entt::entity{3});
  439. ASSERT_EQ(*(set.data() + 3u), entt::entity{12});
  440. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  441. set.arrange(++set.begin(), --set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  442. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  443. }, std::less{});
  444. ASSERT_EQ(set.index(entt::entity{9}), 0u);
  445. ASSERT_EQ(set.index(entt::entity{12}), 1u);
  446. ASSERT_EQ(set.index(entt::entity{7}), 2u);
  447. ASSERT_EQ(set.index(entt::entity{3}), 3u);
  448. ASSERT_EQ(set.index(entt::entity{42}), 4u);
  449. ASSERT_EQ(*(set.data() + 0u), entt::entity{9});
  450. ASSERT_EQ(*(set.data() + 1u), entt::entity{12});
  451. ASSERT_EQ(*(set.data() + 2u), entt::entity{7});
  452. ASSERT_EQ(*(set.data() + 3u), entt::entity{3});
  453. ASSERT_EQ(*(set.data() + 4u), entt::entity{42});
  454. }
  455. TEST(SparseSet, ArrangeCornerCase) {
  456. entt::sparse_set set;
  457. entt::entity entities[5]{entt::entity{0}, entt::entity{1}, entt::entity{4}, entt::entity{3}, entt::entity{2}};
  458. set.insert(std::begin(entities), std::end(entities));
  459. set.arrange(++set.begin(), set.end(), [&set, &entities](const auto lhs, const auto rhs) {
  460. std::swap(entities[set.index(lhs)], entities[set.index(rhs)]);
  461. }, std::less{});
  462. ASSERT_EQ(set.index(entt::entity{4}), 0u);
  463. ASSERT_EQ(set.index(entt::entity{3}), 1u);
  464. ASSERT_EQ(set.index(entt::entity{1}), 2u);
  465. ASSERT_EQ(set.index(entt::entity{0}), 3u);
  466. ASSERT_EQ(set.index(entt::entity{2}), 4u);
  467. ASSERT_EQ(*(set.data() + 0u), entt::entity{4});
  468. ASSERT_EQ(*(set.data() + 1u), entt::entity{3});
  469. ASSERT_EQ(*(set.data() + 2u), entt::entity{1});
  470. ASSERT_EQ(*(set.data() + 3u), entt::entity{0});
  471. ASSERT_EQ(*(set.data() + 4u), entt::entity{2});
  472. }
  473. TEST(SparseSet, RespectDisjoint) {
  474. entt::sparse_set lhs;
  475. entt::sparse_set rhs;
  476. lhs.emplace(entt::entity{3});
  477. lhs.emplace(entt::entity{12});
  478. lhs.emplace(entt::entity{42});
  479. ASSERT_EQ(lhs.index(entt::entity{3}), 0u);
  480. ASSERT_EQ(lhs.index(entt::entity{12}), 1u);
  481. ASSERT_EQ(lhs.index(entt::entity{42}), 2u);
  482. lhs.respect(rhs);
  483. ASSERT_EQ(std::as_const(lhs).index(entt::entity{3}), 0u);
  484. ASSERT_EQ(std::as_const(lhs).index(entt::entity{12}), 1u);
  485. ASSERT_EQ(std::as_const(lhs).index(entt::entity{42}), 2u);
  486. }
  487. TEST(SparseSet, RespectOverlap) {
  488. entt::sparse_set lhs;
  489. entt::sparse_set rhs;
  490. lhs.emplace(entt::entity{3});
  491. lhs.emplace(entt::entity{12});
  492. lhs.emplace(entt::entity{42});
  493. rhs.emplace(entt::entity{12});
  494. ASSERT_EQ(lhs.index(entt::entity{3}), 0u);
  495. ASSERT_EQ(lhs.index(entt::entity{12}), 1u);
  496. ASSERT_EQ(lhs.index(entt::entity{42}), 2u);
  497. lhs.respect(rhs);
  498. ASSERT_EQ(std::as_const(lhs).index(entt::entity{3}), 0u);
  499. ASSERT_EQ(std::as_const(lhs).index(entt::entity{12}), 2u);
  500. ASSERT_EQ(std::as_const(lhs).index(entt::entity{42}), 1u);
  501. }
  502. TEST(SparseSet, RespectOrdered) {
  503. entt::sparse_set lhs;
  504. entt::sparse_set rhs;
  505. lhs.emplace(entt::entity{1});
  506. lhs.emplace(entt::entity{2});
  507. lhs.emplace(entt::entity{3});
  508. lhs.emplace(entt::entity{4});
  509. lhs.emplace(entt::entity{5});
  510. ASSERT_EQ(lhs.index(entt::entity{1}), 0u);
  511. ASSERT_EQ(lhs.index(entt::entity{2}), 1u);
  512. ASSERT_EQ(lhs.index(entt::entity{3}), 2u);
  513. ASSERT_EQ(lhs.index(entt::entity{4}), 3u);
  514. ASSERT_EQ(lhs.index(entt::entity{5}), 4u);
  515. rhs.emplace(entt::entity{6});
  516. rhs.emplace(entt::entity{1});
  517. rhs.emplace(entt::entity{2});
  518. rhs.emplace(entt::entity{3});
  519. rhs.emplace(entt::entity{4});
  520. rhs.emplace(entt::entity{5});
  521. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  522. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  523. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  524. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  525. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  526. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  527. rhs.respect(lhs);
  528. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  529. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  530. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  531. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  532. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  533. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  534. }
  535. TEST(SparseSet, RespectReverse) {
  536. entt::sparse_set lhs;
  537. entt::sparse_set rhs;
  538. lhs.emplace(entt::entity{1});
  539. lhs.emplace(entt::entity{2});
  540. lhs.emplace(entt::entity{3});
  541. lhs.emplace(entt::entity{4});
  542. lhs.emplace(entt::entity{5});
  543. ASSERT_EQ(lhs.index(entt::entity{1}), 0u);
  544. ASSERT_EQ(lhs.index(entt::entity{2}), 1u);
  545. ASSERT_EQ(lhs.index(entt::entity{3}), 2u);
  546. ASSERT_EQ(lhs.index(entt::entity{4}), 3u);
  547. ASSERT_EQ(lhs.index(entt::entity{5}), 4u);
  548. rhs.emplace(entt::entity{5});
  549. rhs.emplace(entt::entity{4});
  550. rhs.emplace(entt::entity{3});
  551. rhs.emplace(entt::entity{2});
  552. rhs.emplace(entt::entity{1});
  553. rhs.emplace(entt::entity{6});
  554. ASSERT_EQ(rhs.index(entt::entity{5}), 0u);
  555. ASSERT_EQ(rhs.index(entt::entity{4}), 1u);
  556. ASSERT_EQ(rhs.index(entt::entity{3}), 2u);
  557. ASSERT_EQ(rhs.index(entt::entity{2}), 3u);
  558. ASSERT_EQ(rhs.index(entt::entity{1}), 4u);
  559. ASSERT_EQ(rhs.index(entt::entity{6}), 5u);
  560. rhs.respect(lhs);
  561. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  562. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  563. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  564. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  565. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  566. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  567. }
  568. TEST(SparseSet, RespectUnordered) {
  569. entt::sparse_set lhs;
  570. entt::sparse_set rhs;
  571. lhs.emplace(entt::entity{1});
  572. lhs.emplace(entt::entity{2});
  573. lhs.emplace(entt::entity{3});
  574. lhs.emplace(entt::entity{4});
  575. lhs.emplace(entt::entity{5});
  576. ASSERT_EQ(lhs.index(entt::entity{1}), 0u);
  577. ASSERT_EQ(lhs.index(entt::entity{2}), 1u);
  578. ASSERT_EQ(lhs.index(entt::entity{3}), 2u);
  579. ASSERT_EQ(lhs.index(entt::entity{4}), 3u);
  580. ASSERT_EQ(lhs.index(entt::entity{5}), 4u);
  581. rhs.emplace(entt::entity{3});
  582. rhs.emplace(entt::entity{2});
  583. rhs.emplace(entt::entity{6});
  584. rhs.emplace(entt::entity{1});
  585. rhs.emplace(entt::entity{4});
  586. rhs.emplace(entt::entity{5});
  587. ASSERT_EQ(rhs.index(entt::entity{3}), 0u);
  588. ASSERT_EQ(rhs.index(entt::entity{2}), 1u);
  589. ASSERT_EQ(rhs.index(entt::entity{6}), 2u);
  590. ASSERT_EQ(rhs.index(entt::entity{1}), 3u);
  591. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  592. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  593. rhs.respect(lhs);
  594. ASSERT_EQ(rhs.index(entt::entity{6}), 0u);
  595. ASSERT_EQ(rhs.index(entt::entity{1}), 1u);
  596. ASSERT_EQ(rhs.index(entt::entity{2}), 2u);
  597. ASSERT_EQ(rhs.index(entt::entity{3}), 3u);
  598. ASSERT_EQ(rhs.index(entt::entity{4}), 4u);
  599. ASSERT_EQ(rhs.index(entt::entity{5}), 5u);
  600. }
  601. TEST(SparseSet, CanModifyDuringIteration) {
  602. entt::sparse_set set;
  603. set.emplace(entt::entity{0});
  604. ASSERT_EQ(set.capacity(), 1u);
  605. const auto it = set.begin();
  606. set.reserve(2u);
  607. ASSERT_EQ(set.capacity(), 2u);
  608. // this should crash with asan enabled if we break the constraint
  609. const auto entity = *it;
  610. (void)entity;
  611. }