2
0

small_vector_test.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. // Copyright (c) 2017 Google Inc.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <utility>
  15. #include <vector>
  16. #include "gmock/gmock.h"
  17. #include "source/util/small_vector.h"
  18. namespace spvtools {
  19. namespace utils {
  20. namespace {
  21. using SmallVectorTest = ::testing::Test;
  22. TEST(SmallVectorTest, Initialize_default) {
  23. SmallVector<uint32_t, 2> vec;
  24. EXPECT_TRUE(vec.empty());
  25. EXPECT_EQ(vec.size(), 0);
  26. EXPECT_EQ(vec.begin(), vec.end());
  27. }
  28. TEST(SmallVectorTest, Initialize_list1) {
  29. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  30. EXPECT_FALSE(vec.empty());
  31. EXPECT_EQ(vec.size(), 4);
  32. uint32_t result[] = {0, 1, 2, 3};
  33. for (uint32_t i = 0; i < vec.size(); ++i) {
  34. EXPECT_EQ(vec[i], result[i]);
  35. }
  36. }
  37. TEST(SmallVectorTest, Initialize_list2) {
  38. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  39. EXPECT_FALSE(vec.empty());
  40. EXPECT_EQ(vec.size(), 4);
  41. uint32_t result[] = {0, 1, 2, 3};
  42. for (uint32_t i = 0; i < vec.size(); ++i) {
  43. EXPECT_EQ(vec[i], result[i]);
  44. }
  45. }
  46. TEST(SmallVectorTest, Initialize_list3) {
  47. std::vector<uint32_t> result = {0, 1, 2, 3};
  48. SmallVector<uint32_t, 6> vec(result.begin(), result.end());
  49. EXPECT_FALSE(vec.empty());
  50. EXPECT_EQ(vec.size(), 4);
  51. for (uint32_t i = 0; i < vec.size(); ++i) {
  52. EXPECT_EQ(vec[i], result[i]);
  53. }
  54. }
  55. TEST(SmallVectorTest, Initialize_copy1) {
  56. SmallVector<uint32_t, 6> vec1 = {0, 1, 2, 3};
  57. SmallVector<uint32_t, 6> vec2(vec1);
  58. EXPECT_EQ(vec2.size(), 4);
  59. uint32_t result[] = {0, 1, 2, 3};
  60. for (uint32_t i = 0; i < vec2.size(); ++i) {
  61. EXPECT_EQ(vec2[i], result[i]);
  62. }
  63. EXPECT_EQ(vec1, vec2);
  64. }
  65. TEST(SmallVectorTest, Initialize_copy2) {
  66. SmallVector<uint32_t, 2> vec1 = {0, 1, 2, 3};
  67. SmallVector<uint32_t, 2> vec2(vec1);
  68. EXPECT_EQ(vec2.size(), 4);
  69. uint32_t result[] = {0, 1, 2, 3};
  70. for (uint32_t i = 0; i < vec2.size(); ++i) {
  71. EXPECT_EQ(vec2[i], result[i]);
  72. }
  73. EXPECT_EQ(vec1, vec2);
  74. }
  75. TEST(SmallVectorTest, Initialize_copy_vec1) {
  76. std::vector<uint32_t> vec1 = {0, 1, 2, 3};
  77. SmallVector<uint32_t, 6> vec2(vec1);
  78. EXPECT_EQ(vec2.size(), 4);
  79. uint32_t result[] = {0, 1, 2, 3};
  80. for (uint32_t i = 0; i < vec2.size(); ++i) {
  81. EXPECT_EQ(vec2[i], result[i]);
  82. }
  83. EXPECT_EQ(vec1, vec2);
  84. }
  85. TEST(SmallVectorTest, Initialize_copy_vec2) {
  86. std::vector<uint32_t> vec1 = {0, 1, 2, 3};
  87. SmallVector<uint32_t, 2> vec2(vec1);
  88. EXPECT_EQ(vec2.size(), 4);
  89. uint32_t result[] = {0, 1, 2, 3};
  90. for (uint32_t i = 0; i < vec2.size(); ++i) {
  91. EXPECT_EQ(vec2[i], result[i]);
  92. }
  93. EXPECT_EQ(vec1, vec2);
  94. }
  95. TEST(SmallVectorTest, Initialize_move1) {
  96. SmallVector<uint32_t, 6> vec1 = {0, 1, 2, 3};
  97. SmallVector<uint32_t, 6> vec2(std::move(vec1));
  98. EXPECT_EQ(vec2.size(), 4);
  99. uint32_t result[] = {0, 1, 2, 3};
  100. for (uint32_t i = 0; i < vec2.size(); ++i) {
  101. EXPECT_EQ(vec2[i], result[i]);
  102. }
  103. EXPECT_TRUE(vec1.empty());
  104. }
  105. TEST(SmallVectorTest, Initialize_move2) {
  106. SmallVector<uint32_t, 2> vec1 = {0, 1, 2, 3};
  107. SmallVector<uint32_t, 2> vec2(std::move(vec1));
  108. EXPECT_EQ(vec2.size(), 4);
  109. uint32_t result[] = {0, 1, 2, 3};
  110. for (uint32_t i = 0; i < vec2.size(); ++i) {
  111. EXPECT_EQ(vec2[i], result[i]);
  112. }
  113. EXPECT_TRUE(vec1.empty());
  114. }
  115. TEST(SmallVectorTest, Initialize_move_vec1) {
  116. std::vector<uint32_t> vec1 = {0, 1, 2, 3};
  117. SmallVector<uint32_t, 6> vec2(std::move(vec1));
  118. EXPECT_EQ(vec2.size(), 4);
  119. uint32_t result[] = {0, 1, 2, 3};
  120. for (uint32_t i = 0; i < vec2.size(); ++i) {
  121. EXPECT_EQ(vec2[i], result[i]);
  122. }
  123. EXPECT_TRUE(vec1.empty());
  124. }
  125. TEST(SmallVectorTest, Initialize_move_vec2) {
  126. std::vector<uint32_t> vec1 = {0, 1, 2, 3};
  127. SmallVector<uint32_t, 2> vec2(std::move(vec1));
  128. EXPECT_EQ(vec2.size(), 4);
  129. uint32_t result[] = {0, 1, 2, 3};
  130. for (uint32_t i = 0; i < vec2.size(); ++i) {
  131. EXPECT_EQ(vec2[i], result[i]);
  132. }
  133. EXPECT_TRUE(vec1.empty());
  134. }
  135. TEST(SmallVectorTest, Initialize_iterators1) {
  136. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  137. EXPECT_EQ(vec.size(), 4);
  138. uint32_t result[] = {0, 1, 2, 3};
  139. uint32_t i = 0;
  140. for (uint32_t p : vec) {
  141. EXPECT_EQ(p, result[i]);
  142. i++;
  143. }
  144. }
  145. TEST(SmallVectorTest, Initialize_iterators2) {
  146. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  147. EXPECT_EQ(vec.size(), 4);
  148. uint32_t result[] = {0, 1, 2, 3};
  149. uint32_t i = 0;
  150. for (uint32_t p : vec) {
  151. EXPECT_EQ(p, result[i]);
  152. i++;
  153. }
  154. }
  155. TEST(SmallVectorTest, Initialize_iterators3) {
  156. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  157. EXPECT_EQ(vec.size(), 4);
  158. uint32_t result[] = {0, 1, 2, 3};
  159. uint32_t i = 0;
  160. for (SmallVector<uint32_t, 2>::iterator it = vec.begin(); it != vec.end();
  161. ++it) {
  162. EXPECT_EQ(*it, result[i]);
  163. i++;
  164. }
  165. }
  166. TEST(SmallVectorTest, Initialize_iterators4) {
  167. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  168. EXPECT_EQ(vec.size(), 4);
  169. uint32_t result[] = {0, 1, 2, 3};
  170. uint32_t i = 0;
  171. for (SmallVector<uint32_t, 6>::iterator it = vec.begin(); it != vec.end();
  172. ++it) {
  173. EXPECT_EQ(*it, result[i]);
  174. i++;
  175. }
  176. }
  177. TEST(SmallVectorTest, Initialize_iterators_write1) {
  178. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  179. EXPECT_EQ(vec.size(), 4);
  180. for (SmallVector<uint32_t, 6>::iterator it = vec.begin(); it != vec.end();
  181. ++it) {
  182. *it *= 2;
  183. }
  184. uint32_t result[] = {0, 2, 4, 6};
  185. uint32_t i = 0;
  186. for (SmallVector<uint32_t, 6>::iterator it = vec.begin(); it != vec.end();
  187. ++it) {
  188. EXPECT_EQ(*it, result[i]);
  189. i++;
  190. }
  191. }
  192. TEST(SmallVectorTest, Initialize_iterators_write2) {
  193. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  194. EXPECT_EQ(vec.size(), 4);
  195. for (SmallVector<uint32_t, 2>::iterator it = vec.begin(); it != vec.end();
  196. ++it) {
  197. *it *= 2;
  198. }
  199. uint32_t result[] = {0, 2, 4, 6};
  200. uint32_t i = 0;
  201. for (SmallVector<uint32_t, 2>::iterator it = vec.begin(); it != vec.end();
  202. ++it) {
  203. EXPECT_EQ(*it, result[i]);
  204. i++;
  205. }
  206. }
  207. TEST(SmallVectorTest, Initialize_front) {
  208. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  209. EXPECT_EQ(vec.front(), 0);
  210. for (SmallVector<uint32_t, 2>::iterator it = vec.begin(); it != vec.end();
  211. ++it) {
  212. *it += 2;
  213. }
  214. EXPECT_EQ(vec.front(), 2);
  215. }
  216. TEST(SmallVectorTest, Erase_element_front1) {
  217. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  218. EXPECT_EQ(vec.front(), 0);
  219. EXPECT_EQ(vec.size(), 4);
  220. vec.erase(vec.begin());
  221. EXPECT_EQ(vec.front(), 1);
  222. EXPECT_EQ(vec.size(), 3);
  223. }
  224. TEST(SmallVectorTest, Erase_element_front2) {
  225. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  226. EXPECT_EQ(vec.front(), 0);
  227. EXPECT_EQ(vec.size(), 4);
  228. vec.erase(vec.begin());
  229. EXPECT_EQ(vec.front(), 1);
  230. EXPECT_EQ(vec.size(), 3);
  231. }
  232. TEST(SmallVectorTest, Erase_element_back1) {
  233. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  234. SmallVector<uint32_t, 2> result = {0, 1, 2};
  235. EXPECT_EQ(vec[3], 3);
  236. EXPECT_EQ(vec.size(), 4);
  237. vec.erase(vec.begin() + 3);
  238. EXPECT_EQ(vec.size(), 3);
  239. EXPECT_EQ(vec, result);
  240. }
  241. TEST(SmallVectorTest, Erase_element_back2) {
  242. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  243. SmallVector<uint32_t, 6> result = {0, 1, 2};
  244. EXPECT_EQ(vec[3], 3);
  245. EXPECT_EQ(vec.size(), 4);
  246. vec.erase(vec.begin() + 3);
  247. EXPECT_EQ(vec.size(), 3);
  248. EXPECT_EQ(vec, result);
  249. }
  250. TEST(SmallVectorTest, Erase_element_middle1) {
  251. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  252. SmallVector<uint32_t, 2> result = {0, 1, 3};
  253. EXPECT_EQ(vec.size(), 4);
  254. vec.erase(vec.begin() + 2);
  255. EXPECT_EQ(vec.size(), 3);
  256. EXPECT_EQ(vec, result);
  257. }
  258. TEST(SmallVectorTest, Erase_element_middle2) {
  259. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  260. SmallVector<uint32_t, 6> result = {0, 1, 3};
  261. EXPECT_EQ(vec.size(), 4);
  262. vec.erase(vec.begin() + 2);
  263. EXPECT_EQ(vec.size(), 3);
  264. EXPECT_EQ(vec, result);
  265. }
  266. TEST(SmallVectorTest, Erase_range_1) {
  267. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  268. SmallVector<uint32_t, 6> result = {};
  269. EXPECT_EQ(vec.size(), 4);
  270. vec.erase(vec.begin(), vec.end());
  271. EXPECT_EQ(vec.size(), 0);
  272. EXPECT_EQ(vec, result);
  273. }
  274. TEST(SmallVectorTest, Erase_range_2) {
  275. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  276. SmallVector<uint32_t, 2> result = {};
  277. EXPECT_EQ(vec.size(), 4);
  278. vec.erase(vec.begin(), vec.end());
  279. EXPECT_EQ(vec.size(), 0);
  280. EXPECT_EQ(vec, result);
  281. }
  282. TEST(SmallVectorTest, Erase_range_3) {
  283. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  284. SmallVector<uint32_t, 6> result = {2, 3};
  285. EXPECT_EQ(vec.size(), 4);
  286. vec.erase(vec.begin(), vec.begin() + 2);
  287. EXPECT_EQ(vec.size(), 2);
  288. EXPECT_EQ(vec, result);
  289. }
  290. TEST(SmallVectorTest, Erase_range_4) {
  291. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  292. SmallVector<uint32_t, 2> result = {2, 3};
  293. EXPECT_EQ(vec.size(), 4);
  294. vec.erase(vec.begin(), vec.begin() + 2);
  295. EXPECT_EQ(vec.size(), 2);
  296. EXPECT_EQ(vec, result);
  297. }
  298. TEST(SmallVectorTest, Erase_range_5) {
  299. SmallVector<uint32_t, 6> vec = {0, 1, 2, 3};
  300. SmallVector<uint32_t, 6> result = {0, 3};
  301. EXPECT_EQ(vec.size(), 4);
  302. vec.erase(vec.begin() + 1, vec.begin() + 3);
  303. EXPECT_EQ(vec.size(), 2);
  304. EXPECT_EQ(vec, result);
  305. }
  306. TEST(SmallVectorTest, Erase_range_6) {
  307. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  308. SmallVector<uint32_t, 2> result = {0, 3};
  309. EXPECT_EQ(vec.size(), 4);
  310. vec.erase(vec.begin() + 1, vec.begin() + 3);
  311. EXPECT_EQ(vec.size(), 2);
  312. EXPECT_EQ(vec, result);
  313. }
  314. TEST(SmallVectorTest, Push_back) {
  315. SmallVector<uint32_t, 2> vec;
  316. SmallVector<uint32_t, 2> result = {0, 1, 2, 3};
  317. EXPECT_EQ(vec.size(), 0);
  318. vec.push_back(0);
  319. EXPECT_EQ(vec.size(), 1);
  320. vec.push_back(1);
  321. EXPECT_EQ(vec.size(), 2);
  322. vec.push_back(2);
  323. EXPECT_EQ(vec.size(), 3);
  324. vec.push_back(3);
  325. EXPECT_EQ(vec.size(), 4);
  326. EXPECT_EQ(vec, result);
  327. }
  328. TEST(SmallVectorTest, Emplace_back) {
  329. SmallVector<uint32_t, 2> vec;
  330. SmallVector<uint32_t, 2> result = {0, 1, 2, 3};
  331. EXPECT_EQ(vec.size(), 0);
  332. vec.emplace_back(0);
  333. EXPECT_EQ(vec.size(), 1);
  334. vec.emplace_back(1);
  335. EXPECT_EQ(vec.size(), 2);
  336. vec.emplace_back(2);
  337. EXPECT_EQ(vec.size(), 3);
  338. vec.emplace_back(3);
  339. EXPECT_EQ(vec.size(), 4);
  340. EXPECT_EQ(vec, result);
  341. }
  342. TEST(SmallVectorTest, Clear) {
  343. SmallVector<uint32_t, 2> vec = {0, 1, 2, 3};
  344. SmallVector<uint32_t, 2> result = {};
  345. EXPECT_EQ(vec.size(), 4);
  346. vec.clear();
  347. EXPECT_EQ(vec.size(), 0);
  348. EXPECT_EQ(vec, result);
  349. }
  350. TEST(SmallVectorTest, Insert1) {
  351. SmallVector<uint32_t, 2> vec = {};
  352. SmallVector<uint32_t, 2> insert_values = {10, 11};
  353. SmallVector<uint32_t, 2> result = {10, 11};
  354. EXPECT_EQ(vec.size(), 0);
  355. auto ret =
  356. vec.insert(vec.begin(), insert_values.begin(), insert_values.end());
  357. EXPECT_EQ(vec.size(), 2);
  358. EXPECT_EQ(vec, result);
  359. EXPECT_EQ(*ret, 10);
  360. }
  361. TEST(SmallVectorTest, Insert2) {
  362. SmallVector<uint32_t, 2> vec = {};
  363. SmallVector<uint32_t, 2> insert_values = {10, 11, 12};
  364. SmallVector<uint32_t, 2> result = {10, 11, 12};
  365. EXPECT_EQ(vec.size(), 0);
  366. auto ret =
  367. vec.insert(vec.begin(), insert_values.begin(), insert_values.end());
  368. EXPECT_EQ(vec.size(), 3);
  369. EXPECT_EQ(vec, result);
  370. EXPECT_EQ(*ret, 10);
  371. }
  372. TEST(SmallVectorTest, Insert3) {
  373. SmallVector<uint32_t, 2> vec = {0};
  374. SmallVector<uint32_t, 2> insert_values = {10, 11, 12};
  375. SmallVector<uint32_t, 2> result = {10, 11, 12, 0};
  376. EXPECT_EQ(vec.size(), 1);
  377. auto ret =
  378. vec.insert(vec.begin(), insert_values.begin(), insert_values.end());
  379. EXPECT_EQ(vec.size(), 4);
  380. EXPECT_EQ(vec, result);
  381. EXPECT_EQ(*ret, 10);
  382. }
  383. TEST(SmallVectorTest, Insert4) {
  384. SmallVector<uint32_t, 6> vec = {0};
  385. SmallVector<uint32_t, 6> insert_values = {10, 11, 12};
  386. SmallVector<uint32_t, 6> result = {10, 11, 12, 0};
  387. EXPECT_EQ(vec.size(), 1);
  388. auto ret =
  389. vec.insert(vec.begin(), insert_values.begin(), insert_values.end());
  390. EXPECT_EQ(vec.size(), 4);
  391. EXPECT_EQ(vec, result);
  392. EXPECT_EQ(*ret, 10);
  393. }
  394. TEST(SmallVectorTest, Insert5) {
  395. SmallVector<uint32_t, 2> vec = {0, 1, 2};
  396. SmallVector<uint32_t, 2> insert_values = {10, 11, 12};
  397. SmallVector<uint32_t, 2> result = {0, 1, 2, 10, 11, 12};
  398. EXPECT_EQ(vec.size(), 3);
  399. auto ret = vec.insert(vec.end(), insert_values.begin(), insert_values.end());
  400. EXPECT_EQ(vec.size(), 6);
  401. EXPECT_EQ(vec, result);
  402. EXPECT_EQ(*ret, 10);
  403. }
  404. TEST(SmallVectorTest, Insert6) {
  405. SmallVector<uint32_t, 6> vec = {0, 1, 2};
  406. SmallVector<uint32_t, 6> insert_values = {10, 11, 12};
  407. SmallVector<uint32_t, 6> result = {0, 1, 2, 10, 11, 12};
  408. EXPECT_EQ(vec.size(), 3);
  409. auto ret = vec.insert(vec.end(), insert_values.begin(), insert_values.end());
  410. EXPECT_EQ(vec.size(), 6);
  411. EXPECT_EQ(vec, result);
  412. EXPECT_EQ(*ret, 10);
  413. }
  414. TEST(SmallVectorTest, Insert7) {
  415. SmallVector<uint32_t, 2> vec = {0, 1, 2};
  416. SmallVector<uint32_t, 2> insert_values = {10, 11, 12};
  417. SmallVector<uint32_t, 2> result = {0, 10, 11, 12, 1, 2};
  418. EXPECT_EQ(vec.size(), 3);
  419. auto ret =
  420. vec.insert(vec.begin() + 1, insert_values.begin(), insert_values.end());
  421. EXPECT_EQ(vec.size(), 6);
  422. EXPECT_EQ(vec, result);
  423. EXPECT_EQ(*ret, 10);
  424. }
  425. TEST(SmallVectorTest, Insert8) {
  426. SmallVector<uint32_t, 6> vec = {0, 1, 2};
  427. SmallVector<uint32_t, 6> insert_values = {10, 11, 12};
  428. SmallVector<uint32_t, 6> result = {0, 10, 11, 12, 1, 2};
  429. EXPECT_EQ(vec.size(), 3);
  430. auto ret =
  431. vec.insert(vec.begin() + 1, insert_values.begin(), insert_values.end());
  432. EXPECT_EQ(vec.size(), 6);
  433. EXPECT_EQ(vec, result);
  434. EXPECT_EQ(*ret, 10);
  435. }
  436. TEST(SmallVectorTest, Resize1) {
  437. SmallVector<uint32_t, 2> vec = {0, 1, 2};
  438. SmallVector<uint32_t, 2> result = {0, 1, 2, 10, 10, 10};
  439. EXPECT_EQ(vec.size(), 3);
  440. vec.resize(6, 10);
  441. EXPECT_EQ(vec.size(), 6);
  442. EXPECT_EQ(vec, result);
  443. }
  444. TEST(SmallVectorTest, Resize2) {
  445. SmallVector<uint32_t, 8> vec = {0, 1, 2};
  446. SmallVector<uint32_t, 8> result = {0, 1, 2, 10, 10, 10};
  447. EXPECT_EQ(vec.size(), 3);
  448. vec.resize(6, 10);
  449. EXPECT_EQ(vec.size(), 6);
  450. EXPECT_EQ(vec, result);
  451. }
  452. TEST(SmallVectorTest, Resize3) {
  453. SmallVector<uint32_t, 4> vec = {0, 1, 2};
  454. SmallVector<uint32_t, 4> result = {0, 1, 2, 10, 10, 10};
  455. EXPECT_EQ(vec.size(), 3);
  456. vec.resize(6, 10);
  457. EXPECT_EQ(vec.size(), 6);
  458. EXPECT_EQ(vec, result);
  459. }
  460. TEST(SmallVectorTest, Resize4) {
  461. SmallVector<uint32_t, 4> vec = {0, 1, 2, 10, 10, 10};
  462. SmallVector<uint32_t, 4> result = {0, 1, 2};
  463. EXPECT_EQ(vec.size(), 6);
  464. vec.resize(3, 10);
  465. EXPECT_EQ(vec.size(), 3);
  466. EXPECT_EQ(vec, result);
  467. }
  468. TEST(SmallVectorTest, Resize5) {
  469. SmallVector<uint32_t, 2> vec = {0, 1, 2, 10, 10, 10};
  470. SmallVector<uint32_t, 2> result = {0, 1, 2};
  471. EXPECT_EQ(vec.size(), 6);
  472. vec.resize(3, 10);
  473. EXPECT_EQ(vec.size(), 3);
  474. EXPECT_EQ(vec, result);
  475. }
  476. TEST(SmallVectorTest, Resize6) {
  477. SmallVector<uint32_t, 8> vec = {0, 1, 2, 10, 10, 10};
  478. SmallVector<uint32_t, 8> result = {0, 1, 2};
  479. EXPECT_EQ(vec.size(), 6);
  480. vec.resize(3, 10);
  481. EXPECT_EQ(vec.size(), 3);
  482. EXPECT_EQ(vec, result);
  483. }
  484. TEST(SmallVectorTest, Pop_back) {
  485. SmallVector<uint32_t, 8> vec = {0, 1, 2, 10, 10, 10};
  486. SmallVector<uint32_t, 8> result = {0, 1, 2};
  487. EXPECT_EQ(vec.size(), 6);
  488. vec.pop_back();
  489. vec.pop_back();
  490. vec.pop_back();
  491. EXPECT_EQ(vec.size(), 3);
  492. EXPECT_EQ(vec, result);
  493. }
  494. TEST(SmallVectorTest, Pop_back_TestDestructor) {
  495. // Tracks number of constructions and destructions to ensure they are called.
  496. struct TracksDtor {
  497. TracksDtor& operator=(TracksDtor&&) = delete;
  498. TracksDtor& operator=(const TracksDtor&) = delete;
  499. TracksDtor(int& num_ctors, int& num_dtors)
  500. : num_ctors_(num_ctors), num_dtors_(num_dtors) {
  501. num_ctors_++;
  502. }
  503. TracksDtor(const TracksDtor& that)
  504. : TracksDtor(that.num_ctors_, that.num_dtors_) {}
  505. TracksDtor(TracksDtor&& that)
  506. : TracksDtor(that.num_ctors_, that.num_dtors_) {}
  507. ~TracksDtor() { num_dtors_++; }
  508. int& num_ctors_;
  509. int& num_dtors_;
  510. };
  511. constexpr int capacity = 4;
  512. SmallVector<TracksDtor, capacity> vec;
  513. int num_ctors = 0;
  514. int num_dtors = 0;
  515. // Make sure it works when staying within the smallvector capacity
  516. for (int i = 0; i < capacity; ++i) {
  517. vec.emplace_back(num_ctors, num_dtors);
  518. }
  519. EXPECT_EQ(num_ctors, capacity);
  520. while (!vec.empty()) {
  521. vec.pop_back();
  522. }
  523. EXPECT_EQ(num_ctors, capacity);
  524. EXPECT_EQ(num_dtors, num_ctors);
  525. // And when larger than builtin capacity
  526. for (int i = 0; i < capacity * 2; ++i) {
  527. vec.emplace_back(num_ctors, num_dtors);
  528. }
  529. while (!vec.empty()) {
  530. vec.pop_back();
  531. }
  532. EXPECT_EQ(num_dtors, num_ctors);
  533. }
  534. } // namespace
  535. } // namespace utils
  536. } // namespace spvtools