meta_container.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  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 <entt/container/dense_map.hpp>
  10. #include <entt/container/dense_set.hpp>
  11. #include <entt/meta/container.hpp>
  12. #include <entt/meta/factory.hpp>
  13. #include <entt/meta/meta.hpp>
  14. #include <entt/meta/resolve.hpp>
  15. #include "../common/config.h"
  16. #include "../common/empty.h"
  17. #include "../common/non_default_constructible.h"
  18. TEST(MetaContainer, Invalid) {
  19. ASSERT_FALSE(entt::meta_any{42}.as_sequence_container());
  20. ASSERT_FALSE(entt::meta_any{42}.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(), 42);
  77. ASSERT_TRUE(ret);
  78. ASSERT_EQ(*ret, 42);
  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(42u));
  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(42u));
  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(42u));
  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(), 42);
  184. ASSERT_TRUE(ret);
  185. ASSERT_EQ(*ret, 42);
  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(42u));
  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(), 42);
  224. ASSERT_TRUE(ret);
  225. ASSERT_EQ(*ret, 42);
  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(42u));
  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(42);
  257. ASSERT_EQ(view.size(), 1u);
  258. ASSERT_NE(view.begin(), view.end());
  259. ASSERT_EQ(view[0].cast<const int &>(), 42);
  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>(), 42);
  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(42u));
  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, AsConst) {
  282. auto test = [](const entt::meta_any any) {
  283. auto view = any.as_sequence_container();
  284. ASSERT_TRUE(view);
  285. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  286. ASSERT_EQ(view[0].cast<const int &>(), 42);
  287. };
  288. std::vector<int> vec{42};
  289. test(vec);
  290. test(entt::forward_as_meta(vec));
  291. test(entt::forward_as_meta(std::as_const(vec)));
  292. }
  293. ENTT_DEBUG_TEST(SequenceContainerDeathTest, AsConst) {
  294. auto test = [](const entt::meta_any any) {
  295. auto view = any.as_sequence_container();
  296. ASSERT_TRUE(view);
  297. ASSERT_DEATH(view[0].cast<int &>() = 2, "");
  298. };
  299. std::vector<int> vec{42};
  300. test(vec);
  301. test(entt::forward_as_meta(vec));
  302. test(entt::forward_as_meta(std::as_const(vec)));
  303. }
  304. TEST(AssociativeContainer, Empty) {
  305. entt::meta_associative_container container{};
  306. ASSERT_FALSE(container);
  307. entt::meta_any any{std::map<int, char>{}};
  308. container = any.as_associative_container();
  309. ASSERT_TRUE(container);
  310. }
  311. TEST(AssociativeContainer, Iterator) {
  312. std::map<int, char> map{{2, 'c'}, {3, 'd'}, {4, 'e'}};
  313. auto any = entt::forward_as_meta(map);
  314. entt::meta_associative_container::iterator first{};
  315. auto view = any.as_associative_container();
  316. ASSERT_FALSE(first);
  317. first = view.begin();
  318. const auto last = view.end();
  319. ASSERT_TRUE(first);
  320. ASSERT_TRUE(last);
  321. ASSERT_FALSE(first == last);
  322. ASSERT_TRUE(first != last);
  323. ASSERT_NE(first, last);
  324. ASSERT_EQ((first++)->first.cast<int>(), 2);
  325. ASSERT_EQ((++first)->second.cast<char>(), 'e');
  326. ASSERT_NE(first++, last);
  327. ASSERT_EQ(first, last);
  328. ASSERT_TRUE(first == last);
  329. ASSERT_FALSE(first != last);
  330. }
  331. TEST(AssociativeContainer, StdMap) {
  332. std::map<int, char> map{{2, 'c'}, {3, 'd'}, {4, 'e'}};
  333. auto any = entt::forward_as_meta(map);
  334. auto view = any.as_associative_container();
  335. ASSERT_TRUE(view);
  336. ASSERT_FALSE(view.key_only());
  337. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  338. ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
  339. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  340. ASSERT_EQ(view.size(), 3u);
  341. ASSERT_NE(view.begin(), view.end());
  342. ASSERT_EQ(view.find(3)->second.cast<char>(), 'd');
  343. ASSERT_FALSE(view.insert(test::empty{}, 'a'));
  344. ASSERT_FALSE(view.insert(1, test::empty{}));
  345. ASSERT_TRUE(view.insert(0, 'a'));
  346. ASSERT_TRUE(view.insert(1., static_cast<int>('b')));
  347. ASSERT_EQ(view.size(), 5u);
  348. ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
  349. ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
  350. ASSERT_EQ(view.erase(test::empty{}), 0u);
  351. ASSERT_FALSE(view.find(test::empty{}));
  352. ASSERT_EQ(view.size(), 5u);
  353. ASSERT_EQ(view.erase(0), 1u);
  354. ASSERT_EQ(view.size(), 4u);
  355. ASSERT_EQ(view.find(0), view.end());
  356. view.find(1.)->second.cast<char &>() = 'f';
  357. ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
  358. ASSERT_EQ(view.erase(1.), 1u);
  359. ASSERT_TRUE(view.clear());
  360. ASSERT_FALSE(view.reserve(42u));
  361. ASSERT_EQ(view.size(), 0u);
  362. }
  363. TEST(AssociativeContainer, StdSet) {
  364. std::set<int> set{2, 3, 4};
  365. auto any = entt::forward_as_meta(set);
  366. auto view = any.as_associative_container();
  367. ASSERT_TRUE(view);
  368. ASSERT_TRUE(view.key_only());
  369. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  370. ASSERT_EQ(view.mapped_type(), entt::meta_type{});
  371. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  372. ASSERT_EQ(view.size(), 3u);
  373. ASSERT_NE(view.begin(), view.end());
  374. ASSERT_EQ(view.find(3)->first.cast<int>(), 3);
  375. ASSERT_FALSE(view.insert(test::empty{}));
  376. ASSERT_TRUE(view.insert(.0));
  377. ASSERT_TRUE(view.insert(1));
  378. ASSERT_EQ(view.size(), 5u);
  379. ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
  380. ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
  381. ASSERT_EQ(view.erase(test::empty{}), 0u);
  382. ASSERT_FALSE(view.find(test::empty{}));
  383. ASSERT_EQ(view.size(), 5u);
  384. ASSERT_EQ(view.erase(0), 1u);
  385. ASSERT_EQ(view.size(), 4u);
  386. ASSERT_EQ(view.find(0), view.end());
  387. ASSERT_EQ(view.find(1.f)->first.try_cast<int>(), nullptr);
  388. ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
  389. ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
  390. ASSERT_EQ(view.erase(1.), 1u);
  391. ASSERT_TRUE(view.clear());
  392. ASSERT_FALSE(view.reserve(42u));
  393. ASSERT_EQ(view.size(), 0u);
  394. }
  395. TEST(AssociativeContainer, DenseMap) {
  396. entt::dense_map<int, char> map{};
  397. auto any = entt::forward_as_meta(map);
  398. auto view = any.as_associative_container();
  399. map.emplace(2, 'c');
  400. map.emplace(3, 'd');
  401. map.emplace(4, '3');
  402. ASSERT_TRUE(view);
  403. ASSERT_FALSE(view.key_only());
  404. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  405. ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
  406. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  407. ASSERT_EQ(view.size(), 3u);
  408. ASSERT_NE(view.begin(), view.end());
  409. ASSERT_EQ(view.find(3)->second.cast<char>(), 'd');
  410. ASSERT_FALSE(view.insert(test::empty{}, 'a'));
  411. ASSERT_FALSE(view.insert(1, test::empty{}));
  412. ASSERT_TRUE(view.insert(0, 'a'));
  413. ASSERT_TRUE(view.insert(1., static_cast<int>('b')));
  414. ASSERT_EQ(view.size(), 5u);
  415. ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
  416. ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
  417. ASSERT_EQ(view.erase(test::empty{}), 0u);
  418. ASSERT_FALSE(view.find(test::empty{}));
  419. ASSERT_EQ(view.size(), 5u);
  420. ASSERT_EQ(view.erase(0), 1u);
  421. ASSERT_EQ(view.size(), 4u);
  422. ASSERT_EQ(view.find(0), view.end());
  423. view.find(1.)->second.cast<char &>() = 'f';
  424. ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
  425. ASSERT_EQ(view.erase(1.), 1u);
  426. ASSERT_TRUE(view.clear());
  427. ASSERT_TRUE(view.reserve(42u));
  428. ASSERT_EQ(view.size(), 0u);
  429. }
  430. TEST(AssociativeContainer, DenseSet) {
  431. entt::dense_set<int> set{};
  432. auto any = entt::forward_as_meta(set);
  433. auto view = any.as_associative_container();
  434. set.emplace(2);
  435. set.emplace(3);
  436. set.emplace(4);
  437. ASSERT_TRUE(view);
  438. ASSERT_TRUE(view.key_only());
  439. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  440. ASSERT_EQ(view.mapped_type(), entt::meta_type{});
  441. ASSERT_EQ(view.value_type(), entt::resolve<int>());
  442. ASSERT_EQ(view.size(), 3u);
  443. ASSERT_NE(view.begin(), view.end());
  444. ASSERT_EQ(view.find(3)->first.cast<int>(), 3);
  445. ASSERT_FALSE(view.insert(test::empty{}));
  446. ASSERT_TRUE(view.insert(.0));
  447. ASSERT_TRUE(view.insert(1));
  448. ASSERT_EQ(view.size(), 5u);
  449. ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
  450. ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
  451. ASSERT_EQ(view.erase(test::empty{}), 0u);
  452. ASSERT_FALSE(view.find(test::empty{}));
  453. ASSERT_EQ(view.size(), 5u);
  454. ASSERT_EQ(view.erase(0), 1u);
  455. ASSERT_EQ(view.size(), 4u);
  456. ASSERT_EQ(view.find(0), view.end());
  457. ASSERT_EQ(view.find(1.f)->first.try_cast<int>(), nullptr);
  458. ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
  459. ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
  460. ASSERT_EQ(view.erase(1.), 1u);
  461. ASSERT_TRUE(view.clear());
  462. ASSERT_TRUE(view.reserve(42u));
  463. ASSERT_EQ(view.size(), 0u);
  464. }
  465. TEST(KeyValueAssociativeContainer, Constness) {
  466. std::map<int, char> map{};
  467. auto any = entt::forward_as_meta(std::as_const(map));
  468. auto view = any.as_associative_container();
  469. ASSERT_TRUE(view);
  470. ASSERT_FALSE(view.key_only());
  471. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  472. ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
  473. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  474. ASSERT_EQ(view.size(), 0u);
  475. ASSERT_EQ(view.begin(), view.end());
  476. map[2] = 'c';
  477. ASSERT_EQ(view.size(), 1u);
  478. ASSERT_NE(view.begin(), view.end());
  479. ASSERT_EQ(view.find(2)->second.cast<const char &>(), 'c');
  480. ASSERT_FALSE(view.insert(0, 'a'));
  481. ASSERT_EQ(view.size(), 1u);
  482. ASSERT_EQ(view.find(0), view.end());
  483. ASSERT_EQ(view.find(2)->second.cast<char>(), 'c');
  484. ASSERT_EQ(view.erase(2), 0u);
  485. ASSERT_EQ(view.size(), 1u);
  486. ASSERT_NE(view.find(2), view.end());
  487. ASSERT_FALSE(view.clear());
  488. ASSERT_FALSE(view.reserve(42u));
  489. ASSERT_EQ(view.size(), 1u);
  490. }
  491. ENTT_DEBUG_TEST(KeyValueAssociativeContainerDeathTest, Constness) {
  492. std::map<int, char> map{};
  493. auto any = entt::forward_as_meta(std::as_const(map));
  494. auto view = any.as_associative_container();
  495. ASSERT_TRUE(view);
  496. ASSERT_DEATH(view.find(2)->second.cast<char &>() = 'a', "");
  497. }
  498. TEST(KeyOnlyAssociativeContainer, Constness) {
  499. std::set<int> set{};
  500. auto any = entt::forward_as_meta(std::as_const(set));
  501. auto view = any.as_associative_container();
  502. ASSERT_TRUE(view);
  503. ASSERT_TRUE(view.key_only());
  504. ASSERT_EQ(view.key_type(), entt::resolve<int>());
  505. ASSERT_EQ(view.mapped_type(), entt::meta_type{});
  506. ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
  507. ASSERT_EQ(view.size(), 0u);
  508. ASSERT_EQ(view.begin(), view.end());
  509. set.insert(2);
  510. ASSERT_EQ(view.size(), 1u);
  511. ASSERT_NE(view.begin(), view.end());
  512. ASSERT_EQ(view.find(2)->first.try_cast<int>(), nullptr);
  513. ASSERT_NE(view.find(2)->first.try_cast<const int>(), nullptr);
  514. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  515. ASSERT_EQ(view.find(2)->first.cast<const int &>(), 2);
  516. ASSERT_FALSE(view.insert(0));
  517. ASSERT_EQ(view.size(), 1u);
  518. ASSERT_EQ(view.find(0), view.end());
  519. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  520. ASSERT_EQ(view.erase(2), 0u);
  521. ASSERT_EQ(view.size(), 1u);
  522. ASSERT_NE(view.find(2), view.end());
  523. ASSERT_FALSE(view.clear());
  524. ASSERT_FALSE(view.reserve(42u));
  525. ASSERT_EQ(view.size(), 1u);
  526. }
  527. TEST(KeyValueAssociativeContainer, AsConst) {
  528. auto test = [](const entt::meta_any any) {
  529. auto view = any.as_associative_container();
  530. ASSERT_TRUE(view);
  531. ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
  532. ASSERT_EQ(view.find(2)->second.cast<const char &>(), 'c');
  533. };
  534. std::map<int, char> map{{2, 'c'}};
  535. test(map);
  536. test(entt::forward_as_meta(map));
  537. test(entt::forward_as_meta(std::as_const(map)));
  538. }
  539. ENTT_DEBUG_TEST(KeyValueAssociativeContainerDeathTest, AsConst) {
  540. auto test = [](const entt::meta_any any) {
  541. auto view = any.as_associative_container();
  542. ASSERT_TRUE(view);
  543. ASSERT_DEATH(view.find(2)->second.cast<char &>() = 'a', "");
  544. };
  545. std::map<int, char> map{{2, 'c'}};
  546. test(map);
  547. test(entt::forward_as_meta(map));
  548. test(entt::forward_as_meta(std::as_const(map)));
  549. }
  550. TEST(KeyOnlyAssociativeContainer, AsConst) {
  551. auto test = [](const entt::meta_any any) {
  552. auto view = any.as_associative_container();
  553. ASSERT_TRUE(view);
  554. ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
  555. ASSERT_EQ(view.find(2)->first.try_cast<int>(), nullptr);
  556. ASSERT_NE(view.find(2)->first.try_cast<const int>(), nullptr);
  557. ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
  558. ASSERT_EQ(view.find(2)->first.cast<const int &>(), 2);
  559. };
  560. std::set<int> set{2};
  561. test(set);
  562. test(entt::forward_as_meta(set));
  563. test(entt::forward_as_meta(std::as_const(set)));
  564. }