is_permutation_pred.pass.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  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, class BinaryPredicate>
  11. // constexpr bool // constexpr after C++17
  12. // is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
  13. // ForwardIterator2 first2, BinaryPredicate pred);
  14. #include <algorithm>
  15. #include <functional>
  16. #include <cassert>
  17. #include "test_macros.h"
  18. #include "test_iterators.h"
  19. int comparison_count = 0;
  20. template <typename T>
  21. bool counting_equals ( const T &a, const T &b ) {
  22. ++comparison_count;
  23. return a == b;
  24. }
  25. #if TEST_STD_VER > 17
  26. constexpr bool test_constexpr() {
  27. int ia[] = {0, 0, 0};
  28. int ib[] = {1, 1, 0};
  29. int ic[] = {1, 0, 1};
  30. int id[] = {1};
  31. std::equal_to<int> c{};
  32. return !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib) , c)
  33. && !std::is_permutation(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib), c)
  34. && std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic) , c)
  35. && std::is_permutation(std::begin(ib), std::end(ib), std::begin(ic), std::end(ic), c)
  36. && !std::is_permutation(std::begin(ic), std::end(ic), std::begin(id), std::end(id), c)
  37. ;
  38. }
  39. #endif
  40. int main()
  41. {
  42. {
  43. const int ia[] = {0};
  44. const int ib[] = {0};
  45. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  46. assert(std::is_permutation(forward_iterator<const int*>(ia),
  47. forward_iterator<const int*>(ia + 0),
  48. forward_iterator<const int*>(ib),
  49. std::equal_to<const int>()) == true);
  50. assert(std::is_permutation(forward_iterator<const int*>(ia),
  51. forward_iterator<const int*>(ia + sa),
  52. forward_iterator<const int*>(ib),
  53. std::equal_to<const int>()) == true);
  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),
  59. std::equal_to<const int>()) == true);
  60. assert(std::is_permutation(forward_iterator<const int*>(ia),
  61. forward_iterator<const int*>(ia + sa),
  62. forward_iterator<const int*>(ib),
  63. forward_iterator<const int*>(ib + sa - 1),
  64. std::equal_to<const int>()) == false);
  65. #endif
  66. }
  67. {
  68. const int ia[] = {0};
  69. const int ib[] = {1};
  70. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  71. assert(std::is_permutation(forward_iterator<const int*>(ia),
  72. forward_iterator<const int*>(ia + sa),
  73. forward_iterator<const int*>(ib),
  74. std::equal_to<const int>()) == false);
  75. #if TEST_STD_VER >= 14
  76. assert(std::is_permutation(forward_iterator<const int*>(ia),
  77. forward_iterator<const int*>(ia + sa),
  78. forward_iterator<const int*>(ib),
  79. forward_iterator<const int*>(ib + sa),
  80. std::equal_to<const int>()) == false);
  81. #endif
  82. }
  83. {
  84. const int ia[] = {0, 0};
  85. const int ib[] = {0, 0};
  86. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  87. assert(std::is_permutation(forward_iterator<const int*>(ia),
  88. forward_iterator<const int*>(ia + sa),
  89. forward_iterator<const int*>(ib),
  90. std::equal_to<const int>()) == true);
  91. #if TEST_STD_VER >= 14
  92. assert(std::is_permutation(forward_iterator<const int*>(ia),
  93. forward_iterator<const int*>(ia + sa),
  94. forward_iterator<const int*>(ib),
  95. forward_iterator<const int*>(ib + sa),
  96. std::equal_to<const int>()) == true);
  97. assert(std::is_permutation(forward_iterator<const int*>(ia),
  98. forward_iterator<const int*>(ia + sa),
  99. forward_iterator<const int*>(ib),
  100. forward_iterator<const int*>(ib + sa - 1),
  101. std::equal_to<const int>()) == false);
  102. #endif
  103. }
  104. {
  105. const int ia[] = {0, 0};
  106. const int ib[] = {0, 1};
  107. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  108. assert(std::is_permutation(forward_iterator<const int*>(ia),
  109. forward_iterator<const int*>(ia + sa),
  110. forward_iterator<const int*>(ib),
  111. std::equal_to<const int>()) == false);
  112. #if TEST_STD_VER >= 14
  113. assert(std::is_permutation(forward_iterator<const int*>(ia),
  114. forward_iterator<const int*>(ia + sa),
  115. forward_iterator<const int*>(ib),
  116. forward_iterator<const int*>(ib + sa),
  117. std::equal_to<const int>()) == false);
  118. #endif
  119. }
  120. {
  121. const int ia[] = {0, 0};
  122. const int ib[] = {1, 0};
  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),
  127. std::equal_to<const int>()) == 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),
  133. std::equal_to<const int>()) == false);
  134. #endif
  135. }
  136. {
  137. const int ia[] = {0, 0};
  138. const int ib[] = {1, 1};
  139. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  140. assert(std::is_permutation(forward_iterator<const int*>(ia),
  141. forward_iterator<const int*>(ia + sa),
  142. forward_iterator<const int*>(ib),
  143. std::equal_to<const int>()) == false);
  144. #if TEST_STD_VER >= 14
  145. assert(std::is_permutation(forward_iterator<const int*>(ia),
  146. forward_iterator<const int*>(ia + sa),
  147. forward_iterator<const int*>(ib),
  148. forward_iterator<const int*>(ib + sa),
  149. std::equal_to<const int>()) == false);
  150. #endif
  151. }
  152. {
  153. const int ia[] = {0, 1};
  154. const int ib[] = {0, 0};
  155. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  156. assert(std::is_permutation(forward_iterator<const int*>(ia),
  157. forward_iterator<const int*>(ia + sa),
  158. forward_iterator<const int*>(ib),
  159. std::equal_to<const int>()) == false);
  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),
  165. std::equal_to<const int>()) == false);
  166. #endif
  167. }
  168. {
  169. const int ia[] = {0, 1};
  170. const int ib[] = {0, 1};
  171. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  172. assert(std::is_permutation(forward_iterator<const int*>(ia),
  173. forward_iterator<const int*>(ia + sa),
  174. forward_iterator<const int*>(ib),
  175. std::equal_to<const int>()) == true);
  176. #if TEST_STD_VER >= 14
  177. assert(std::is_permutation(forward_iterator<const int*>(ia),
  178. forward_iterator<const int*>(ia + sa),
  179. forward_iterator<const int*>(ib),
  180. forward_iterator<const int*>(ib + sa),
  181. std::equal_to<const int>()) == true);
  182. assert(std::is_permutation(forward_iterator<const int*>(ia),
  183. forward_iterator<const int*>(ia + sa),
  184. forward_iterator<const int*>(ib),
  185. forward_iterator<const int*>(ib + sa - 1),
  186. std::equal_to<const int>()) == false);
  187. #endif
  188. }
  189. {
  190. const int ia[] = {0, 1};
  191. const int ib[] = {1, 0};
  192. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  193. assert(std::is_permutation(forward_iterator<const int*>(ia),
  194. forward_iterator<const int*>(ia + sa),
  195. forward_iterator<const int*>(ib),
  196. std::equal_to<const int>()) == true);
  197. #if TEST_STD_VER >= 14
  198. assert(std::is_permutation(forward_iterator<const int*>(ia),
  199. forward_iterator<const int*>(ia + sa),
  200. forward_iterator<const int*>(ib),
  201. forward_iterator<const int*>(ib + sa),
  202. std::equal_to<const int>()) == true);
  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 - 1),
  207. std::equal_to<const int>()) == false);
  208. #endif
  209. }
  210. {
  211. const int ia[] = {0, 1};
  212. const int ib[] = {1, 1};
  213. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  214. assert(std::is_permutation(forward_iterator<const int*>(ia),
  215. forward_iterator<const int*>(ia + sa),
  216. forward_iterator<const int*>(ib),
  217. std::equal_to<const int>()) == false);
  218. #if TEST_STD_VER >= 14
  219. assert(std::is_permutation(forward_iterator<const int*>(ia),
  220. forward_iterator<const int*>(ia + sa),
  221. forward_iterator<const int*>(ib),
  222. forward_iterator<const int*>(ib + sa),
  223. std::equal_to<const int>()) == false);
  224. #endif
  225. }
  226. {
  227. const int ia[] = {1, 0};
  228. const int ib[] = {0, 0};
  229. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  230. assert(std::is_permutation(forward_iterator<const int*>(ia),
  231. forward_iterator<const int*>(ia + sa),
  232. forward_iterator<const int*>(ib),
  233. std::equal_to<const int>()) == false);
  234. #if TEST_STD_VER >= 14
  235. assert(std::is_permutation(forward_iterator<const int*>(ia),
  236. forward_iterator<const int*>(ia + sa),
  237. forward_iterator<const int*>(ib),
  238. forward_iterator<const int*>(ib + sa),
  239. std::equal_to<const int>()) == false);
  240. #endif
  241. }
  242. {
  243. const int ia[] = {1, 0};
  244. const int ib[] = {0, 1};
  245. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  246. assert(std::is_permutation(forward_iterator<const int*>(ia),
  247. forward_iterator<const int*>(ia + sa),
  248. forward_iterator<const int*>(ib),
  249. std::equal_to<const int>()) == true);
  250. #if TEST_STD_VER >= 14
  251. assert(std::is_permutation(forward_iterator<const int*>(ia),
  252. forward_iterator<const int*>(ia + sa),
  253. forward_iterator<const int*>(ib),
  254. forward_iterator<const int*>(ib + sa),
  255. std::equal_to<const int>()) == true);
  256. assert(std::is_permutation(forward_iterator<const int*>(ia),
  257. forward_iterator<const int*>(ia + sa),
  258. forward_iterator<const int*>(ib),
  259. forward_iterator<const int*>(ib + sa - 1),
  260. std::equal_to<const int>()) == false);
  261. #endif
  262. }
  263. {
  264. const int ia[] = {1, 0};
  265. const int ib[] = {1, 0};
  266. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  267. assert(std::is_permutation(forward_iterator<const int*>(ia),
  268. forward_iterator<const int*>(ia + sa),
  269. forward_iterator<const int*>(ib),
  270. std::equal_to<const int>()) == true);
  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),
  276. std::equal_to<const int>()) == true);
  277. assert(std::is_permutation(forward_iterator<const int*>(ia),
  278. forward_iterator<const int*>(ia + sa),
  279. forward_iterator<const int*>(ib),
  280. forward_iterator<const int*>(ib + sa - 1),
  281. std::equal_to<const int>()) == false);
  282. #endif
  283. }
  284. {
  285. const int ia[] = {1, 0};
  286. const int ib[] = {1, 1};
  287. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  288. assert(std::is_permutation(forward_iterator<const int*>(ia),
  289. forward_iterator<const int*>(ia + sa),
  290. forward_iterator<const int*>(ib),
  291. std::equal_to<const int>()) == false);
  292. #if TEST_STD_VER >= 14
  293. assert(std::is_permutation(forward_iterator<const int*>(ia),
  294. forward_iterator<const int*>(ia + sa),
  295. forward_iterator<const int*>(ib),
  296. forward_iterator<const int*>(ib + sa),
  297. std::equal_to<const int>()) == false);
  298. #endif
  299. }
  300. {
  301. const int ia[] = {1, 1};
  302. const int ib[] = {0, 0};
  303. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  304. assert(std::is_permutation(forward_iterator<const int*>(ia),
  305. forward_iterator<const int*>(ia + sa),
  306. forward_iterator<const int*>(ib),
  307. std::equal_to<const int>()) == false);
  308. #if TEST_STD_VER >= 14
  309. assert(std::is_permutation(forward_iterator<const int*>(ia),
  310. forward_iterator<const int*>(ia + sa),
  311. forward_iterator<const int*>(ib),
  312. forward_iterator<const int*>(ib + sa),
  313. std::equal_to<const int>()) == false);
  314. #endif
  315. }
  316. {
  317. const int ia[] = {1, 1};
  318. const int ib[] = {0, 1};
  319. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  320. assert(std::is_permutation(forward_iterator<const int*>(ia),
  321. forward_iterator<const int*>(ia + sa),
  322. forward_iterator<const int*>(ib),
  323. std::equal_to<const int>()) == false);
  324. #if TEST_STD_VER >= 14
  325. assert(std::is_permutation(forward_iterator<const int*>(ia),
  326. forward_iterator<const int*>(ia + sa),
  327. forward_iterator<const int*>(ib),
  328. forward_iterator<const int*>(ib + sa),
  329. std::equal_to<const int>()) == false);
  330. #endif
  331. }
  332. {
  333. const int ia[] = {1, 1};
  334. const int ib[] = {1, 0};
  335. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  336. assert(std::is_permutation(forward_iterator<const int*>(ia),
  337. forward_iterator<const int*>(ia + sa),
  338. forward_iterator<const int*>(ib),
  339. std::equal_to<const int>()) == false);
  340. #if TEST_STD_VER >= 14
  341. assert(std::is_permutation(forward_iterator<const int*>(ia),
  342. forward_iterator<const int*>(ia + sa),
  343. forward_iterator<const int*>(ib),
  344. forward_iterator<const int*>(ib + sa),
  345. std::equal_to<const int>()) == false);
  346. #endif
  347. }
  348. {
  349. const int ia[] = {1, 1};
  350. const int ib[] = {1, 1};
  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),
  355. std::equal_to<const int>()) == true);
  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),
  361. std::equal_to<const int>()) == true);
  362. assert(std::is_permutation(forward_iterator<const int*>(ia),
  363. forward_iterator<const int*>(ia + sa),
  364. forward_iterator<const int*>(ib),
  365. forward_iterator<const int*>(ib + sa - 1),
  366. std::equal_to<const int>()) == false);
  367. #endif
  368. }
  369. {
  370. const int ia[] = {0, 0, 0};
  371. const int ib[] = {1, 0, 0};
  372. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  373. assert(std::is_permutation(forward_iterator<const int*>(ia),
  374. forward_iterator<const int*>(ia + sa),
  375. forward_iterator<const int*>(ib),
  376. std::equal_to<const int>()) == false);
  377. #if TEST_STD_VER >= 14
  378. assert(std::is_permutation(forward_iterator<const int*>(ia),
  379. forward_iterator<const int*>(ia + sa),
  380. forward_iterator<const int*>(ib),
  381. forward_iterator<const int*>(ib + sa),
  382. std::equal_to<const int>()) == false);
  383. #endif
  384. }
  385. {
  386. const int ia[] = {0, 0, 0};
  387. const int ib[] = {1, 0, 1};
  388. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  389. assert(std::is_permutation(forward_iterator<const int*>(ia),
  390. forward_iterator<const int*>(ia + sa),
  391. forward_iterator<const int*>(ib),
  392. std::equal_to<const int>()) == false);
  393. #if TEST_STD_VER >= 14
  394. assert(std::is_permutation(forward_iterator<const int*>(ia),
  395. forward_iterator<const int*>(ia + sa),
  396. forward_iterator<const int*>(ib),
  397. forward_iterator<const int*>(ib + sa),
  398. std::equal_to<const int>()) == false);
  399. #endif
  400. }
  401. {
  402. const int ia[] = {0, 0, 0};
  403. const int ib[] = {1, 0, 2};
  404. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  405. assert(std::is_permutation(forward_iterator<const int*>(ia),
  406. forward_iterator<const int*>(ia + sa),
  407. forward_iterator<const int*>(ib),
  408. std::equal_to<const int>()) == false);
  409. #if TEST_STD_VER >= 14
  410. assert(std::is_permutation(forward_iterator<const int*>(ia),
  411. forward_iterator<const int*>(ia + sa),
  412. forward_iterator<const int*>(ib),
  413. forward_iterator<const int*>(ib + sa),
  414. std::equal_to<const int>()) == false);
  415. #endif
  416. }
  417. {
  418. const int ia[] = {0, 0, 0};
  419. const int ib[] = {1, 1, 0};
  420. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  421. assert(std::is_permutation(forward_iterator<const int*>(ia),
  422. forward_iterator<const int*>(ia + sa),
  423. forward_iterator<const int*>(ib),
  424. std::equal_to<const int>()) == 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),
  430. std::equal_to<const int>()) == false);
  431. #endif
  432. }
  433. {
  434. const int ia[] = {0, 0, 0};
  435. const int ib[] = {1, 1, 1};
  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),
  440. std::equal_to<const int>()) == false);
  441. #if TEST_STD_VER >= 14
  442. assert(std::is_permutation(forward_iterator<const int*>(ia),
  443. forward_iterator<const int*>(ia + sa),
  444. forward_iterator<const int*>(ib),
  445. forward_iterator<const int*>(ib + sa),
  446. std::equal_to<const int>()) == false);
  447. #endif
  448. }
  449. {
  450. const int ia[] = {0, 0, 0};
  451. const int ib[] = {1, 1, 2};
  452. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  453. assert(std::is_permutation(forward_iterator<const int*>(ia),
  454. forward_iterator<const int*>(ia + sa),
  455. forward_iterator<const int*>(ib),
  456. std::equal_to<const int>()) == 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),
  462. std::equal_to<const int>()) == false);
  463. #endif
  464. }
  465. {
  466. const int ia[] = {0, 0, 0};
  467. const int ib[] = {1, 2, 0};
  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),
  472. std::equal_to<const int>()) == false);
  473. #if TEST_STD_VER >= 14
  474. assert(std::is_permutation(forward_iterator<const int*>(ia),
  475. forward_iterator<const int*>(ia + sa),
  476. forward_iterator<const int*>(ib),
  477. forward_iterator<const int*>(ib + sa),
  478. std::equal_to<const int>()) == false);
  479. #endif
  480. }
  481. {
  482. const int ia[] = {0, 0, 0};
  483. const int ib[] = {1, 2, 1};
  484. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  485. assert(std::is_permutation(forward_iterator<const int*>(ia),
  486. forward_iterator<const int*>(ia + sa),
  487. forward_iterator<const int*>(ib),
  488. std::equal_to<const int>()) == false);
  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),
  494. std::equal_to<const int>()) == false);
  495. #endif
  496. }
  497. {
  498. const int ia[] = {0, 0, 0};
  499. const int ib[] = {1, 2, 2};
  500. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  501. assert(std::is_permutation(forward_iterator<const int*>(ia),
  502. forward_iterator<const int*>(ia + sa),
  503. forward_iterator<const int*>(ib),
  504. std::equal_to<const int>()) == false);
  505. #if TEST_STD_VER >= 14
  506. assert(std::is_permutation(forward_iterator<const int*>(ia),
  507. forward_iterator<const int*>(ia + sa),
  508. forward_iterator<const int*>(ib),
  509. forward_iterator<const int*>(ib + sa),
  510. std::equal_to<const int>()) == false);
  511. #endif
  512. }
  513. {
  514. const int ia[] = {0, 0, 1};
  515. const int ib[] = {1, 0, 0};
  516. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  517. assert(std::is_permutation(forward_iterator<const int*>(ia),
  518. forward_iterator<const int*>(ia + sa),
  519. forward_iterator<const int*>(ib),
  520. std::equal_to<const int>()) == true);
  521. #if TEST_STD_VER >= 14
  522. assert(std::is_permutation(forward_iterator<const int*>(ia),
  523. forward_iterator<const int*>(ia + sa),
  524. forward_iterator<const int*>(ib),
  525. forward_iterator<const int*>(ib + sa),
  526. std::equal_to<const int>()) == true);
  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 - 1),
  531. std::equal_to<const int>()) == false);
  532. #endif
  533. }
  534. {
  535. const int ia[] = {0, 0, 1};
  536. const int ib[] = {1, 0, 1};
  537. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  538. assert(std::is_permutation(forward_iterator<const int*>(ia),
  539. forward_iterator<const int*>(ia + sa),
  540. forward_iterator<const int*>(ib),
  541. std::equal_to<const int>()) == false);
  542. #if TEST_STD_VER >= 14
  543. assert(std::is_permutation(forward_iterator<const int*>(ia),
  544. forward_iterator<const int*>(ia + sa),
  545. forward_iterator<const int*>(ib),
  546. forward_iterator<const int*>(ib + sa),
  547. std::equal_to<const int>()) == false);
  548. #endif
  549. }
  550. {
  551. const int ia[] = {0, 1, 2};
  552. const int ib[] = {1, 0, 2};
  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),
  557. std::equal_to<const int>()) == 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),
  563. std::equal_to<const int>()) == true);
  564. assert(std::is_permutation(forward_iterator<const int*>(ia),
  565. forward_iterator<const int*>(ia + sa),
  566. forward_iterator<const int*>(ib),
  567. forward_iterator<const int*>(ib + sa - 1),
  568. std::equal_to<const int>()) == false);
  569. #endif
  570. }
  571. {
  572. const int ia[] = {0, 1, 2};
  573. const int ib[] = {1, 2, 0};
  574. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  575. assert(std::is_permutation(forward_iterator<const int*>(ia),
  576. forward_iterator<const int*>(ia + sa),
  577. forward_iterator<const int*>(ib),
  578. std::equal_to<const int>()) == 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),
  584. std::equal_to<const int>()) == true);
  585. assert(std::is_permutation(forward_iterator<const int*>(ia),
  586. forward_iterator<const int*>(ia + sa),
  587. forward_iterator<const int*>(ib),
  588. forward_iterator<const int*>(ib + sa - 1),
  589. std::equal_to<const int>()) == false);
  590. #endif
  591. }
  592. {
  593. const int ia[] = {0, 1, 2};
  594. const int ib[] = {2, 1, 0};
  595. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  596. assert(std::is_permutation(forward_iterator<const int*>(ia),
  597. forward_iterator<const int*>(ia + sa),
  598. forward_iterator<const int*>(ib),
  599. std::equal_to<const int>()) == true);
  600. #if TEST_STD_VER >= 14
  601. assert(std::is_permutation(forward_iterator<const int*>(ia),
  602. forward_iterator<const int*>(ia + sa),
  603. forward_iterator<const int*>(ib),
  604. forward_iterator<const int*>(ib + sa),
  605. std::equal_to<const int>()) == true);
  606. assert(std::is_permutation(forward_iterator<const int*>(ia),
  607. forward_iterator<const int*>(ia + sa),
  608. forward_iterator<const int*>(ib),
  609. forward_iterator<const int*>(ib + sa - 1),
  610. std::equal_to<const int>()) == false);
  611. #endif
  612. }
  613. {
  614. const int ia[] = {0, 1, 2};
  615. const int ib[] = {2, 0, 1};
  616. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  617. assert(std::is_permutation(forward_iterator<const int*>(ia),
  618. forward_iterator<const int*>(ia + sa),
  619. forward_iterator<const int*>(ib),
  620. std::equal_to<const int>()) == true);
  621. #if TEST_STD_VER >= 14
  622. assert(std::is_permutation(forward_iterator<const int*>(ia),
  623. forward_iterator<const int*>(ia + sa),
  624. forward_iterator<const int*>(ib),
  625. forward_iterator<const int*>(ib + sa),
  626. std::equal_to<const int>()) == true);
  627. assert(std::is_permutation(forward_iterator<const int*>(ia),
  628. forward_iterator<const int*>(ia + sa),
  629. forward_iterator<const int*>(ib),
  630. forward_iterator<const int*>(ib + sa - 1),
  631. std::equal_to<const int>()) == false);
  632. #endif
  633. }
  634. {
  635. const int ia[] = {0, 0, 1};
  636. const int ib[] = {1, 0, 1};
  637. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  638. assert(std::is_permutation(forward_iterator<const int*>(ia),
  639. forward_iterator<const int*>(ia + sa),
  640. forward_iterator<const int*>(ib),
  641. std::equal_to<const int>()) == false);
  642. #if TEST_STD_VER >= 14
  643. assert(std::is_permutation(forward_iterator<const int*>(ia),
  644. forward_iterator<const int*>(ia + sa),
  645. forward_iterator<const int*>(ib),
  646. forward_iterator<const int*>(ib + sa),
  647. std::equal_to<const int>()) == false);
  648. #endif
  649. }
  650. {
  651. const int ia[] = {0, 0, 1};
  652. const int ib[] = {1, 0, 0};
  653. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  654. assert(std::is_permutation(forward_iterator<const int*>(ia),
  655. forward_iterator<const int*>(ia + sa),
  656. forward_iterator<const int*>(ib),
  657. std::equal_to<const int>()) == true);
  658. #if TEST_STD_VER >= 14
  659. assert(std::is_permutation(forward_iterator<const int*>(ia),
  660. forward_iterator<const int*>(ia + sa),
  661. forward_iterator<const int*>(ib),
  662. forward_iterator<const int*>(ib + sa),
  663. std::equal_to<const int>()) == true);
  664. assert(std::is_permutation(forward_iterator<const int*>(ia),
  665. forward_iterator<const int*>(ia + sa),
  666. forward_iterator<const int*>(ib + 1),
  667. forward_iterator<const int*>(ib + sa),
  668. std::equal_to<const int>()) == false);
  669. assert(std::is_permutation(forward_iterator<const int*>(ia),
  670. forward_iterator<const int*>(ia + sa),
  671. forward_iterator<const int*>(ib),
  672. forward_iterator<const int*>(ib + sa - 1),
  673. std::equal_to<const int>()) == false);
  674. #endif
  675. }
  676. {
  677. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  678. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  679. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  680. assert(std::is_permutation(forward_iterator<const int*>(ia),
  681. forward_iterator<const int*>(ia + sa),
  682. forward_iterator<const int*>(ib),
  683. std::equal_to<const int>()) == true);
  684. #if TEST_STD_VER >= 14
  685. assert(std::is_permutation(forward_iterator<const int*>(ia),
  686. forward_iterator<const int*>(ia + sa),
  687. forward_iterator<const int*>(ib),
  688. forward_iterator<const int*>(ib + sa),
  689. std::equal_to<const int>()) == true);
  690. assert(std::is_permutation(forward_iterator<const int*>(ia),
  691. forward_iterator<const int*>(ia + sa),
  692. forward_iterator<const int*>(ib + 1),
  693. forward_iterator<const int*>(ib + sa),
  694. std::equal_to<const int>()) == false);
  695. assert(std::is_permutation(forward_iterator<const int*>(ia),
  696. forward_iterator<const int*>(ia + sa),
  697. forward_iterator<const int*>(ib),
  698. forward_iterator<const int*>(ib + sa - 1),
  699. std::equal_to<const int>()) == false);
  700. comparison_count = 0;
  701. assert(std::is_permutation(forward_iterator<const int*>(ia),
  702. forward_iterator<const int*>(ia + sa),
  703. forward_iterator<const int*>(ib),
  704. forward_iterator<const int*>(ib + sa - 1),
  705. counting_equals<const int>) == false);
  706. assert ( comparison_count > 0 );
  707. comparison_count = 0;
  708. assert(std::is_permutation(random_access_iterator<const int*>(ia),
  709. random_access_iterator<const int*>(ia + sa),
  710. random_access_iterator<const int*>(ib),
  711. random_access_iterator<const int*>(ib + sa - 1),
  712. counting_equals<const int>) == false);
  713. assert ( comparison_count == 0 );
  714. #endif
  715. }
  716. {
  717. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  718. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
  719. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  720. assert(std::is_permutation(forward_iterator<const int*>(ia),
  721. forward_iterator<const int*>(ia + sa),
  722. forward_iterator<const int*>(ib),
  723. std::equal_to<const int>()) == false);
  724. #if TEST_STD_VER >= 14
  725. assert(std::is_permutation(forward_iterator<const int*>(ia),
  726. forward_iterator<const int*>(ia + sa),
  727. forward_iterator<const int*>(ib),
  728. forward_iterator<const int*>(ib + sa),
  729. std::equal_to<const int>()) == false);
  730. #endif
  731. }
  732. #if TEST_STD_VER > 17
  733. static_assert(test_constexpr());
  734. #endif
  735. }