is_permutation.pass.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  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. // constexpr bool // constexpr after C++17
  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. #if TEST_STD_VER > 17
  19. TEST_CONSTEXPR int test_constexpr() {
  20. int ia[] = {0, 0, 0};
  21. int ib[] = {1, 1, 0};
  22. int ic[] = {1, 0, 1};
  23. int id[] = {1};
  24. return !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib))
  25. && !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib))
  26. && std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic))
  27. && std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic), std::end(ic))
  28. && !std::is_permutation(std::begin(ic), std::end(ic), std::begin(id), std::end(id))
  29. ;
  30. }
  31. #endif
  32. int main()
  33. {
  34. {
  35. const int ia[] = {0};
  36. const int ib[] = {0};
  37. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  38. assert(std::is_permutation(forward_iterator<const int*>(ia),
  39. forward_iterator<const int*>(ia + 0),
  40. forward_iterator<const int*>(ib)) == true);
  41. #if TEST_STD_VER >= 14
  42. assert(std::is_permutation(forward_iterator<const int*>(ia),
  43. forward_iterator<const int*>(ia + 0),
  44. forward_iterator<const int*>(ib),
  45. forward_iterator<const int*>(ib + 0)) == true);
  46. #endif
  47. assert(std::is_permutation(forward_iterator<const int*>(ia),
  48. forward_iterator<const int*>(ia + sa),
  49. forward_iterator<const int*>(ib)) == true);
  50. #if TEST_STD_VER >= 14
  51. assert(std::is_permutation(forward_iterator<const int*>(ia),
  52. forward_iterator<const int*>(ia + sa),
  53. forward_iterator<const int*>(ib),
  54. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  59. #endif
  60. }
  61. {
  62. const int ia[] = {0};
  63. const int ib[] = {1};
  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)) == false);
  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)) == false);
  73. #endif
  74. }
  75. {
  76. const int ia[] = {0, 0};
  77. const int ib[] = {0, 0};
  78. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  79. assert(std::is_permutation(forward_iterator<const int*>(ia),
  80. forward_iterator<const int*>(ia + sa),
  81. forward_iterator<const int*>(ib)) == true);
  82. #if TEST_STD_VER >= 14
  83. assert(std::is_permutation(forward_iterator<const int*>(ia),
  84. forward_iterator<const int*>(ia + sa),
  85. forward_iterator<const int*>(ib),
  86. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  91. #endif
  92. }
  93. {
  94. const int ia[] = {0, 0};
  95. const int ib[] = {0, 1};
  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, 0};
  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, 0};
  123. const int ib[] = {1, 1};
  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, 0};
  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)) == false);
  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)) == false);
  147. #endif
  148. }
  149. {
  150. const int ia[] = {0, 1};
  151. const int ib[] = {0, 1};
  152. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  153. assert(std::is_permutation(forward_iterator<const int*>(ia),
  154. forward_iterator<const int*>(ia + sa),
  155. forward_iterator<const int*>(ib)) == true);
  156. #if TEST_STD_VER >= 14
  157. assert(std::is_permutation(forward_iterator<const int*>(ia),
  158. forward_iterator<const int*>(ia + sa),
  159. forward_iterator<const int*>(ib),
  160. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  165. #endif
  166. }
  167. {
  168. const int ia[] = {0, 1};
  169. const int ib[] = {1, 0};
  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)) == true);
  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)) == true);
  179. #endif
  180. }
  181. {
  182. const int ia[] = {0, 1};
  183. const int ib[] = {1, 1};
  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, 0};
  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)) == false);
  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)) == false);
  207. #endif
  208. }
  209. {
  210. const int ia[] = {1, 0};
  211. const int ib[] = {0, 1};
  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, 0};
  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)) == true);
  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)) == true);
  235. #endif
  236. }
  237. {
  238. const int ia[] = {1, 0};
  239. const int ib[] = {1, 1};
  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, 0};
  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[] = {0, 1};
  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, 0};
  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)) == false);
  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)) == false);
  291. #endif
  292. }
  293. {
  294. const int ia[] = {1, 1};
  295. const int ib[] = {1, 1};
  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)) == true);
  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)) == true);
  305. #endif
  306. }
  307. {
  308. const int ia[] = {0, 0, 0};
  309. const int ib[] = {1, 0, 0};
  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, 1};
  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, 0, 2};
  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, 0};
  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, 1};
  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, 1, 2};
  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, 0};
  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, 1};
  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, 0};
  421. const int ib[] = {1, 2, 2};
  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)) == false);
  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)) == false);
  431. #endif
  432. }
  433. {
  434. const int ia[] = {0, 0, 1};
  435. const int ib[] = {1, 0, 0};
  436. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  437. assert(std::is_permutation(forward_iterator<const int*>(ia),
  438. forward_iterator<const int*>(ia + sa),
  439. forward_iterator<const int*>(ib)) == true);
  440. #if TEST_STD_VER >= 14
  441. assert(std::is_permutation(forward_iterator<const int*>(ia),
  442. forward_iterator<const int*>(ia + sa),
  443. forward_iterator<const int*>(ib),
  444. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  449. #endif
  450. }
  451. {
  452. const int ia[] = {0, 0, 1};
  453. const int ib[] = {1, 0, 1};
  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)) == false);
  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)) == false);
  463. #endif
  464. }
  465. {
  466. const int ia[] = {0, 1, 2};
  467. const int ib[] = {1, 0, 2};
  468. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  469. assert(std::is_permutation(forward_iterator<const int*>(ia),
  470. forward_iterator<const int*>(ia + sa),
  471. forward_iterator<const int*>(ib)) == true);
  472. #if TEST_STD_VER >= 14
  473. assert(std::is_permutation(forward_iterator<const int*>(ia),
  474. forward_iterator<const int*>(ia + sa),
  475. forward_iterator<const int*>(ib),
  476. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  481. #endif
  482. }
  483. {
  484. const int ia[] = {0, 1, 2};
  485. const int ib[] = {1, 2, 0};
  486. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  487. assert(std::is_permutation(forward_iterator<const int*>(ia),
  488. forward_iterator<const int*>(ia + sa),
  489. forward_iterator<const int*>(ib)) == true);
  490. #if TEST_STD_VER >= 14
  491. assert(std::is_permutation(forward_iterator<const int*>(ia),
  492. forward_iterator<const int*>(ia + sa),
  493. forward_iterator<const int*>(ib),
  494. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  499. #endif
  500. }
  501. {
  502. const int ia[] = {0, 1, 2};
  503. const int ib[] = {2, 1, 0};
  504. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  505. assert(std::is_permutation(forward_iterator<const int*>(ia),
  506. forward_iterator<const int*>(ia + sa),
  507. forward_iterator<const int*>(ib)) == true);
  508. #if TEST_STD_VER >= 14
  509. assert(std::is_permutation(forward_iterator<const int*>(ia),
  510. forward_iterator<const int*>(ia + sa),
  511. forward_iterator<const int*>(ib),
  512. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  517. #endif
  518. }
  519. {
  520. const int ia[] = {0, 1, 2};
  521. const int ib[] = {2, 0, 1};
  522. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  523. assert(std::is_permutation(forward_iterator<const int*>(ia),
  524. forward_iterator<const int*>(ia + sa),
  525. forward_iterator<const int*>(ib)) == true);
  526. #if TEST_STD_VER >= 14
  527. assert(std::is_permutation(forward_iterator<const int*>(ia),
  528. forward_iterator<const int*>(ia + sa),
  529. forward_iterator<const int*>(ib),
  530. forward_iterator<const int*>(ib + sa)) == true);
  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 - 1)) == false);
  535. #endif
  536. }
  537. {
  538. const int ia[] = {0, 0, 1};
  539. const int ib[] = {1, 0, 1};
  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)) == false);
  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)) == false);
  549. #endif
  550. }
  551. {
  552. const int ia[] = {0, 0, 1};
  553. const int ib[] = {1, 0, 0};
  554. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  555. assert(std::is_permutation(forward_iterator<const int*>(ia),
  556. forward_iterator<const int*>(ia + sa),
  557. forward_iterator<const int*>(ib)) == true);
  558. #if TEST_STD_VER >= 14
  559. assert(std::is_permutation(forward_iterator<const int*>(ia),
  560. forward_iterator<const int*>(ia + sa),
  561. forward_iterator<const int*>(ib),
  562. forward_iterator<const int*>(ib + sa)) == true);
  563. assert(std::is_permutation(forward_iterator<const int*>(ia),
  564. forward_iterator<const int*>(ia + sa),
  565. forward_iterator<const int*>(ib + 1),
  566. forward_iterator<const int*>(ib + sa)) == false);
  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 - 1)) == false);
  571. #endif
  572. }
  573. {
  574. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  575. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  576. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  577. assert(std::is_permutation(forward_iterator<const int*>(ia),
  578. forward_iterator<const int*>(ia + sa),
  579. forward_iterator<const int*>(ib)) == true);
  580. #if TEST_STD_VER >= 14
  581. assert(std::is_permutation(forward_iterator<const int*>(ia),
  582. forward_iterator<const int*>(ia + sa),
  583. forward_iterator<const int*>(ib),
  584. forward_iterator<const int*>(ib + sa)) == true);
  585. assert(std::is_permutation(forward_iterator<const int*>(ia),
  586. forward_iterator<const int*>(ia + sa),
  587. forward_iterator<const int*>(ib + 1 ),
  588. forward_iterator<const int*>(ib + sa)) == false);
  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 - 1)) == false);
  593. #endif
  594. }
  595. {
  596. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  597. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
  598. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  599. assert(std::is_permutation(forward_iterator<const int*>(ia),
  600. forward_iterator<const int*>(ia + sa),
  601. forward_iterator<const int*>(ib)) == false);
  602. #if TEST_STD_VER >= 14
  603. assert(std::is_permutation(forward_iterator<const int*>(ia),
  604. forward_iterator<const int*>(ia + sa),
  605. forward_iterator<const int*>(ib),
  606. forward_iterator<const int*>(ib + sa)) == false);
  607. #endif
  608. }
  609. #if TEST_STD_VER > 17
  610. static_assert(test_constexpr());
  611. #endif
  612. }