is_permutation.pass.cpp 30 KB

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