meta_container.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. #include <array>
  2. #include <deque>
  3. #include <list>
  4. #include <map>
  5. #include <set>
  6. #include <utility>
  7. #include <vector>
  8. #include <gtest/gtest.h>
  9. #include <common/config.h>
  10. #include <common/empty.h>
  11. #include <common/non_default_constructible.h>
  12. #include <entt/container/dense_map.hpp>
  13. #include <entt/container/dense_set.hpp>
  14. #include <entt/meta/container.hpp>
  15. #include <entt/meta/factory.hpp>
  16. #include <entt/meta/meta.hpp>
  17. #include <entt/meta/resolve.hpp>
  18. TEST(MetaContainer, Invalid) {
  19. ASSERT_FALSE(entt::meta_any{0}.as_sequence_container());
  20. ASSERT_FALSE(entt::meta_any{0}.as_associative_container());
  21. ASSERT_FALSE((entt::meta_any{std::map<int, char>{}}.as_sequence_container()));
  22. ASSERT_FALSE(entt::meta_any{std::vector<int>{}}.as_associative_container());
  23. }
  24. TEST(SequenceContainer, Empty) {
  25. entt::meta_sequence_container container{};
  26. ASSERT_FALSE(container);
  27. entt::meta_any any{std::vector<int>{}};
  28. container = any.as_sequence_container();
  29. ASSERT_TRUE(container);
  30. }
  31. TEST(SequenceContainer, Iterator) {
  32. std::vector<int> vec{2, 3, 4};
  33. auto any = entt::forward_as_meta(vec);
  34. entt::meta_sequence_container::iterator first{};
  35. auto view = any.as_sequence_container();
  36. ASSERT_FALSE(first);
  37. first = view.begin();
  38. const auto last = view.end();
  39. ASSERT_TRUE(first);
  40. ASSERT_TRUE(last);
  41. ASSERT_FALSE(first == last);
  42. ASSERT_TRUE(first != last);
  43. ASSERT_EQ((first++)->cast<int>(), 2);
  44. ASSERT_EQ((++first)->cast<int>(), 4);
  45. ASSERT_NE(first++, last);
  46. ASSERT_TRUE(first == last);
  47. ASSERT_FALSE(first != last);
  48. ASSERT_EQ(first--, last);
  49. ASSERT_EQ((first--)->cast<int>(), 4);
  50. ASSERT_EQ((--first)->cast<int>(), 2);
  51. }
  52. TEST(SequenceContainer, StdVector) {
  53. std::vector<int> vec{};
  54. auto any = entt::forward_as_meta(vec);
  55. auto view = any.as_sequence_container();
  56. auto cview = std::as_const(any).as_sequence_container();
  57. ASSERT_TRUE(view);
  58. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  59. ASSERT_EQ(view.size(), 0u);
  60. ASSERT_EQ(view.begin(), view.end());
  61. ASSERT_TRUE(view.resize(3u));
  62. ASSERT_EQ(view.size(), 3u);
  63. ASSERT_NE(view.begin(), view.end());
  64. view[0].cast<int &>() = 2;
  65. view[1].cast<int &>() = 3;
  66. view[2].cast<int &>() = 4;
  67. ASSERT_EQ(view[1u].cast<int>(), 3);
  68. auto it = view.begin();
  69. auto ret = view.insert(it, 0);
  70. ASSERT_TRUE(ret);
  71. ASSERT_FALSE(view.insert(ret, test::empty{}));
  72. ASSERT_TRUE(view.insert(++ret, 1.));
  73. ASSERT_EQ(view.size(), 5u);
  74. ASSERT_EQ(view.begin()->cast<int>(), 0);
  75. ASSERT_EQ((++view.begin())->cast<int>(), 1);
  76. ret = view.insert(cview.end(), 64);
  77. ASSERT_TRUE(ret);
  78. ASSERT_EQ(*ret, 64);
  79. it = view.begin();
  80. ret = view.erase(it);
  81. ASSERT_TRUE(ret);
  82. ASSERT_EQ(view.size(), 5u);
  83. ASSERT_EQ(ret->cast<int>(), 1);
  84. ret = view.erase(cview.begin());
  85. ASSERT_TRUE(ret);
  86. ASSERT_EQ(view.size(), 4u);
  87. ASSERT_EQ(ret->cast<int>(), 2);
  88. ASSERT_TRUE(view.clear());
  89. ASSERT_TRUE(view.reserve(8u));
  90. ASSERT_EQ(view.size(), 0u);
  91. }
  92. TEST(SequenceContainer, StdVectorBool) {
  93. using proxy_type = typename std::vector<bool>::reference;
  94. using const_proxy_type = typename std::vector<bool>::const_reference;
  95. std::vector<bool> vec{};
  96. auto any = entt::forward_as_meta(vec);
  97. auto cany = std::as_const(any).as_ref();
  98. auto view = any.as_sequence_container();
  99. auto cview = cany.as_sequence_container();
  100. ASSERT_TRUE(view);
  101. ASSERT_EQ(view.value_type(), entt::resolve<bool>());
  102. ASSERT_EQ(view.size(), 0u);
  103. ASSERT_EQ(view.begin(), view.end());
  104. ASSERT_TRUE(view.resize(3u));
  105. ASSERT_EQ(view.size(), 3u);
  106. ASSERT_NE(view.begin(), view.end());
  107. view[0].cast<proxy_type>() = true;
  108. view[1].cast<proxy_type>() = true;
  109. view[2].cast<proxy_type>() = false;
  110. ASSERT_EQ(cview[1u].cast<const_proxy_type>(), true);
  111. auto it = view.begin();
  112. auto ret = view.insert(it, true);
  113. ASSERT_TRUE(ret);
  114. ASSERT_FALSE(view.insert(ret, test::empty{}));
  115. ASSERT_TRUE(view.insert(++ret, false));
  116. ASSERT_EQ(view.size(), 5u);
  117. ASSERT_EQ(view.begin()->cast<proxy_type>(), true);
  118. ASSERT_EQ((++cview.begin())->cast<const_proxy_type>(), false);
  119. it = view.begin();
  120. ret = view.erase(it);
  121. ASSERT_TRUE(ret);
  122. ASSERT_EQ(view.size(), 4u);
  123. ASSERT_EQ(ret->cast<proxy_type>(), false);
  124. ASSERT_TRUE(view.clear());
  125. ASSERT_TRUE(view.reserve(8u));
  126. ASSERT_EQ(cview.size(), 0u);
  127. }
  128. TEST(SequenceContainer, StdArray) {
  129. std::array<int, 3> arr{};
  130. auto any = entt::forward_as_meta(arr);
  131. auto view = any.as_sequence_container();
  132. ASSERT_TRUE(view);
  133. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  134. ASSERT_EQ(view.size(), 3u);
  135. ASSERT_NE(view.begin(), view.end());
  136. ASSERT_FALSE(view.resize(5u));
  137. ASSERT_EQ(view.size(), 3u);
  138. view[0].cast<int &>() = 2;
  139. view[1].cast<int &>() = 3;
  140. view[2].cast<int &>() = 4;
  141. ASSERT_EQ(view[1u].cast<int>(), 3);
  142. auto it = view.begin();
  143. auto ret = view.insert(it, 0);
  144. ASSERT_FALSE(ret);
  145. ASSERT_FALSE(view.insert(it, 'c'));
  146. ASSERT_FALSE(view.insert(++it, 1.));
  147. ASSERT_EQ(view.size(), 3u);
  148. ASSERT_EQ(view.begin()->cast<int>(), 2);
  149. ASSERT_EQ((++view.begin())->cast<int>(), 3);
  150. it = view.begin();
  151. ret = view.erase(it);
  152. ASSERT_FALSE(ret);
  153. ASSERT_EQ(view.size(), 3u);
  154. ASSERT_EQ(it->cast<int>(), 2);
  155. ASSERT_FALSE(view.clear());
  156. ASSERT_FALSE(view.reserve(8u));
  157. ASSERT_EQ(view.size(), 3u);
  158. }
  159. TEST(SequenceContainer, StdList) {
  160. std::list<int> list{};
  161. auto any = entt::forward_as_meta(list);
  162. auto view = any.as_sequence_container();
  163. auto cview = std::as_const(any).as_sequence_container();
  164. ASSERT_TRUE(view);
  165. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  166. ASSERT_EQ(view.size(), 0u);
  167. ASSERT_EQ(view.begin(), view.end());
  168. ASSERT_TRUE(view.resize(3u));
  169. ASSERT_EQ(view.size(), 3u);
  170. ASSERT_NE(view.begin(), view.end());
  171. view[0].cast<int &>() = 2;
  172. view[1].cast<int &>() = 3;
  173. view[2].cast<int &>() = 4;
  174. ASSERT_EQ(view[1u].cast<int>(), 3);
  175. auto it = view.begin();
  176. auto ret = view.insert(it, 0);
  177. ASSERT_TRUE(ret);
  178. ASSERT_FALSE(view.insert(ret, test::empty{}));
  179. ASSERT_TRUE(view.insert(++ret, 1.));
  180. ASSERT_EQ(view.size(), 5u);
  181. ASSERT_EQ(view.begin()->cast<int>(), 0);
  182. ASSERT_EQ((++view.begin())->cast<int>(), 1);
  183. ret = view.insert(cview.end(), 64);
  184. ASSERT_TRUE(ret);
  185. ASSERT_EQ(*ret, 64);
  186. it = view.begin();
  187. ret = view.erase(it);
  188. ASSERT_TRUE(ret);
  189. ASSERT_EQ(view.size(), 5u);
  190. ASSERT_EQ(ret->cast<int>(), 1);
  191. ret = view.erase(cview.begin());
  192. ASSERT_TRUE(ret);
  193. ASSERT_EQ(view.size(), 4u);
  194. ASSERT_EQ(ret->cast<int>(), 2);
  195. ASSERT_TRUE(view.clear());
  196. ASSERT_FALSE(view.reserve(8u));
  197. ASSERT_EQ(view.size(), 0u);
  198. }
  199. TEST(SequenceContainer, StdDeque) {
  200. std::deque<int> deque{};
  201. auto any = entt::forward_as_meta(deque);
  202. auto view = any.as_sequence_container();
  203. auto cview = std::as_const(any).as_sequence_container();
  204. ASSERT_TRUE(view);
  205. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  206. ASSERT_EQ(view.size(), 0u);
  207. ASSERT_EQ(view.begin(), view.end());
  208. ASSERT_TRUE(view.resize(3u));
  209. ASSERT_EQ(view.size(), 3u);
  210. ASSERT_NE(view.begin(), view.end());
  211. view[0].cast<int &>() = 2;
  212. view[1].cast<int &>() = 3;
  213. view[2].cast<int &>() = 4;
  214. ASSERT_EQ(view[1u].cast<int>(), 3);
  215. auto it = view.begin();
  216. auto ret = view.insert(it, 0);
  217. ASSERT_TRUE(ret);
  218. ASSERT_FALSE(view.insert(ret, test::empty{}));
  219. ASSERT_TRUE(view.insert(++ret, 1.));
  220. ASSERT_EQ(view.size(), 5u);
  221. ASSERT_EQ(view.begin()->cast<int>(), 0);
  222. ASSERT_EQ((++view.begin())->cast<int>(), 1);
  223. ret = view.insert(cview.end(), 64);
  224. ASSERT_TRUE(ret);
  225. ASSERT_EQ(*ret, 64);
  226. it = view.begin();
  227. ret = view.erase(it);
  228. ASSERT_TRUE(ret);
  229. ASSERT_EQ(view.size(), 5u);
  230. ASSERT_EQ(ret->cast<int>(), 1);
  231. ret = view.erase(cview.begin());
  232. ASSERT_TRUE(ret);
  233. ASSERT_EQ(view.size(), 4u);
  234. ASSERT_EQ(ret->cast<int>(), 2);
  235. ASSERT_TRUE(view.clear());
  236. ASSERT_FALSE(view.reserve(8u));
  237. ASSERT_EQ(view.size(), 0u);
  238. }
  239. TEST(SequenceContainer, NonDefaultConstructible) {
  240. std::vector<test::non_default_constructible> vec{};
  241. auto any = entt::forward_as_meta(vec);
  242. auto view = any.as_sequence_container();
  243. ASSERT_FALSE(view.resize(5u));
  244. }
  245. TEST(SequenceContainer, Constness) {
  246. std::vector<int> vec{};
  247. auto any = entt::forward_as_meta(std::as_const(vec));
  248. auto view = any.as_sequence_container();
  249. ASSERT_TRUE(view);
  250. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  251. ASSERT_EQ(view.size(), 0u);
  252. ASSERT_EQ(view.begin(), view.end());
  253. ASSERT_FALSE(view.resize(3u));
  254. ASSERT_EQ(view.size(), 0u);
  255. ASSERT_EQ(view.begin(), view.end());
  256. vec.push_back(64);
  257. ASSERT_EQ(view.size(), 1u);
  258. ASSERT_NE(view.begin(), view.end());
  259. ASSERT_EQ(view[0].cast<const int &>(), 64);
  260. auto it = view.begin();
  261. auto ret = view.insert(it, 0);
  262. ASSERT_FALSE(ret);
  263. ASSERT_EQ(view.size(), 1u);
  264. ASSERT_EQ(it->cast<int>(), 64);
  265. ASSERT_EQ(++it, view.end());
  266. it = view.begin();
  267. ret = view.erase(it);
  268. ASSERT_FALSE(ret);
  269. ASSERT_EQ(view.size(), 1u);
  270. ASSERT_FALSE(view.clear());
  271. ASSERT_FALSE(view.reserve(8u));
  272. ASSERT_EQ(view.size(), 1u);
  273. }
  274. ENTT_DEBUG_TEST(SequenceContainerDeathTest, Constness) {
  275. std::vector<int> vec{};
  276. auto any = entt::forward_as_meta(std::as_const(vec));
  277. auto view = any.as_sequence_container();
  278. ASSERT_TRUE(view);
  279. ASSERT_DEATH(view[0].cast<int &>() = 2, "");
  280. }
  281. TEST(SequenceContainer, FromConstAny) {
  282. const std::vector<int> vec{64};
  283. const entt::meta_any any{vec};
  284. auto view = any.as_sequence_container();
  285. ASSERT_TRUE(view);
  286. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  287. ASSERT_EQ(view[0].cast<const int &>(), 64);
  288. }
  289. TEST(SequenceContainer, FromConstAnyRef) {
  290. std::vector<int> vec{64};
  291. const entt::meta_any any = entt::forward_as_meta(vec);
  292. auto view = any.as_sequence_container();
  293. ASSERT_TRUE(view);
  294. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  295. ASSERT_EQ(view[0].cast<const int &>(), 64);
  296. }
  297. TEST(SequenceContainer, FromConstAnyConstRef) {
  298. std::vector<int> vec{64};
  299. const entt::meta_any any = entt::forward_as_meta(std::as_const(vec));
  300. auto view = any.as_sequence_container();
  301. ASSERT_TRUE(view);
  302. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  303. ASSERT_EQ(view[0].cast<const int &>(), 64);
  304. }
  305. ENTT_DEBUG_TEST(SequenceContainerDeathTest, FromConstAny) {
  306. const std::vector<int> vec{64};
  307. const entt::meta_any any{vec};
  308. auto view = any.as_sequence_container();
  309. ASSERT_TRUE(view);
  310. ASSERT_DEATH(view[0].cast<int &>() = 2, "");
  311. }
  312. ENTT_DEBUG_TEST(SequenceContainerDeathTest, FromConstAnyRef) {
  313. std::vector<int> vec{64};
  314. const entt::meta_any any = entt::forward_as_meta(vec);
  315. auto view = any.as_sequence_container();
  316. ASSERT_TRUE(view);
  317. ASSERT_DEATH(view[0].cast<int &>() = 2, "");
  318. }
  319. ENTT_DEBUG_TEST(SequenceContainerDeathTest, FromConstAnyConstRef) {
  320. std::vector<int> vec{64};
  321. const entt::meta_any any = entt::forward_as_meta(std::as_const(vec));
  322. auto view = any.as_sequence_container();
  323. ASSERT_TRUE(view);
  324. ASSERT_DEATH(view[0].cast<int &>() = 2, "");
  325. }
  326. TEST(AssociativeContainer, Empty) {
  327. entt::meta_associative_container container{};
  328. ASSERT_FALSE(container);
  329. entt::meta_any any{std::map<int, char>{}};
  330. container = any.as_associative_container();
  331. ASSERT_TRUE(container);
  332. }
  333. TEST(AssociativeContainer, Iterator) {
  334. std::map<int, char> map{{2, 'c'}, {3, 'd'}, {4, 'e'}};
  335. auto any = entt::forward_as_meta(map);
  336. entt::meta_associative_container::iterator first{};
  337. auto view = any.as_associative_container();
  338. ASSERT_FALSE(first);
  339. first = view.begin();
  340. const auto last = view.end();
  341. ASSERT_TRUE(first);
  342. ASSERT_TRUE(last);
  343. ASSERT_FALSE(first == last);
  344. ASSERT_TRUE(first != last);
  345. ASSERT_NE(first, last);
  346. ASSERT_EQ((first++)->first.cast<int>(), 2);
  347. ASSERT_EQ((++first)->second.cast<char>(), 'e');
  348. ASSERT_NE(first++, last);
  349. ASSERT_EQ(first, last);
  350. ASSERT_TRUE(first == last);
  351. ASSERT_FALSE(first != last);
  352. }
  353. TEST(AssociativeContainer, StdMap) {
  354. std::map<int, char> map{{2, 'c'}, {3, 'd'}, {4, 'e'}};
  355. auto any = entt::forward_as_meta(map);
  356. auto view = any.as_associative_container();
  357. ASSERT_TRUE(view);
  358. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  359. ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
  360. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  361. ASSERT_EQ(view.size(), 3u);
  362. ASSERT_NE(view.begin(), view.end());
  363. ASSERT_EQ(view.find(3)->second.cast<char>(), 'd');
  364. ASSERT_FALSE(view.insert(test::empty{}, 'a'));
  365. ASSERT_FALSE(view.insert(1, test::empty{}));
  366. ASSERT_TRUE(view.insert(0, 'a'));
  367. ASSERT_TRUE(view.insert(1., static_cast<int>('b')));
  368. ASSERT_EQ(view.size(), 5u);
  369. ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
  370. ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
  371. ASSERT_EQ(view.erase(test::empty{}), 0u);
  372. ASSERT_FALSE(view.find(test::empty{}));
  373. ASSERT_EQ(view.size(), 5u);
  374. ASSERT_EQ(view.erase(0), 1u);
  375. ASSERT_EQ(view.size(), 4u);
  376. ASSERT_EQ(view.find(0), view.end());
  377. view.find(1.)->second.cast<char &>() = 'f';
  378. ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
  379. ASSERT_EQ(view.erase(1.), 1u);
  380. ASSERT_TRUE(view.clear());
  381. ASSERT_FALSE(view.reserve(8u));
  382. ASSERT_EQ(view.size(), 0u);
  383. }
  384. TEST(AssociativeContainer, StdSet) {
  385. std::set<int> set{2, 3, 4};
  386. auto any = entt::forward_as_meta(set);
  387. auto view = any.as_associative_container();
  388. ASSERT_TRUE(view);
  389. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  390. ASSERT_EQ(view.mapped_type(), entt::meta_type{});
  391. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  392. ASSERT_EQ(view.size(), 3u);
  393. ASSERT_NE(view.begin(), view.end());
  394. ASSERT_EQ(view.find(3)->first.cast<int>(), 3);
  395. ASSERT_FALSE(view.insert(test::empty{}));
  396. ASSERT_TRUE(view.insert(.0));
  397. ASSERT_TRUE(view.insert(1));
  398. ASSERT_EQ(view.size(), 5u);
  399. ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
  400. ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
  401. ASSERT_EQ(view.erase(test::empty{}), 0u);
  402. ASSERT_FALSE(view.find(test::empty{}));
  403. ASSERT_EQ(view.size(), 5u);
  404. ASSERT_EQ(view.erase(0), 1u);
  405. ASSERT_EQ(view.size(), 4u);
  406. ASSERT_EQ(view.find(0), view.end());
  407. ASSERT_EQ(view.find(1.f)->first.try_cast<int>(), nullptr);
  408. ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
  409. ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
  410. ASSERT_EQ(view.erase(1.), 1u);
  411. ASSERT_TRUE(view.clear());
  412. ASSERT_FALSE(view.reserve(8u));
  413. ASSERT_EQ(view.size(), 0u);
  414. }
  415. TEST(AssociativeContainer, DenseMap) {
  416. entt::dense_map<int, char> map{};
  417. auto any = entt::forward_as_meta(map);
  418. auto view = any.as_associative_container();
  419. map.emplace(2, 'c');
  420. map.emplace(3, 'd');
  421. map.emplace(4, '3');
  422. ASSERT_TRUE(view);
  423. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  424. ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
  425. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  426. ASSERT_EQ(view.size(), 3u);
  427. ASSERT_NE(view.begin(), view.end());
  428. ASSERT_EQ(view.find(3)->second.cast<char>(), 'd');
  429. ASSERT_FALSE(view.insert(test::empty{}, 'a'));
  430. ASSERT_FALSE(view.insert(1, test::empty{}));
  431. ASSERT_TRUE(view.insert(0, 'a'));
  432. ASSERT_TRUE(view.insert(1., static_cast<int>('b')));
  433. ASSERT_EQ(view.size(), 5u);
  434. ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
  435. ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
  436. ASSERT_EQ(view.erase(test::empty{}), 0u);
  437. ASSERT_FALSE(view.find(test::empty{}));
  438. ASSERT_EQ(view.size(), 5u);
  439. ASSERT_EQ(view.erase(0), 1u);
  440. ASSERT_EQ(view.size(), 4u);
  441. ASSERT_EQ(view.find(0), view.end());
  442. view.find(1.)->second.cast<char &>() = 'f';
  443. ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
  444. ASSERT_EQ(view.erase(1.), 1u);
  445. ASSERT_TRUE(view.clear());
  446. ASSERT_TRUE(view.reserve(8u));
  447. ASSERT_EQ(view.size(), 0u);
  448. }
  449. TEST(AssociativeContainer, DenseSet) {
  450. entt::dense_set<int> set{};
  451. auto any = entt::forward_as_meta(set);
  452. auto view = any.as_associative_container();
  453. set.emplace(2);
  454. set.emplace(3);
  455. set.emplace(4);
  456. ASSERT_TRUE(view);
  457. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  458. ASSERT_EQ(view.mapped_type(), entt::meta_type{});
  459. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  460. ASSERT_EQ(view.size(), 3u);
  461. ASSERT_NE(view.begin(), view.end());
  462. ASSERT_EQ(view.find(3)->first.cast<int>(), 3);
  463. ASSERT_FALSE(view.insert(test::empty{}));
  464. ASSERT_TRUE(view.insert(.0));
  465. ASSERT_TRUE(view.insert(1));
  466. ASSERT_EQ(view.size(), 5u);
  467. ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
  468. ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
  469. ASSERT_EQ(view.erase(test::empty{}), 0u);
  470. ASSERT_FALSE(view.find(test::empty{}));
  471. ASSERT_EQ(view.size(), 5u);
  472. ASSERT_EQ(view.erase(0), 1u);
  473. ASSERT_EQ(view.size(), 4u);
  474. ASSERT_EQ(view.find(0), view.end());
  475. ASSERT_EQ(view.find(1.f)->first.try_cast<int>(), nullptr);
  476. ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
  477. ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
  478. ASSERT_EQ(view.erase(1.), 1u);
  479. ASSERT_TRUE(view.clear());
  480. ASSERT_TRUE(view.reserve(8u));
  481. ASSERT_EQ(view.size(), 0u);
  482. }
  483. TEST(KeyValueAssociativeContainer, Constness) {
  484. std::map<int, char> map{};
  485. auto any = entt::forward_as_meta(std::as_const(map));
  486. auto view = any.as_associative_container();
  487. ASSERT_TRUE(view);
  488. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  489. ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
  490. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  491. ASSERT_EQ(view.size(), 0u);
  492. ASSERT_EQ(view.begin(), view.end());
  493. map[2] = 'c';
  494. ASSERT_EQ(view.size(), 1u);
  495. ASSERT_NE(view.begin(), view.end());
  496. ASSERT_EQ(view.find(2)->second.cast<const char &>(), 'c');
  497. ASSERT_FALSE(view.insert(0, 'a'));
  498. ASSERT_EQ(view.size(), 1u);
  499. ASSERT_EQ(view.find(0), view.end());
  500. ASSERT_EQ(view.find(2)->second.cast<char>(), 'c');
  501. ASSERT_EQ(view.erase(2), 0u);
  502. ASSERT_EQ(view.size(), 1u);
  503. ASSERT_NE(view.find(2), view.end());
  504. ASSERT_FALSE(view.clear());
  505. ASSERT_FALSE(view.reserve(8u));
  506. ASSERT_EQ(view.size(), 1u);
  507. }
  508. ENTT_DEBUG_TEST(KeyValueAssociativeContainerDeathTest, Constness) {
  509. std::map<int, char> map{};
  510. auto any = entt::forward_as_meta(std::as_const(map));
  511. auto view = any.as_associative_container();
  512. ASSERT_TRUE(view);
  513. ASSERT_DEATH(view.find(2)->second.cast<char &>() = 'a', "");
  514. }
  515. TEST(KeyOnlyAssociativeContainer, Constness) {
  516. std::set<int> set{};
  517. auto any = entt::forward_as_meta(std::as_const(set));
  518. auto view = any.as_associative_container();
  519. ASSERT_TRUE(view);
  520. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  521. ASSERT_EQ(view.mapped_type(), entt::meta_type{});
  522. ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
  523. ASSERT_EQ(view.size(), 0u);
  524. ASSERT_EQ(view.begin(), view.end());
  525. set.insert(2);
  526. ASSERT_EQ(view.size(), 1u);
  527. ASSERT_NE(view.begin(), view.end());
  528. ASSERT_EQ(view.find(2)->first.try_cast<int>(), nullptr);
  529. ASSERT_NE(view.find(2)->first.try_cast<const int>(), nullptr);
  530. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  531. ASSERT_EQ(view.find(2)->first.cast<const int &>(), 2);
  532. ASSERT_FALSE(view.insert(0));
  533. ASSERT_EQ(view.size(), 1u);
  534. ASSERT_EQ(view.find(0), view.end());
  535. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  536. ASSERT_EQ(view.erase(2), 0u);
  537. ASSERT_EQ(view.size(), 1u);
  538. ASSERT_NE(view.find(2), view.end());
  539. ASSERT_FALSE(view.clear());
  540. ASSERT_FALSE(view.reserve(8u));
  541. ASSERT_EQ(view.size(), 1u);
  542. }
  543. TEST(KeyValueAssociativeContainer, FromConstAny) {
  544. const std::map<int, char> map{{2, 'c'}};
  545. const entt::meta_any any{map};
  546. auto view = any.as_associative_container();
  547. ASSERT_TRUE(view);
  548. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  549. ASSERT_EQ(view.find(2)->second.cast<const char &>(), 'c');
  550. }
  551. TEST(KeyValueAssociativeContainer, FromConstAnyRef) {
  552. std::map<int, char> map{{2, 'c'}};
  553. const entt::meta_any any = entt::forward_as_meta(map);
  554. auto view = any.as_associative_container();
  555. ASSERT_TRUE(view);
  556. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  557. ASSERT_EQ(view.find(2)->second.cast<const char &>(), 'c');
  558. }
  559. TEST(KeyValueAssociativeContainer, FromConstAnyConstRef) {
  560. std::map<int, char> map{{2, 'c'}};
  561. const entt::meta_any any = entt::forward_as_meta(std::as_const(map));
  562. auto view = any.as_associative_container();
  563. ASSERT_TRUE(view);
  564. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  565. ASSERT_EQ(view.find(2)->second.cast<const char &>(), 'c');
  566. }
  567. ENTT_DEBUG_TEST(KeyValueAssociativeContainerDeathTest, FromConstAny) {
  568. const std::map<int, char> map{{2, 'c'}};
  569. const entt::meta_any any{map};
  570. auto view = any.as_associative_container();
  571. ASSERT_TRUE(view);
  572. ASSERT_DEATH(view.find(2)->second.cast<char &>() = 'a', "");
  573. }
  574. ENTT_DEBUG_TEST(KeyValueAssociativeContainerDeathTest, FromConstAnyRef) {
  575. std::map<int, char> map{{2, 'c'}};
  576. const entt::meta_any any = entt::forward_as_meta(map);
  577. auto view = any.as_associative_container();
  578. ASSERT_TRUE(view);
  579. ASSERT_DEATH(view.find(2)->second.cast<char &>() = 'a', "");
  580. }
  581. ENTT_DEBUG_TEST(KeyValueAssociativeContainerDeathTest, FromConstAnyConstRef) {
  582. std::map<int, char> map{{2, 'c'}};
  583. const entt::meta_any any = entt::forward_as_meta(std::as_const(map));
  584. auto view = any.as_associative_container();
  585. ASSERT_TRUE(view);
  586. ASSERT_DEATH(view.find(2)->second.cast<char &>() = 'a', "");
  587. }
  588. TEST(KeyOnlyAssociativeContainer, FromConstAny) {
  589. const std::set<int> set{2};
  590. const entt::meta_any any{set};
  591. auto view = any.as_associative_container();
  592. ASSERT_TRUE(view);
  593. ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
  594. ASSERT_EQ(view.find(2)->first.try_cast<int>(), nullptr);
  595. ASSERT_NE(view.find(2)->first.try_cast<const int>(), nullptr);
  596. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  597. ASSERT_EQ(view.find(2)->first.cast<const int &>(), 2);
  598. }
  599. TEST(KeyOnlyAssociativeContainer, FromConstAnyRef) {
  600. std::set<int> set{2};
  601. const entt::meta_any any = entt::forward_as_meta(set);
  602. auto view = any.as_associative_container();
  603. ASSERT_TRUE(view);
  604. ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
  605. ASSERT_EQ(view.find(2)->first.try_cast<int>(), nullptr);
  606. ASSERT_NE(view.find(2)->first.try_cast<const int>(), nullptr);
  607. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  608. ASSERT_EQ(view.find(2)->first.cast<const int &>(), 2);
  609. }
  610. TEST(KeyOnlyAssociativeContainer, FromConstAnyConstRef) {
  611. std::set<int> set{2};
  612. const entt::meta_any any = entt::forward_as_meta(std::as_const(set));
  613. auto view = any.as_associative_container();
  614. ASSERT_TRUE(view);
  615. ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
  616. ASSERT_EQ(view.find(2)->first.try_cast<int>(), nullptr);
  617. ASSERT_NE(view.find(2)->first.try_cast<const int>(), nullptr);
  618. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  619. ASSERT_EQ(view.find(2)->first.cast<const int &>(), 2);
  620. }