is_permutation.pass.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // <algorithm>
  10. // template<class ForwardIterator1, class ForwardIterator2>
  11. // bool
  12. // is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
  13. // ForwardIterator2 first2);
  14. #include <algorithm>
  15. #include <cassert>
  16. #include "test_iterators.h"
  17. #include "test_macros.h"
  18. int main()
  19. {
  20. {
  21. const int ia[] = {0};
  22. const int ib[] = {0};
  23. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  24. assert(std::is_permutation(forward_iterator<const int*>(ia),
  25. forward_iterator<const int*>(ia + 0),
  26. forward_iterator<const int*>(ib)) == true);
  27. #if TEST_STD_VER >= 14
  28. assert(std::is_permutation(forward_iterator<const int*>(ia),
  29. forward_iterator<const int*>(ia + 0),
  30. forward_iterator<const int*>(ib),
  31. forward_iterator<const int*>(ib + 0)) == true);
  32. #endif
  33. assert(std::is_permutation(forward_iterator<const int*>(ia),
  34. forward_iterator<const int*>(ia + sa),
  35. forward_iterator<const int*>(ib)) == true);
  36. #if TEST_STD_VER >= 14
  37. assert(std::is_permutation(forward_iterator<const int*>(ia),
  38. forward_iterator<const int*>(ia + sa),
  39. forward_iterator<const int*>(ib),
  40. forward_iterator<const int*>(ib + sa)) == true);
  41. assert(std::is_permutation(forward_iterator<const int*>(ia),
  42. forward_iterator<const int*>(ia + sa),
  43. forward_iterator<const int*>(ib),
  44. forward_iterator<const int*>(ib + sa - 1)) == false);
  45. #endif
  46. }
  47. {
  48. const int ia[] = {0};
  49. const int ib[] = {1};
  50. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  51. assert(std::is_permutation(forward_iterator<const int*>(ia),
  52. forward_iterator<const int*>(ia + sa),
  53. forward_iterator<const int*>(ib)) == false);
  54. #if TEST_STD_VER >= 14
  55. assert(std::is_permutation(forward_iterator<const int*>(ia),
  56. forward_iterator<const int*>(ia + sa),
  57. forward_iterator<const int*>(ib),
  58. forward_iterator<const int*>(ib + sa)) == false);
  59. #endif
  60. }
  61. {
  62. const int ia[] = {0, 0};
  63. const int ib[] = {0, 0};
  64. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  65. assert(std::is_permutation(forward_iterator<const int*>(ia),
  66. forward_iterator<const int*>(ia + sa),
  67. forward_iterator<const int*>(ib)) == true);
  68. #if TEST_STD_VER >= 14
  69. assert(std::is_permutation(forward_iterator<const int*>(ia),
  70. forward_iterator<const int*>(ia + sa),
  71. forward_iterator<const int*>(ib),
  72. forward_iterator<const int*>(ib + sa)) == true);
  73. assert(std::is_permutation(forward_iterator<const int*>(ia),
  74. forward_iterator<const int*>(ia + sa),
  75. forward_iterator<const int*>(ib),
  76. forward_iterator<const int*>(ib + sa - 1)) == false);
  77. #endif
  78. }
  79. {
  80. const int ia[] = {0, 0};
  81. const int ib[] = {0, 1};
  82. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  83. assert(std::is_permutation(forward_iterator<const int*>(ia),
  84. forward_iterator<const int*>(ia + sa),
  85. forward_iterator<const int*>(ib)) == false);
  86. #if TEST_STD_VER >= 14
  87. assert(std::is_permutation(forward_iterator<const int*>(ia),
  88. forward_iterator<const int*>(ia + sa),
  89. forward_iterator<const int*>(ib),
  90. forward_iterator<const int*>(ib + sa)) == false);
  91. #endif
  92. }
  93. {
  94. const int ia[] = {0, 0};
  95. const int ib[] = {1, 0};
  96. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  97. assert(std::is_permutation(forward_iterator<const int*>(ia),
  98. forward_iterator<const int*>(ia + sa),
  99. forward_iterator<const int*>(ib)) == false);
  100. #if TEST_STD_VER >= 14
  101. assert(std::is_permutation(forward_iterator<const int*>(ia),
  102. forward_iterator<const int*>(ia + sa),
  103. forward_iterator<const int*>(ib),
  104. forward_iterator<const int*>(ib + sa)) == false);
  105. #endif
  106. }
  107. {
  108. const int ia[] = {0, 0};
  109. const int ib[] = {1, 1};
  110. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  111. assert(std::is_permutation(forward_iterator<const int*>(ia),
  112. forward_iterator<const int*>(ia + sa),
  113. forward_iterator<const int*>(ib)) == false);
  114. #if TEST_STD_VER >= 14
  115. assert(std::is_permutation(forward_iterator<const int*>(ia),
  116. forward_iterator<const int*>(ia + sa),
  117. forward_iterator<const int*>(ib),
  118. forward_iterator<const int*>(ib + sa)) == false);
  119. #endif
  120. }
  121. {
  122. const int ia[] = {0, 1};
  123. const int ib[] = {0, 0};
  124. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  125. assert(std::is_permutation(forward_iterator<const int*>(ia),
  126. forward_iterator<const int*>(ia + sa),
  127. forward_iterator<const int*>(ib)) == false);
  128. #if TEST_STD_VER >= 14
  129. assert(std::is_permutation(forward_iterator<const int*>(ia),
  130. forward_iterator<const int*>(ia + sa),
  131. forward_iterator<const int*>(ib),
  132. forward_iterator<const int*>(ib + sa)) == false);
  133. #endif
  134. }
  135. {
  136. const int ia[] = {0, 1};
  137. const int ib[] = {0, 1};
  138. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  139. assert(std::is_permutation(forward_iterator<const int*>(ia),
  140. forward_iterator<const int*>(ia + sa),
  141. forward_iterator<const int*>(ib)) == true);
  142. #if TEST_STD_VER >= 14
  143. assert(std::is_permutation(forward_iterator<const int*>(ia),
  144. forward_iterator<const int*>(ia + sa),
  145. forward_iterator<const int*>(ib),
  146. forward_iterator<const int*>(ib + sa)) == true);
  147. assert(std::is_permutation(forward_iterator<const int*>(ia),
  148. forward_iterator<const int*>(ia + sa),
  149. forward_iterator<const int*>(ib),
  150. forward_iterator<const int*>(ib + sa - 1)) == false);
  151. #endif
  152. }
  153. {
  154. const int ia[] = {0, 1};
  155. const int ib[] = {1, 0};
  156. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  157. assert(std::is_permutation(forward_iterator<const int*>(ia),
  158. forward_iterator<const int*>(ia + sa),
  159. forward_iterator<const int*>(ib)) == true);
  160. #if TEST_STD_VER >= 14
  161. assert(std::is_permutation(forward_iterator<const int*>(ia),
  162. forward_iterator<const int*>(ia + sa),
  163. forward_iterator<const int*>(ib),
  164. forward_iterator<const int*>(ib + sa)) == true);
  165. #endif
  166. }
  167. {
  168. const int ia[] = {0, 1};
  169. const int ib[] = {1, 1};
  170. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  171. assert(std::is_permutation(forward_iterator<const int*>(ia),
  172. forward_iterator<const int*>(ia + sa),
  173. forward_iterator<const int*>(ib)) == false);
  174. #if TEST_STD_VER >= 14
  175. assert(std::is_permutation(forward_iterator<const int*>(ia),
  176. forward_iterator<const int*>(ia + sa),
  177. forward_iterator<const int*>(ib),
  178. forward_iterator<const int*>(ib + sa)) == false);
  179. #endif
  180. }
  181. {
  182. const int ia[] = {1, 0};
  183. const int ib[] = {0, 0};
  184. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  185. assert(std::is_permutation(forward_iterator<const int*>(ia),
  186. forward_iterator<const int*>(ia + sa),
  187. forward_iterator<const int*>(ib)) == false);
  188. #if TEST_STD_VER >= 14
  189. assert(std::is_permutation(forward_iterator<const int*>(ia),
  190. forward_iterator<const int*>(ia + sa),
  191. forward_iterator<const int*>(ib),
  192. forward_iterator<const int*>(ib + sa)) == false);
  193. #endif
  194. }
  195. {
  196. const int ia[] = {1, 0};
  197. const int ib[] = {0, 1};
  198. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  199. assert(std::is_permutation(forward_iterator<const int*>(ia),
  200. forward_iterator<const int*>(ia + sa),
  201. forward_iterator<const int*>(ib)) == true);
  202. #if TEST_STD_VER >= 14
  203. assert(std::is_permutation(forward_iterator<const int*>(ia),
  204. forward_iterator<const int*>(ia + sa),
  205. forward_iterator<const int*>(ib),
  206. forward_iterator<const int*>(ib + sa)) == true);
  207. #endif
  208. }
  209. {
  210. const int ia[] = {1, 0};
  211. const int ib[] = {1, 0};
  212. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  213. assert(std::is_permutation(forward_iterator<const int*>(ia),
  214. forward_iterator<const int*>(ia + sa),
  215. forward_iterator<const int*>(ib)) == true);
  216. #if TEST_STD_VER >= 14
  217. assert(std::is_permutation(forward_iterator<const int*>(ia),
  218. forward_iterator<const int*>(ia + sa),
  219. forward_iterator<const int*>(ib),
  220. forward_iterator<const int*>(ib + sa)) == true);
  221. #endif
  222. }
  223. {
  224. const int ia[] = {1, 0};
  225. const int ib[] = {1, 1};
  226. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  227. assert(std::is_permutation(forward_iterator<const int*>(ia),
  228. forward_iterator<const int*>(ia + sa),
  229. forward_iterator<const int*>(ib)) == false);
  230. #if TEST_STD_VER >= 14
  231. assert(std::is_permutation(forward_iterator<const int*>(ia),
  232. forward_iterator<const int*>(ia + sa),
  233. forward_iterator<const int*>(ib),
  234. forward_iterator<const int*>(ib + sa)) == false);
  235. #endif
  236. }
  237. {
  238. const int ia[] = {1, 1};
  239. const int ib[] = {0, 0};
  240. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  241. assert(std::is_permutation(forward_iterator<const int*>(ia),
  242. forward_iterator<const int*>(ia + sa),
  243. forward_iterator<const int*>(ib)) == false);
  244. #if TEST_STD_VER >= 14
  245. assert(std::is_permutation(forward_iterator<const int*>(ia),
  246. forward_iterator<const int*>(ia + sa),
  247. forward_iterator<const int*>(ib),
  248. forward_iterator<const int*>(ib + sa)) == false);
  249. #endif
  250. }
  251. {
  252. const int ia[] = {1, 1};
  253. const int ib[] = {0, 1};
  254. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  255. assert(std::is_permutation(forward_iterator<const int*>(ia),
  256. forward_iterator<const int*>(ia + sa),
  257. forward_iterator<const int*>(ib)) == false);
  258. #if TEST_STD_VER >= 14
  259. assert(std::is_permutation(forward_iterator<const int*>(ia),
  260. forward_iterator<const int*>(ia + sa),
  261. forward_iterator<const int*>(ib),
  262. forward_iterator<const int*>(ib + sa)) == false);
  263. #endif
  264. }
  265. {
  266. const int ia[] = {1, 1};
  267. const int ib[] = {1, 0};
  268. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  269. assert(std::is_permutation(forward_iterator<const int*>(ia),
  270. forward_iterator<const int*>(ia + sa),
  271. forward_iterator<const int*>(ib)) == false);
  272. #if TEST_STD_VER >= 14
  273. assert(std::is_permutation(forward_iterator<const int*>(ia),
  274. forward_iterator<const int*>(ia + sa),
  275. forward_iterator<const int*>(ib),
  276. forward_iterator<const int*>(ib + sa)) == false);
  277. #endif
  278. }
  279. {
  280. const int ia[] = {1, 1};
  281. const int ib[] = {1, 1};
  282. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  283. assert(std::is_permutation(forward_iterator<const int*>(ia),
  284. forward_iterator<const int*>(ia + sa),
  285. forward_iterator<const int*>(ib)) == true);
  286. #if TEST_STD_VER >= 14
  287. assert(std::is_permutation(forward_iterator<const int*>(ia),
  288. forward_iterator<const int*>(ia + sa),
  289. forward_iterator<const int*>(ib),
  290. forward_iterator<const int*>(ib + sa)) == true);
  291. #endif
  292. }
  293. {
  294. const int ia[] = {0, 0, 0};
  295. const int ib[] = {1, 0, 0};
  296. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  297. assert(std::is_permutation(forward_iterator<const int*>(ia),
  298. forward_iterator<const int*>(ia + sa),
  299. forward_iterator<const int*>(ib)) == false);
  300. #if TEST_STD_VER >= 14
  301. assert(std::is_permutation(forward_iterator<const int*>(ia),
  302. forward_iterator<const int*>(ia + sa),
  303. forward_iterator<const int*>(ib),
  304. forward_iterator<const int*>(ib + sa)) == false);
  305. #endif
  306. }
  307. {
  308. const int ia[] = {0, 0, 0};
  309. const int ib[] = {1, 0, 1};
  310. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  311. assert(std::is_permutation(forward_iterator<const int*>(ia),
  312. forward_iterator<const int*>(ia + sa),
  313. forward_iterator<const int*>(ib)) == false);
  314. #if TEST_STD_VER >= 14
  315. assert(std::is_permutation(forward_iterator<const int*>(ia),
  316. forward_iterator<const int*>(ia + sa),
  317. forward_iterator<const int*>(ib),
  318. forward_iterator<const int*>(ib + sa)) == false);
  319. #endif
  320. }
  321. {
  322. const int ia[] = {0, 0, 0};
  323. const int ib[] = {1, 0, 2};
  324. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  325. assert(std::is_permutation(forward_iterator<const int*>(ia),
  326. forward_iterator<const int*>(ia + sa),
  327. forward_iterator<const int*>(ib)) == false);
  328. #if TEST_STD_VER >= 14
  329. assert(std::is_permutation(forward_iterator<const int*>(ia),
  330. forward_iterator<const int*>(ia + sa),
  331. forward_iterator<const int*>(ib),
  332. forward_iterator<const int*>(ib + sa)) == false);
  333. #endif
  334. }
  335. {
  336. const int ia[] = {0, 0, 0};
  337. const int ib[] = {1, 1, 0};
  338. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  339. assert(std::is_permutation(forward_iterator<const int*>(ia),
  340. forward_iterator<const int*>(ia + sa),
  341. forward_iterator<const int*>(ib)) == false);
  342. #if TEST_STD_VER >= 14
  343. assert(std::is_permutation(forward_iterator<const int*>(ia),
  344. forward_iterator<const int*>(ia + sa),
  345. forward_iterator<const int*>(ib),
  346. forward_iterator<const int*>(ib + sa)) == false);
  347. #endif
  348. }
  349. {
  350. const int ia[] = {0, 0, 0};
  351. const int ib[] = {1, 1, 1};
  352. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  353. assert(std::is_permutation(forward_iterator<const int*>(ia),
  354. forward_iterator<const int*>(ia + sa),
  355. forward_iterator<const int*>(ib)) == false);
  356. #if TEST_STD_VER >= 14
  357. assert(std::is_permutation(forward_iterator<const int*>(ia),
  358. forward_iterator<const int*>(ia + sa),
  359. forward_iterator<const int*>(ib),
  360. forward_iterator<const int*>(ib + sa)) == false);
  361. #endif
  362. }
  363. {
  364. const int ia[] = {0, 0, 0};
  365. const int ib[] = {1, 1, 2};
  366. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  367. assert(std::is_permutation(forward_iterator<const int*>(ia),
  368. forward_iterator<const int*>(ia + sa),
  369. forward_iterator<const int*>(ib)) == false);
  370. #if TEST_STD_VER >= 14
  371. assert(std::is_permutation(forward_iterator<const int*>(ia),
  372. forward_iterator<const int*>(ia + sa),
  373. forward_iterator<const int*>(ib),
  374. forward_iterator<const int*>(ib + sa)) == false);
  375. #endif
  376. }
  377. {
  378. const int ia[] = {0, 0, 0};
  379. const int ib[] = {1, 2, 0};
  380. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  381. assert(std::is_permutation(forward_iterator<const int*>(ia),
  382. forward_iterator<const int*>(ia + sa),
  383. forward_iterator<const int*>(ib)) == false);
  384. #if TEST_STD_VER >= 14
  385. assert(std::is_permutation(forward_iterator<const int*>(ia),
  386. forward_iterator<const int*>(ia + sa),
  387. forward_iterator<const int*>(ib),
  388. forward_iterator<const int*>(ib + sa)) == false);
  389. #endif
  390. }
  391. {
  392. const int ia[] = {0, 0, 0};
  393. const int ib[] = {1, 2, 1};
  394. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  395. assert(std::is_permutation(forward_iterator<const int*>(ia),
  396. forward_iterator<const int*>(ia + sa),
  397. forward_iterator<const int*>(ib)) == false);
  398. #if TEST_STD_VER >= 14
  399. assert(std::is_permutation(forward_iterator<const int*>(ia),
  400. forward_iterator<const int*>(ia + sa),
  401. forward_iterator<const int*>(ib),
  402. forward_iterator<const int*>(ib + sa)) == false);
  403. #endif
  404. }
  405. {
  406. const int ia[] = {0, 0, 0};
  407. const int ib[] = {1, 2, 2};
  408. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  409. assert(std::is_permutation(forward_iterator<const int*>(ia),
  410. forward_iterator<const int*>(ia + sa),
  411. forward_iterator<const int*>(ib)) == false);
  412. #if TEST_STD_VER >= 14
  413. assert(std::is_permutation(forward_iterator<const int*>(ia),
  414. forward_iterator<const int*>(ia + sa),
  415. forward_iterator<const int*>(ib),
  416. forward_iterator<const int*>(ib + sa)) == false);
  417. #endif
  418. }
  419. {
  420. const int ia[] = {0, 0, 1};
  421. const int ib[] = {1, 0, 0};
  422. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  423. assert(std::is_permutation(forward_iterator<const int*>(ia),
  424. forward_iterator<const int*>(ia + sa),
  425. forward_iterator<const int*>(ib)) == true);
  426. #if TEST_STD_VER >= 14
  427. assert(std::is_permutation(forward_iterator<const int*>(ia),
  428. forward_iterator<const int*>(ia + sa),
  429. forward_iterator<const int*>(ib),
  430. forward_iterator<const int*>(ib + sa)) == true);
  431. assert(std::is_permutation(forward_iterator<const int*>(ia),
  432. forward_iterator<const int*>(ia + sa),
  433. forward_iterator<const int*>(ib),
  434. forward_iterator<const int*>(ib + sa - 1)) == false);
  435. #endif
  436. }
  437. {
  438. const int ia[] = {0, 0, 1};
  439. const int ib[] = {1, 0, 1};
  440. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  441. assert(std::is_permutation(forward_iterator<const int*>(ia),
  442. forward_iterator<const int*>(ia + sa),
  443. forward_iterator<const int*>(ib)) == false);
  444. #if TEST_STD_VER >= 14
  445. assert(std::is_permutation(forward_iterator<const int*>(ia),
  446. forward_iterator<const int*>(ia + sa),
  447. forward_iterator<const int*>(ib),
  448. forward_iterator<const int*>(ib + sa)) == false);
  449. #endif
  450. }
  451. {
  452. const int ia[] = {0, 1, 2};
  453. const int ib[] = {1, 0, 2};
  454. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  455. assert(std::is_permutation(forward_iterator<const int*>(ia),
  456. forward_iterator<const int*>(ia + sa),
  457. forward_iterator<const int*>(ib)) == true);
  458. #if TEST_STD_VER >= 14
  459. assert(std::is_permutation(forward_iterator<const int*>(ia),
  460. forward_iterator<const int*>(ia + sa),
  461. forward_iterator<const int*>(ib),
  462. forward_iterator<const int*>(ib + sa)) == true);
  463. assert(std::is_permutation(forward_iterator<const int*>(ia),
  464. forward_iterator<const int*>(ia + sa),
  465. forward_iterator<const int*>(ib),
  466. forward_iterator<const int*>(ib + sa - 1)) == false);
  467. #endif
  468. }
  469. {
  470. const int ia[] = {0, 1, 2};
  471. const int ib[] = {1, 2, 0};
  472. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  473. assert(std::is_permutation(forward_iterator<const int*>(ia),
  474. forward_iterator<const int*>(ia + sa),
  475. forward_iterator<const int*>(ib)) == true);
  476. #if TEST_STD_VER >= 14
  477. assert(std::is_permutation(forward_iterator<const int*>(ia),
  478. forward_iterator<const int*>(ia + sa),
  479. forward_iterator<const int*>(ib),
  480. forward_iterator<const int*>(ib + sa)) == true);
  481. assert(std::is_permutation(forward_iterator<const int*>(ia),
  482. forward_iterator<const int*>(ia + sa),
  483. forward_iterator<const int*>(ib),
  484. forward_iterator<const int*>(ib + sa - 1)) == false);
  485. #endif
  486. }
  487. {
  488. const int ia[] = {0, 1, 2};
  489. const int ib[] = {2, 1, 0};
  490. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  491. assert(std::is_permutation(forward_iterator<const int*>(ia),
  492. forward_iterator<const int*>(ia + sa),
  493. forward_iterator<const int*>(ib)) == true);
  494. #if TEST_STD_VER >= 14
  495. assert(std::is_permutation(forward_iterator<const int*>(ia),
  496. forward_iterator<const int*>(ia + sa),
  497. forward_iterator<const int*>(ib),
  498. forward_iterator<const int*>(ib + sa)) == true);
  499. assert(std::is_permutation(forward_iterator<const int*>(ia),
  500. forward_iterator<const int*>(ia + sa),
  501. forward_iterator<const int*>(ib),
  502. forward_iterator<const int*>(ib + sa - 1)) == false);
  503. #endif
  504. }
  505. {
  506. const int ia[] = {0, 1, 2};
  507. const int ib[] = {2, 0, 1};
  508. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  509. assert(std::is_permutation(forward_iterator<const int*>(ia),
  510. forward_iterator<const int*>(ia + sa),
  511. forward_iterator<const int*>(ib)) == true);
  512. #if TEST_STD_VER >= 14
  513. assert(std::is_permutation(forward_iterator<const int*>(ia),
  514. forward_iterator<const int*>(ia + sa),
  515. forward_iterator<const int*>(ib),
  516. forward_iterator<const int*>(ib + sa)) == true);
  517. assert(std::is_permutation(forward_iterator<const int*>(ia),
  518. forward_iterator<const int*>(ia + sa),
  519. forward_iterator<const int*>(ib),
  520. forward_iterator<const int*>(ib + sa - 1)) == false);
  521. #endif
  522. }
  523. {
  524. const int ia[] = {0, 0, 1};
  525. const int ib[] = {1, 0, 1};
  526. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  527. assert(std::is_permutation(forward_iterator<const int*>(ia),
  528. forward_iterator<const int*>(ia + sa),
  529. forward_iterator<const int*>(ib)) == false);
  530. #if TEST_STD_VER >= 14
  531. assert(std::is_permutation(forward_iterator<const int*>(ia),
  532. forward_iterator<const int*>(ia + sa),
  533. forward_iterator<const int*>(ib),
  534. forward_iterator<const int*>(ib + sa)) == false);
  535. #endif
  536. }
  537. {
  538. const int ia[] = {0, 0, 1};
  539. const int ib[] = {1, 0, 0};
  540. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  541. assert(std::is_permutation(forward_iterator<const int*>(ia),
  542. forward_iterator<const int*>(ia + sa),
  543. forward_iterator<const int*>(ib)) == true);
  544. #if TEST_STD_VER >= 14
  545. assert(std::is_permutation(forward_iterator<const int*>(ia),
  546. forward_iterator<const int*>(ia + sa),
  547. forward_iterator<const int*>(ib),
  548. forward_iterator<const int*>(ib + sa)) == true);
  549. assert(std::is_permutation(forward_iterator<const int*>(ia),
  550. forward_iterator<const int*>(ia + sa),
  551. forward_iterator<const int*>(ib + 1),
  552. forward_iterator<const int*>(ib + sa)) == false);
  553. assert(std::is_permutation(forward_iterator<const int*>(ia),
  554. forward_iterator<const int*>(ia + sa),
  555. forward_iterator<const int*>(ib),
  556. forward_iterator<const int*>(ib + sa - 1)) == false);
  557. #endif
  558. }
  559. {
  560. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  561. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  562. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  563. assert(std::is_permutation(forward_iterator<const int*>(ia),
  564. forward_iterator<const int*>(ia + sa),
  565. forward_iterator<const int*>(ib)) == true);
  566. #if TEST_STD_VER >= 14
  567. assert(std::is_permutation(forward_iterator<const int*>(ia),
  568. forward_iterator<const int*>(ia + sa),
  569. forward_iterator<const int*>(ib),
  570. forward_iterator<const int*>(ib + sa)) == true);
  571. assert(std::is_permutation(forward_iterator<const int*>(ia),
  572. forward_iterator<const int*>(ia + sa),
  573. forward_iterator<const int*>(ib + 1 ),
  574. forward_iterator<const int*>(ib + sa)) == false);
  575. assert(std::is_permutation(forward_iterator<const int*>(ia),
  576. forward_iterator<const int*>(ia + sa),
  577. forward_iterator<const int*>(ib),
  578. forward_iterator<const int*>(ib + sa - 1)) == false);
  579. #endif
  580. }
  581. {
  582. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  583. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
  584. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  585. assert(std::is_permutation(forward_iterator<const int*>(ia),
  586. forward_iterator<const int*>(ia + sa),
  587. forward_iterator<const int*>(ib)) == false);
  588. #if TEST_STD_VER >= 14
  589. assert(std::is_permutation(forward_iterator<const int*>(ia),
  590. forward_iterator<const int*>(ia + sa),
  591. forward_iterator<const int*>(ib),
  592. forward_iterator<const int*>(ib + sa)) == false);
  593. #endif
  594. }
  595. }