is_permutation_pred.pass.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  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. // bool
  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. int main()
  26. {
  27. {
  28. const int ia[] = {0};
  29. const int ib[] = {0};
  30. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  31. assert(std::is_permutation(forward_iterator<const int*>(ia),
  32. forward_iterator<const int*>(ia + 0),
  33. forward_iterator<const int*>(ib),
  34. std::equal_to<const int>()) == true);
  35. assert(std::is_permutation(forward_iterator<const int*>(ia),
  36. forward_iterator<const int*>(ia + sa),
  37. forward_iterator<const int*>(ib),
  38. std::equal_to<const int>()) == true);
  39. #if TEST_STD_VER >= 14
  40. assert(std::is_permutation(forward_iterator<const int*>(ia),
  41. forward_iterator<const int*>(ia + sa),
  42. forward_iterator<const int*>(ib),
  43. forward_iterator<const int*>(ib + sa),
  44. std::equal_to<const int>()) == true);
  45. assert(std::is_permutation(forward_iterator<const int*>(ia),
  46. forward_iterator<const int*>(ia + sa),
  47. forward_iterator<const int*>(ib),
  48. forward_iterator<const int*>(ib + sa - 1),
  49. std::equal_to<const int>()) == false);
  50. #endif
  51. }
  52. {
  53. const int ia[] = {0};
  54. const int ib[] = {1};
  55. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  56. assert(std::is_permutation(forward_iterator<const int*>(ia),
  57. forward_iterator<const int*>(ia + sa),
  58. forward_iterator<const int*>(ib),
  59. std::equal_to<const int>()) == false);
  60. #if TEST_STD_VER >= 14
  61. assert(std::is_permutation(forward_iterator<const int*>(ia),
  62. forward_iterator<const int*>(ia + sa),
  63. forward_iterator<const int*>(ib),
  64. forward_iterator<const int*>(ib + sa),
  65. std::equal_to<const int>()) == false);
  66. #endif
  67. }
  68. {
  69. const int ia[] = {0, 0};
  70. const int ib[] = {0, 0};
  71. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  72. assert(std::is_permutation(forward_iterator<const int*>(ia),
  73. forward_iterator<const int*>(ia + sa),
  74. forward_iterator<const int*>(ib),
  75. std::equal_to<const int>()) == true);
  76. #if TEST_STD_VER >= 14
  77. assert(std::is_permutation(forward_iterator<const int*>(ia),
  78. forward_iterator<const int*>(ia + sa),
  79. forward_iterator<const int*>(ib),
  80. forward_iterator<const int*>(ib + sa),
  81. std::equal_to<const int>()) == true);
  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 - 1),
  86. std::equal_to<const int>()) == false);
  87. #endif
  88. }
  89. {
  90. const int ia[] = {0, 0};
  91. const int ib[] = {0, 1};
  92. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  93. assert(std::is_permutation(forward_iterator<const int*>(ia),
  94. forward_iterator<const int*>(ia + sa),
  95. forward_iterator<const int*>(ib),
  96. std::equal_to<const int>()) == false);
  97. #if TEST_STD_VER >= 14
  98. assert(std::is_permutation(forward_iterator<const int*>(ia),
  99. forward_iterator<const int*>(ia + sa),
  100. forward_iterator<const int*>(ib),
  101. forward_iterator<const int*>(ib + sa),
  102. std::equal_to<const int>()) == false);
  103. #endif
  104. }
  105. {
  106. const int ia[] = {0, 0};
  107. const int ib[] = {1, 0};
  108. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  109. assert(std::is_permutation(forward_iterator<const int*>(ia),
  110. forward_iterator<const int*>(ia + sa),
  111. forward_iterator<const int*>(ib),
  112. std::equal_to<const int>()) == 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),
  118. std::equal_to<const int>()) == 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),
  128. std::equal_to<const int>()) == false);
  129. #if TEST_STD_VER >= 14
  130. assert(std::is_permutation(forward_iterator<const int*>(ia),
  131. forward_iterator<const int*>(ia + sa),
  132. forward_iterator<const int*>(ib),
  133. forward_iterator<const int*>(ib + sa),
  134. std::equal_to<const int>()) == false);
  135. #endif
  136. }
  137. {
  138. const int ia[] = {0, 1};
  139. const int ib[] = {0, 0};
  140. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  141. assert(std::is_permutation(forward_iterator<const int*>(ia),
  142. forward_iterator<const int*>(ia + sa),
  143. forward_iterator<const int*>(ib),
  144. std::equal_to<const int>()) == false);
  145. #if TEST_STD_VER >= 14
  146. assert(std::is_permutation(forward_iterator<const int*>(ia),
  147. forward_iterator<const int*>(ia + sa),
  148. forward_iterator<const int*>(ib),
  149. forward_iterator<const int*>(ib + sa),
  150. std::equal_to<const int>()) == false);
  151. #endif
  152. }
  153. {
  154. const int ia[] = {0, 1};
  155. const int ib[] = {0, 1};
  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),
  160. std::equal_to<const int>()) == true);
  161. #if TEST_STD_VER >= 14
  162. assert(std::is_permutation(forward_iterator<const int*>(ia),
  163. forward_iterator<const int*>(ia + sa),
  164. forward_iterator<const int*>(ib),
  165. forward_iterator<const int*>(ib + sa),
  166. std::equal_to<const int>()) == true);
  167. assert(std::is_permutation(forward_iterator<const int*>(ia),
  168. forward_iterator<const int*>(ia + sa),
  169. forward_iterator<const int*>(ib),
  170. forward_iterator<const int*>(ib + sa - 1),
  171. std::equal_to<const int>()) == false);
  172. #endif
  173. }
  174. {
  175. const int ia[] = {0, 1};
  176. const int ib[] = {1, 0};
  177. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  178. assert(std::is_permutation(forward_iterator<const int*>(ia),
  179. forward_iterator<const int*>(ia + sa),
  180. forward_iterator<const int*>(ib),
  181. std::equal_to<const int>()) == true);
  182. #if TEST_STD_VER >= 14
  183. assert(std::is_permutation(forward_iterator<const int*>(ia),
  184. forward_iterator<const int*>(ia + sa),
  185. forward_iterator<const int*>(ib),
  186. forward_iterator<const int*>(ib + sa),
  187. std::equal_to<const int>()) == true);
  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 - 1),
  192. std::equal_to<const int>()) == false);
  193. #endif
  194. }
  195. {
  196. const int ia[] = {0, 1};
  197. const int ib[] = {1, 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),
  202. std::equal_to<const int>()) == false);
  203. #if TEST_STD_VER >= 14
  204. assert(std::is_permutation(forward_iterator<const int*>(ia),
  205. forward_iterator<const int*>(ia + sa),
  206. forward_iterator<const int*>(ib),
  207. forward_iterator<const int*>(ib + sa),
  208. std::equal_to<const int>()) == false);
  209. #endif
  210. }
  211. {
  212. const int ia[] = {1, 0};
  213. const int ib[] = {0, 0};
  214. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  215. assert(std::is_permutation(forward_iterator<const int*>(ia),
  216. forward_iterator<const int*>(ia + sa),
  217. forward_iterator<const int*>(ib),
  218. std::equal_to<const int>()) == false);
  219. #if TEST_STD_VER >= 14
  220. assert(std::is_permutation(forward_iterator<const int*>(ia),
  221. forward_iterator<const int*>(ia + sa),
  222. forward_iterator<const int*>(ib),
  223. forward_iterator<const int*>(ib + sa),
  224. std::equal_to<const int>()) == false);
  225. #endif
  226. }
  227. {
  228. const int ia[] = {1, 0};
  229. const int ib[] = {0, 1};
  230. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  231. assert(std::is_permutation(forward_iterator<const int*>(ia),
  232. forward_iterator<const int*>(ia + sa),
  233. forward_iterator<const int*>(ib),
  234. std::equal_to<const int>()) == true);
  235. #if TEST_STD_VER >= 14
  236. assert(std::is_permutation(forward_iterator<const int*>(ia),
  237. forward_iterator<const int*>(ia + sa),
  238. forward_iterator<const int*>(ib),
  239. forward_iterator<const int*>(ib + sa),
  240. std::equal_to<const int>()) == true);
  241. assert(std::is_permutation(forward_iterator<const int*>(ia),
  242. forward_iterator<const int*>(ia + sa),
  243. forward_iterator<const int*>(ib),
  244. forward_iterator<const int*>(ib + sa - 1),
  245. std::equal_to<const int>()) == false);
  246. #endif
  247. }
  248. {
  249. const int ia[] = {1, 0};
  250. const int ib[] = {1, 0};
  251. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  252. assert(std::is_permutation(forward_iterator<const int*>(ia),
  253. forward_iterator<const int*>(ia + sa),
  254. forward_iterator<const int*>(ib),
  255. std::equal_to<const int>()) == true);
  256. #if TEST_STD_VER >= 14
  257. assert(std::is_permutation(forward_iterator<const int*>(ia),
  258. forward_iterator<const int*>(ia + sa),
  259. forward_iterator<const int*>(ib),
  260. forward_iterator<const int*>(ib + sa),
  261. std::equal_to<const int>()) == true);
  262. assert(std::is_permutation(forward_iterator<const int*>(ia),
  263. forward_iterator<const int*>(ia + sa),
  264. forward_iterator<const int*>(ib),
  265. forward_iterator<const int*>(ib + sa - 1),
  266. std::equal_to<const int>()) == false);
  267. #endif
  268. }
  269. {
  270. const int ia[] = {1, 0};
  271. const int ib[] = {1, 1};
  272. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  273. assert(std::is_permutation(forward_iterator<const int*>(ia),
  274. forward_iterator<const int*>(ia + sa),
  275. forward_iterator<const int*>(ib),
  276. std::equal_to<const int>()) == false);
  277. #if TEST_STD_VER >= 14
  278. assert(std::is_permutation(forward_iterator<const int*>(ia),
  279. forward_iterator<const int*>(ia + sa),
  280. forward_iterator<const int*>(ib),
  281. forward_iterator<const int*>(ib + sa),
  282. std::equal_to<const int>()) == false);
  283. #endif
  284. }
  285. {
  286. const int ia[] = {1, 1};
  287. const int ib[] = {0, 0};
  288. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  289. assert(std::is_permutation(forward_iterator<const int*>(ia),
  290. forward_iterator<const int*>(ia + sa),
  291. forward_iterator<const int*>(ib),
  292. std::equal_to<const int>()) == false);
  293. #if TEST_STD_VER >= 14
  294. assert(std::is_permutation(forward_iterator<const int*>(ia),
  295. forward_iterator<const int*>(ia + sa),
  296. forward_iterator<const int*>(ib),
  297. forward_iterator<const int*>(ib + sa),
  298. std::equal_to<const int>()) == false);
  299. #endif
  300. }
  301. {
  302. const int ia[] = {1, 1};
  303. const int ib[] = {0, 1};
  304. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  305. assert(std::is_permutation(forward_iterator<const int*>(ia),
  306. forward_iterator<const int*>(ia + sa),
  307. forward_iterator<const int*>(ib),
  308. std::equal_to<const int>()) == false);
  309. #if TEST_STD_VER >= 14
  310. assert(std::is_permutation(forward_iterator<const int*>(ia),
  311. forward_iterator<const int*>(ia + sa),
  312. forward_iterator<const int*>(ib),
  313. forward_iterator<const int*>(ib + sa),
  314. std::equal_to<const int>()) == false);
  315. #endif
  316. }
  317. {
  318. const int ia[] = {1, 1};
  319. const int ib[] = {1, 0};
  320. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  321. assert(std::is_permutation(forward_iterator<const int*>(ia),
  322. forward_iterator<const int*>(ia + sa),
  323. forward_iterator<const int*>(ib),
  324. std::equal_to<const int>()) == false);
  325. #if TEST_STD_VER >= 14
  326. assert(std::is_permutation(forward_iterator<const int*>(ia),
  327. forward_iterator<const int*>(ia + sa),
  328. forward_iterator<const int*>(ib),
  329. forward_iterator<const int*>(ib + sa),
  330. std::equal_to<const int>()) == false);
  331. #endif
  332. }
  333. {
  334. const int ia[] = {1, 1};
  335. const int ib[] = {1, 1};
  336. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  337. assert(std::is_permutation(forward_iterator<const int*>(ia),
  338. forward_iterator<const int*>(ia + sa),
  339. forward_iterator<const int*>(ib),
  340. std::equal_to<const int>()) == true);
  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),
  346. std::equal_to<const int>()) == true);
  347. assert(std::is_permutation(forward_iterator<const int*>(ia),
  348. forward_iterator<const int*>(ia + sa),
  349. forward_iterator<const int*>(ib),
  350. forward_iterator<const int*>(ib + sa - 1),
  351. std::equal_to<const int>()) == false);
  352. #endif
  353. }
  354. {
  355. const int ia[] = {0, 0, 0};
  356. const int ib[] = {1, 0, 0};
  357. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  358. assert(std::is_permutation(forward_iterator<const int*>(ia),
  359. forward_iterator<const int*>(ia + sa),
  360. forward_iterator<const int*>(ib),
  361. std::equal_to<const int>()) == false);
  362. #if TEST_STD_VER >= 14
  363. assert(std::is_permutation(forward_iterator<const int*>(ia),
  364. forward_iterator<const int*>(ia + sa),
  365. forward_iterator<const int*>(ib),
  366. forward_iterator<const int*>(ib + sa),
  367. std::equal_to<const int>()) == false);
  368. #endif
  369. }
  370. {
  371. const int ia[] = {0, 0, 0};
  372. const int ib[] = {1, 0, 1};
  373. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  374. assert(std::is_permutation(forward_iterator<const int*>(ia),
  375. forward_iterator<const int*>(ia + sa),
  376. forward_iterator<const int*>(ib),
  377. std::equal_to<const int>()) == false);
  378. #if TEST_STD_VER >= 14
  379. assert(std::is_permutation(forward_iterator<const int*>(ia),
  380. forward_iterator<const int*>(ia + sa),
  381. forward_iterator<const int*>(ib),
  382. forward_iterator<const int*>(ib + sa),
  383. std::equal_to<const int>()) == false);
  384. #endif
  385. }
  386. {
  387. const int ia[] = {0, 0, 0};
  388. const int ib[] = {1, 0, 2};
  389. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  390. assert(std::is_permutation(forward_iterator<const int*>(ia),
  391. forward_iterator<const int*>(ia + sa),
  392. forward_iterator<const int*>(ib),
  393. std::equal_to<const int>()) == false);
  394. #if TEST_STD_VER >= 14
  395. assert(std::is_permutation(forward_iterator<const int*>(ia),
  396. forward_iterator<const int*>(ia + sa),
  397. forward_iterator<const int*>(ib),
  398. forward_iterator<const int*>(ib + sa),
  399. std::equal_to<const int>()) == false);
  400. #endif
  401. }
  402. {
  403. const int ia[] = {0, 0, 0};
  404. const int ib[] = {1, 1, 0};
  405. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  406. assert(std::is_permutation(forward_iterator<const int*>(ia),
  407. forward_iterator<const int*>(ia + sa),
  408. forward_iterator<const int*>(ib),
  409. std::equal_to<const int>()) == false);
  410. #if TEST_STD_VER >= 14
  411. assert(std::is_permutation(forward_iterator<const int*>(ia),
  412. forward_iterator<const int*>(ia + sa),
  413. forward_iterator<const int*>(ib),
  414. forward_iterator<const int*>(ib + sa),
  415. std::equal_to<const int>()) == false);
  416. #endif
  417. }
  418. {
  419. const int ia[] = {0, 0, 0};
  420. const int ib[] = {1, 1, 1};
  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),
  425. std::equal_to<const int>()) == 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),
  431. std::equal_to<const int>()) == false);
  432. #endif
  433. }
  434. {
  435. const int ia[] = {0, 0, 0};
  436. const int ib[] = {1, 1, 2};
  437. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  438. assert(std::is_permutation(forward_iterator<const int*>(ia),
  439. forward_iterator<const int*>(ia + sa),
  440. forward_iterator<const int*>(ib),
  441. std::equal_to<const int>()) == false);
  442. #if TEST_STD_VER >= 14
  443. assert(std::is_permutation(forward_iterator<const int*>(ia),
  444. forward_iterator<const int*>(ia + sa),
  445. forward_iterator<const int*>(ib),
  446. forward_iterator<const int*>(ib + sa),
  447. std::equal_to<const int>()) == false);
  448. #endif
  449. }
  450. {
  451. const int ia[] = {0, 0, 0};
  452. const int ib[] = {1, 2, 0};
  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),
  457. std::equal_to<const int>()) == 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),
  463. std::equal_to<const int>()) == false);
  464. #endif
  465. }
  466. {
  467. const int ia[] = {0, 0, 0};
  468. const int ib[] = {1, 2, 1};
  469. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  470. assert(std::is_permutation(forward_iterator<const int*>(ia),
  471. forward_iterator<const int*>(ia + sa),
  472. forward_iterator<const int*>(ib),
  473. std::equal_to<const int>()) == false);
  474. #if TEST_STD_VER >= 14
  475. assert(std::is_permutation(forward_iterator<const int*>(ia),
  476. forward_iterator<const int*>(ia + sa),
  477. forward_iterator<const int*>(ib),
  478. forward_iterator<const int*>(ib + sa),
  479. std::equal_to<const int>()) == false);
  480. #endif
  481. }
  482. {
  483. const int ia[] = {0, 0, 0};
  484. const int ib[] = {1, 2, 2};
  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),
  489. std::equal_to<const int>()) == false);
  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),
  495. std::equal_to<const int>()) == false);
  496. #endif
  497. }
  498. {
  499. const int ia[] = {0, 0, 1};
  500. const int ib[] = {1, 0, 0};
  501. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  502. assert(std::is_permutation(forward_iterator<const int*>(ia),
  503. forward_iterator<const int*>(ia + sa),
  504. forward_iterator<const int*>(ib),
  505. std::equal_to<const int>()) == true);
  506. #if TEST_STD_VER >= 14
  507. assert(std::is_permutation(forward_iterator<const int*>(ia),
  508. forward_iterator<const int*>(ia + sa),
  509. forward_iterator<const int*>(ib),
  510. forward_iterator<const int*>(ib + sa),
  511. std::equal_to<const int>()) == 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),
  516. std::equal_to<const int>()) == false);
  517. #endif
  518. }
  519. {
  520. const int ia[] = {0, 0, 1};
  521. const int ib[] = {1, 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),
  526. std::equal_to<const int>()) == false);
  527. #if TEST_STD_VER >= 14
  528. assert(std::is_permutation(forward_iterator<const int*>(ia),
  529. forward_iterator<const int*>(ia + sa),
  530. forward_iterator<const int*>(ib),
  531. forward_iterator<const int*>(ib + sa),
  532. std::equal_to<const int>()) == false);
  533. #endif
  534. }
  535. {
  536. const int ia[] = {0, 1, 2};
  537. const int ib[] = {1, 0, 2};
  538. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  539. assert(std::is_permutation(forward_iterator<const int*>(ia),
  540. forward_iterator<const int*>(ia + sa),
  541. forward_iterator<const int*>(ib),
  542. std::equal_to<const int>()) == true);
  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),
  548. std::equal_to<const int>()) == true);
  549. assert(std::is_permutation(forward_iterator<const int*>(ia),
  550. forward_iterator<const int*>(ia + sa),
  551. forward_iterator<const int*>(ib),
  552. forward_iterator<const int*>(ib + sa - 1),
  553. std::equal_to<const int>()) == false);
  554. #endif
  555. }
  556. {
  557. const int ia[] = {0, 1, 2};
  558. const int ib[] = {1, 2, 0};
  559. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  560. assert(std::is_permutation(forward_iterator<const int*>(ia),
  561. forward_iterator<const int*>(ia + sa),
  562. forward_iterator<const int*>(ib),
  563. std::equal_to<const int>()) == true);
  564. #if TEST_STD_VER >= 14
  565. assert(std::is_permutation(forward_iterator<const int*>(ia),
  566. forward_iterator<const int*>(ia + sa),
  567. forward_iterator<const int*>(ib),
  568. forward_iterator<const int*>(ib + sa),
  569. std::equal_to<const int>()) == true);
  570. assert(std::is_permutation(forward_iterator<const int*>(ia),
  571. forward_iterator<const int*>(ia + sa),
  572. forward_iterator<const int*>(ib),
  573. forward_iterator<const int*>(ib + sa - 1),
  574. std::equal_to<const int>()) == false);
  575. #endif
  576. }
  577. {
  578. const int ia[] = {0, 1, 2};
  579. const int ib[] = {2, 1, 0};
  580. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  581. assert(std::is_permutation(forward_iterator<const int*>(ia),
  582. forward_iterator<const int*>(ia + sa),
  583. forward_iterator<const int*>(ib),
  584. std::equal_to<const int>()) == true);
  585. #if TEST_STD_VER >= 14
  586. assert(std::is_permutation(forward_iterator<const int*>(ia),
  587. forward_iterator<const int*>(ia + sa),
  588. forward_iterator<const int*>(ib),
  589. forward_iterator<const int*>(ib + sa),
  590. std::equal_to<const int>()) == true);
  591. assert(std::is_permutation(forward_iterator<const int*>(ia),
  592. forward_iterator<const int*>(ia + sa),
  593. forward_iterator<const int*>(ib),
  594. forward_iterator<const int*>(ib + sa - 1),
  595. std::equal_to<const int>()) == false);
  596. #endif
  597. }
  598. {
  599. const int ia[] = {0, 1, 2};
  600. const int ib[] = {2, 0, 1};
  601. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  602. assert(std::is_permutation(forward_iterator<const int*>(ia),
  603. forward_iterator<const int*>(ia + sa),
  604. forward_iterator<const int*>(ib),
  605. std::equal_to<const int>()) == true);
  606. #if TEST_STD_VER >= 14
  607. assert(std::is_permutation(forward_iterator<const int*>(ia),
  608. forward_iterator<const int*>(ia + sa),
  609. forward_iterator<const int*>(ib),
  610. forward_iterator<const int*>(ib + sa),
  611. std::equal_to<const int>()) == true);
  612. assert(std::is_permutation(forward_iterator<const int*>(ia),
  613. forward_iterator<const int*>(ia + sa),
  614. forward_iterator<const int*>(ib),
  615. forward_iterator<const int*>(ib + sa - 1),
  616. std::equal_to<const int>()) == false);
  617. #endif
  618. }
  619. {
  620. const int ia[] = {0, 0, 1};
  621. const int ib[] = {1, 0, 1};
  622. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  623. assert(std::is_permutation(forward_iterator<const int*>(ia),
  624. forward_iterator<const int*>(ia + sa),
  625. forward_iterator<const int*>(ib),
  626. std::equal_to<const int>()) == false);
  627. #if TEST_STD_VER >= 14
  628. assert(std::is_permutation(forward_iterator<const int*>(ia),
  629. forward_iterator<const int*>(ia + sa),
  630. forward_iterator<const int*>(ib),
  631. forward_iterator<const int*>(ib + sa),
  632. std::equal_to<const int>()) == false);
  633. #endif
  634. }
  635. {
  636. const int ia[] = {0, 0, 1};
  637. const int ib[] = {1, 0, 0};
  638. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  639. assert(std::is_permutation(forward_iterator<const int*>(ia),
  640. forward_iterator<const int*>(ia + sa),
  641. forward_iterator<const int*>(ib),
  642. std::equal_to<const int>()) == true);
  643. #if TEST_STD_VER >= 14
  644. assert(std::is_permutation(forward_iterator<const int*>(ia),
  645. forward_iterator<const int*>(ia + sa),
  646. forward_iterator<const int*>(ib),
  647. forward_iterator<const int*>(ib + sa),
  648. std::equal_to<const int>()) == true);
  649. assert(std::is_permutation(forward_iterator<const int*>(ia),
  650. forward_iterator<const int*>(ia + sa),
  651. forward_iterator<const int*>(ib + 1),
  652. forward_iterator<const int*>(ib + sa),
  653. std::equal_to<const int>()) == false);
  654. assert(std::is_permutation(forward_iterator<const int*>(ia),
  655. forward_iterator<const int*>(ia + sa),
  656. forward_iterator<const int*>(ib),
  657. forward_iterator<const int*>(ib + sa - 1),
  658. std::equal_to<const int>()) == false);
  659. #endif
  660. }
  661. {
  662. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  663. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  664. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  665. assert(std::is_permutation(forward_iterator<const int*>(ia),
  666. forward_iterator<const int*>(ia + sa),
  667. forward_iterator<const int*>(ib),
  668. std::equal_to<const int>()) == true);
  669. #if TEST_STD_VER >= 14
  670. assert(std::is_permutation(forward_iterator<const int*>(ia),
  671. forward_iterator<const int*>(ia + sa),
  672. forward_iterator<const int*>(ib),
  673. forward_iterator<const int*>(ib + sa),
  674. std::equal_to<const int>()) == true);
  675. assert(std::is_permutation(forward_iterator<const int*>(ia),
  676. forward_iterator<const int*>(ia + sa),
  677. forward_iterator<const int*>(ib + 1),
  678. forward_iterator<const int*>(ib + sa),
  679. std::equal_to<const int>()) == false);
  680. assert(std::is_permutation(forward_iterator<const int*>(ia),
  681. forward_iterator<const int*>(ia + sa),
  682. forward_iterator<const int*>(ib),
  683. forward_iterator<const int*>(ib + sa - 1),
  684. std::equal_to<const int>()) == false);
  685. comparison_count = 0;
  686. assert(std::is_permutation(forward_iterator<const int*>(ia),
  687. forward_iterator<const int*>(ia + sa),
  688. forward_iterator<const int*>(ib),
  689. forward_iterator<const int*>(ib + sa - 1),
  690. counting_equals<const int>) == false);
  691. assert ( comparison_count > 0 );
  692. comparison_count = 0;
  693. assert(std::is_permutation(random_access_iterator<const int*>(ia),
  694. random_access_iterator<const int*>(ia + sa),
  695. random_access_iterator<const int*>(ib),
  696. random_access_iterator<const int*>(ib + sa - 1),
  697. counting_equals<const int>) == false);
  698. assert ( comparison_count == 0 );
  699. #endif
  700. }
  701. {
  702. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  703. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
  704. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  705. assert(std::is_permutation(forward_iterator<const int*>(ia),
  706. forward_iterator<const int*>(ia + sa),
  707. forward_iterator<const int*>(ib),
  708. std::equal_to<const int>()) == false);
  709. #if TEST_STD_VER >= 14
  710. assert(std::is_permutation(forward_iterator<const int*>(ia),
  711. forward_iterator<const int*>(ia + sa),
  712. forward_iterator<const int*>(ib),
  713. forward_iterator<const int*>(ib + sa),
  714. std::equal_to<const int>()) == false);
  715. #endif
  716. }
  717. }