is_permutation_pred.pass.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  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_iterators.h"
  18. #if _LIBCPP_STD_VER > 11
  19. #define HAS_FOUR_ITERATOR_VERSION
  20. #endif
  21. int comparison_count = 0;
  22. template <typename T>
  23. bool counting_equals ( const T &a, const T &b ) {
  24. ++comparison_count;
  25. return a == b;
  26. }
  27. int main()
  28. {
  29. {
  30. const int ia[] = {0};
  31. const int ib[] = {0};
  32. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  33. assert(std::is_permutation(forward_iterator<const int*>(ia),
  34. forward_iterator<const int*>(ia + 0),
  35. forward_iterator<const int*>(ib),
  36. std::equal_to<const int>()) == true);
  37. assert(std::is_permutation(forward_iterator<const int*>(ia),
  38. forward_iterator<const int*>(ia + sa),
  39. forward_iterator<const int*>(ib),
  40. std::equal_to<const int>()) == true);
  41. #ifdef HAS_FOUR_ITERATOR_VERSION
  42. assert(std::is_permutation(forward_iterator<const int*>(ia),
  43. forward_iterator<const int*>(ia + sa),
  44. forward_iterator<const int*>(ib),
  45. forward_iterator<const int*>(ib + sa),
  46. std::equal_to<const int>()) == true);
  47. assert(std::is_permutation(forward_iterator<const int*>(ia),
  48. forward_iterator<const int*>(ia + sa),
  49. forward_iterator<const int*>(ib),
  50. forward_iterator<const int*>(ib + sa - 1),
  51. std::equal_to<const int>()) == false);
  52. #endif
  53. }
  54. {
  55. const int ia[] = {0};
  56. const int ib[] = {1};
  57. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  58. assert(std::is_permutation(forward_iterator<const int*>(ia),
  59. forward_iterator<const int*>(ia + sa),
  60. forward_iterator<const int*>(ib),
  61. std::equal_to<const int>()) == false);
  62. #ifdef HAS_FOUR_ITERATOR_VERSION
  63. assert(std::is_permutation(forward_iterator<const int*>(ia),
  64. forward_iterator<const int*>(ia + sa),
  65. forward_iterator<const int*>(ib),
  66. forward_iterator<const int*>(ib + sa),
  67. std::equal_to<const int>()) == false);
  68. #endif
  69. }
  70. {
  71. const int ia[] = {0, 0};
  72. const int ib[] = {0, 0};
  73. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  74. assert(std::is_permutation(forward_iterator<const int*>(ia),
  75. forward_iterator<const int*>(ia + sa),
  76. forward_iterator<const int*>(ib),
  77. std::equal_to<const int>()) == true);
  78. #ifdef HAS_FOUR_ITERATOR_VERSION
  79. assert(std::is_permutation(forward_iterator<const int*>(ia),
  80. forward_iterator<const int*>(ia + sa),
  81. forward_iterator<const int*>(ib),
  82. forward_iterator<const int*>(ib + sa),
  83. std::equal_to<const int>()) == true);
  84. assert(std::is_permutation(forward_iterator<const int*>(ia),
  85. forward_iterator<const int*>(ia + sa),
  86. forward_iterator<const int*>(ib),
  87. forward_iterator<const int*>(ib + sa - 1),
  88. std::equal_to<const int>()) == false);
  89. #endif
  90. }
  91. {
  92. const int ia[] = {0, 0};
  93. const int ib[] = {0, 1};
  94. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  95. assert(std::is_permutation(forward_iterator<const int*>(ia),
  96. forward_iterator<const int*>(ia + sa),
  97. forward_iterator<const int*>(ib),
  98. std::equal_to<const int>()) == false);
  99. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  104. std::equal_to<const int>()) == 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),
  114. std::equal_to<const int>()) == false);
  115. #ifdef HAS_FOUR_ITERATOR_VERSION
  116. assert(std::is_permutation(forward_iterator<const int*>(ia),
  117. forward_iterator<const int*>(ia + sa),
  118. forward_iterator<const int*>(ib),
  119. forward_iterator<const int*>(ib + sa),
  120. std::equal_to<const int>()) == false);
  121. #endif
  122. }
  123. {
  124. const int ia[] = {0, 0};
  125. const int ib[] = {1, 1};
  126. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  127. assert(std::is_permutation(forward_iterator<const int*>(ia),
  128. forward_iterator<const int*>(ia + sa),
  129. forward_iterator<const int*>(ib),
  130. std::equal_to<const int>()) == false);
  131. #ifdef HAS_FOUR_ITERATOR_VERSION
  132. assert(std::is_permutation(forward_iterator<const int*>(ia),
  133. forward_iterator<const int*>(ia + sa),
  134. forward_iterator<const int*>(ib),
  135. forward_iterator<const int*>(ib + sa),
  136. std::equal_to<const int>()) == false);
  137. #endif
  138. }
  139. {
  140. const int ia[] = {0, 1};
  141. const int ib[] = {0, 0};
  142. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  143. assert(std::is_permutation(forward_iterator<const int*>(ia),
  144. forward_iterator<const int*>(ia + sa),
  145. forward_iterator<const int*>(ib),
  146. std::equal_to<const int>()) == false);
  147. #ifdef HAS_FOUR_ITERATOR_VERSION
  148. assert(std::is_permutation(forward_iterator<const int*>(ia),
  149. forward_iterator<const int*>(ia + sa),
  150. forward_iterator<const int*>(ib),
  151. forward_iterator<const int*>(ib + sa),
  152. std::equal_to<const int>()) == false);
  153. #endif
  154. }
  155. {
  156. const int ia[] = {0, 1};
  157. const int ib[] = {0, 1};
  158. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  159. assert(std::is_permutation(forward_iterator<const int*>(ia),
  160. forward_iterator<const int*>(ia + sa),
  161. forward_iterator<const int*>(ib),
  162. std::equal_to<const int>()) == true);
  163. #ifdef HAS_FOUR_ITERATOR_VERSION
  164. assert(std::is_permutation(forward_iterator<const int*>(ia),
  165. forward_iterator<const int*>(ia + sa),
  166. forward_iterator<const int*>(ib),
  167. forward_iterator<const int*>(ib + sa),
  168. std::equal_to<const int>()) == true);
  169. assert(std::is_permutation(forward_iterator<const int*>(ia),
  170. forward_iterator<const int*>(ia + sa),
  171. forward_iterator<const int*>(ib),
  172. forward_iterator<const int*>(ib + sa - 1),
  173. std::equal_to<const int>()) == false);
  174. #endif
  175. }
  176. {
  177. const int ia[] = {0, 1};
  178. const int ib[] = {1, 0};
  179. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  180. assert(std::is_permutation(forward_iterator<const int*>(ia),
  181. forward_iterator<const int*>(ia + sa),
  182. forward_iterator<const int*>(ib),
  183. std::equal_to<const int>()) == true);
  184. #ifdef HAS_FOUR_ITERATOR_VERSION
  185. assert(std::is_permutation(forward_iterator<const int*>(ia),
  186. forward_iterator<const int*>(ia + sa),
  187. forward_iterator<const int*>(ib),
  188. forward_iterator<const int*>(ib + sa),
  189. std::equal_to<const int>()) == true);
  190. assert(std::is_permutation(forward_iterator<const int*>(ia),
  191. forward_iterator<const int*>(ia + sa),
  192. forward_iterator<const int*>(ib),
  193. forward_iterator<const int*>(ib + sa - 1),
  194. std::equal_to<const int>()) == false);
  195. #endif
  196. }
  197. {
  198. const int ia[] = {0, 1};
  199. const int ib[] = {1, 1};
  200. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  201. assert(std::is_permutation(forward_iterator<const int*>(ia),
  202. forward_iterator<const int*>(ia + sa),
  203. forward_iterator<const int*>(ib),
  204. std::equal_to<const int>()) == false);
  205. #ifdef HAS_FOUR_ITERATOR_VERSION
  206. assert(std::is_permutation(forward_iterator<const int*>(ia),
  207. forward_iterator<const int*>(ia + sa),
  208. forward_iterator<const int*>(ib),
  209. forward_iterator<const int*>(ib + sa),
  210. std::equal_to<const int>()) == false);
  211. #endif
  212. }
  213. {
  214. const int ia[] = {1, 0};
  215. const int ib[] = {0, 0};
  216. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  217. assert(std::is_permutation(forward_iterator<const int*>(ia),
  218. forward_iterator<const int*>(ia + sa),
  219. forward_iterator<const int*>(ib),
  220. std::equal_to<const int>()) == false);
  221. #ifdef HAS_FOUR_ITERATOR_VERSION
  222. assert(std::is_permutation(forward_iterator<const int*>(ia),
  223. forward_iterator<const int*>(ia + sa),
  224. forward_iterator<const int*>(ib),
  225. forward_iterator<const int*>(ib + sa),
  226. std::equal_to<const int>()) == false);
  227. #endif
  228. }
  229. {
  230. const int ia[] = {1, 0};
  231. const int ib[] = {0, 1};
  232. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  233. assert(std::is_permutation(forward_iterator<const int*>(ia),
  234. forward_iterator<const int*>(ia + sa),
  235. forward_iterator<const int*>(ib),
  236. std::equal_to<const int>()) == true);
  237. #ifdef HAS_FOUR_ITERATOR_VERSION
  238. assert(std::is_permutation(forward_iterator<const int*>(ia),
  239. forward_iterator<const int*>(ia + sa),
  240. forward_iterator<const int*>(ib),
  241. forward_iterator<const int*>(ib + sa),
  242. std::equal_to<const int>()) == true);
  243. assert(std::is_permutation(forward_iterator<const int*>(ia),
  244. forward_iterator<const int*>(ia + sa),
  245. forward_iterator<const int*>(ib),
  246. forward_iterator<const int*>(ib + sa - 1),
  247. std::equal_to<const int>()) == false);
  248. #endif
  249. }
  250. {
  251. const int ia[] = {1, 0};
  252. const int ib[] = {1, 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),
  257. std::equal_to<const int>()) == true);
  258. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  263. std::equal_to<const int>()) == true);
  264. assert(std::is_permutation(forward_iterator<const int*>(ia),
  265. forward_iterator<const int*>(ia + sa),
  266. forward_iterator<const int*>(ib),
  267. forward_iterator<const int*>(ib + sa - 1),
  268. std::equal_to<const int>()) == false);
  269. #endif
  270. }
  271. {
  272. const int ia[] = {1, 0};
  273. const int ib[] = {1, 1};
  274. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  275. assert(std::is_permutation(forward_iterator<const int*>(ia),
  276. forward_iterator<const int*>(ia + sa),
  277. forward_iterator<const int*>(ib),
  278. std::equal_to<const int>()) == false);
  279. #ifdef HAS_FOUR_ITERATOR_VERSION
  280. assert(std::is_permutation(forward_iterator<const int*>(ia),
  281. forward_iterator<const int*>(ia + sa),
  282. forward_iterator<const int*>(ib),
  283. forward_iterator<const int*>(ib + sa),
  284. std::equal_to<const int>()) == false);
  285. #endif
  286. }
  287. {
  288. const int ia[] = {1, 1};
  289. const int ib[] = {0, 0};
  290. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  291. assert(std::is_permutation(forward_iterator<const int*>(ia),
  292. forward_iterator<const int*>(ia + sa),
  293. forward_iterator<const int*>(ib),
  294. std::equal_to<const int>()) == false);
  295. #ifdef HAS_FOUR_ITERATOR_VERSION
  296. assert(std::is_permutation(forward_iterator<const int*>(ia),
  297. forward_iterator<const int*>(ia + sa),
  298. forward_iterator<const int*>(ib),
  299. forward_iterator<const int*>(ib + sa),
  300. std::equal_to<const int>()) == false);
  301. #endif
  302. }
  303. {
  304. const int ia[] = {1, 1};
  305. const int ib[] = {0, 1};
  306. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  307. assert(std::is_permutation(forward_iterator<const int*>(ia),
  308. forward_iterator<const int*>(ia + sa),
  309. forward_iterator<const int*>(ib),
  310. std::equal_to<const int>()) == false);
  311. #ifdef HAS_FOUR_ITERATOR_VERSION
  312. assert(std::is_permutation(forward_iterator<const int*>(ia),
  313. forward_iterator<const int*>(ia + sa),
  314. forward_iterator<const int*>(ib),
  315. forward_iterator<const int*>(ib + sa),
  316. std::equal_to<const int>()) == false);
  317. #endif
  318. }
  319. {
  320. const int ia[] = {1, 1};
  321. const int ib[] = {1, 0};
  322. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  323. assert(std::is_permutation(forward_iterator<const int*>(ia),
  324. forward_iterator<const int*>(ia + sa),
  325. forward_iterator<const int*>(ib),
  326. std::equal_to<const int>()) == false);
  327. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  332. std::equal_to<const int>()) == false);
  333. #endif
  334. }
  335. {
  336. const int ia[] = {1, 1};
  337. const int ib[] = {1, 1};
  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),
  342. std::equal_to<const int>()) == true);
  343. #ifdef HAS_FOUR_ITERATOR_VERSION
  344. assert(std::is_permutation(forward_iterator<const int*>(ia),
  345. forward_iterator<const int*>(ia + sa),
  346. forward_iterator<const int*>(ib),
  347. forward_iterator<const int*>(ib + sa),
  348. std::equal_to<const int>()) == true);
  349. assert(std::is_permutation(forward_iterator<const int*>(ia),
  350. forward_iterator<const int*>(ia + sa),
  351. forward_iterator<const int*>(ib),
  352. forward_iterator<const int*>(ib + sa - 1),
  353. std::equal_to<const int>()) == false);
  354. #endif
  355. }
  356. {
  357. const int ia[] = {0, 0, 0};
  358. const int ib[] = {1, 0, 0};
  359. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  360. assert(std::is_permutation(forward_iterator<const int*>(ia),
  361. forward_iterator<const int*>(ia + sa),
  362. forward_iterator<const int*>(ib),
  363. std::equal_to<const int>()) == false);
  364. #ifdef HAS_FOUR_ITERATOR_VERSION
  365. assert(std::is_permutation(forward_iterator<const int*>(ia),
  366. forward_iterator<const int*>(ia + sa),
  367. forward_iterator<const int*>(ib),
  368. forward_iterator<const int*>(ib + sa),
  369. std::equal_to<const int>()) == false);
  370. #endif
  371. }
  372. {
  373. const int ia[] = {0, 0, 0};
  374. const int ib[] = {1, 0, 1};
  375. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  376. assert(std::is_permutation(forward_iterator<const int*>(ia),
  377. forward_iterator<const int*>(ia + sa),
  378. forward_iterator<const int*>(ib),
  379. std::equal_to<const int>()) == false);
  380. #ifdef HAS_FOUR_ITERATOR_VERSION
  381. assert(std::is_permutation(forward_iterator<const int*>(ia),
  382. forward_iterator<const int*>(ia + sa),
  383. forward_iterator<const int*>(ib),
  384. forward_iterator<const int*>(ib + sa),
  385. std::equal_to<const int>()) == false);
  386. #endif
  387. }
  388. {
  389. const int ia[] = {0, 0, 0};
  390. const int ib[] = {1, 0, 2};
  391. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  392. assert(std::is_permutation(forward_iterator<const int*>(ia),
  393. forward_iterator<const int*>(ia + sa),
  394. forward_iterator<const int*>(ib),
  395. std::equal_to<const int>()) == false);
  396. #ifdef HAS_FOUR_ITERATOR_VERSION
  397. assert(std::is_permutation(forward_iterator<const int*>(ia),
  398. forward_iterator<const int*>(ia + sa),
  399. forward_iterator<const int*>(ib),
  400. forward_iterator<const int*>(ib + sa),
  401. std::equal_to<const int>()) == false);
  402. #endif
  403. }
  404. {
  405. const int ia[] = {0, 0, 0};
  406. const int ib[] = {1, 1, 0};
  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),
  411. std::equal_to<const int>()) == false);
  412. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  417. std::equal_to<const int>()) == false);
  418. #endif
  419. }
  420. {
  421. const int ia[] = {0, 0, 0};
  422. const int ib[] = {1, 1, 1};
  423. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  424. assert(std::is_permutation(forward_iterator<const int*>(ia),
  425. forward_iterator<const int*>(ia + sa),
  426. forward_iterator<const int*>(ib),
  427. std::equal_to<const int>()) == false);
  428. #ifdef HAS_FOUR_ITERATOR_VERSION
  429. assert(std::is_permutation(forward_iterator<const int*>(ia),
  430. forward_iterator<const int*>(ia + sa),
  431. forward_iterator<const int*>(ib),
  432. forward_iterator<const int*>(ib + sa),
  433. std::equal_to<const int>()) == false);
  434. #endif
  435. }
  436. {
  437. const int ia[] = {0, 0, 0};
  438. const int ib[] = {1, 1, 2};
  439. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  440. assert(std::is_permutation(forward_iterator<const int*>(ia),
  441. forward_iterator<const int*>(ia + sa),
  442. forward_iterator<const int*>(ib),
  443. std::equal_to<const int>()) == false);
  444. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  449. std::equal_to<const int>()) == false);
  450. #endif
  451. }
  452. {
  453. const int ia[] = {0, 0, 0};
  454. const int ib[] = {1, 2, 0};
  455. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  456. assert(std::is_permutation(forward_iterator<const int*>(ia),
  457. forward_iterator<const int*>(ia + sa),
  458. forward_iterator<const int*>(ib),
  459. std::equal_to<const int>()) == false);
  460. #ifdef HAS_FOUR_ITERATOR_VERSION
  461. assert(std::is_permutation(forward_iterator<const int*>(ia),
  462. forward_iterator<const int*>(ia + sa),
  463. forward_iterator<const int*>(ib),
  464. forward_iterator<const int*>(ib + sa),
  465. std::equal_to<const int>()) == false);
  466. #endif
  467. }
  468. {
  469. const int ia[] = {0, 0, 0};
  470. const int ib[] = {1, 2, 1};
  471. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  472. assert(std::is_permutation(forward_iterator<const int*>(ia),
  473. forward_iterator<const int*>(ia + sa),
  474. forward_iterator<const int*>(ib),
  475. std::equal_to<const int>()) == false);
  476. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  481. std::equal_to<const int>()) == false);
  482. #endif
  483. }
  484. {
  485. const int ia[] = {0, 0, 0};
  486. const int ib[] = {1, 2, 2};
  487. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  488. assert(std::is_permutation(forward_iterator<const int*>(ia),
  489. forward_iterator<const int*>(ia + sa),
  490. forward_iterator<const int*>(ib),
  491. std::equal_to<const int>()) == false);
  492. #ifdef HAS_FOUR_ITERATOR_VERSION
  493. assert(std::is_permutation(forward_iterator<const int*>(ia),
  494. forward_iterator<const int*>(ia + sa),
  495. forward_iterator<const int*>(ib),
  496. forward_iterator<const int*>(ib + sa),
  497. std::equal_to<const int>()) == false);
  498. #endif
  499. }
  500. {
  501. const int ia[] = {0, 0, 1};
  502. const int ib[] = {1, 0, 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),
  507. std::equal_to<const int>()) == true);
  508. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  513. std::equal_to<const int>()) == true);
  514. assert(std::is_permutation(forward_iterator<const int*>(ia),
  515. forward_iterator<const int*>(ia + sa),
  516. forward_iterator<const int*>(ib),
  517. forward_iterator<const int*>(ib + sa - 1),
  518. std::equal_to<const int>()) == false);
  519. #endif
  520. }
  521. {
  522. const int ia[] = {0, 0, 1};
  523. const int ib[] = {1, 0, 1};
  524. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  525. assert(std::is_permutation(forward_iterator<const int*>(ia),
  526. forward_iterator<const int*>(ia + sa),
  527. forward_iterator<const int*>(ib),
  528. std::equal_to<const int>()) == false);
  529. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  534. std::equal_to<const int>()) == false);
  535. #endif
  536. }
  537. {
  538. const int ia[] = {0, 1, 2};
  539. const int ib[] = {1, 0, 2};
  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),
  544. std::equal_to<const int>()) == true);
  545. #ifdef HAS_FOUR_ITERATOR_VERSION
  546. assert(std::is_permutation(forward_iterator<const int*>(ia),
  547. forward_iterator<const int*>(ia + sa),
  548. forward_iterator<const int*>(ib),
  549. forward_iterator<const int*>(ib + sa),
  550. std::equal_to<const int>()) == true);
  551. assert(std::is_permutation(forward_iterator<const int*>(ia),
  552. forward_iterator<const int*>(ia + sa),
  553. forward_iterator<const int*>(ib),
  554. forward_iterator<const int*>(ib + sa - 1),
  555. std::equal_to<const int>()) == false);
  556. #endif
  557. }
  558. {
  559. const int ia[] = {0, 1, 2};
  560. const int ib[] = {1, 2, 0};
  561. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  562. assert(std::is_permutation(forward_iterator<const int*>(ia),
  563. forward_iterator<const int*>(ia + sa),
  564. forward_iterator<const int*>(ib),
  565. std::equal_to<const int>()) == true);
  566. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  571. std::equal_to<const int>()) == true);
  572. assert(std::is_permutation(forward_iterator<const int*>(ia),
  573. forward_iterator<const int*>(ia + sa),
  574. forward_iterator<const int*>(ib),
  575. forward_iterator<const int*>(ib + sa - 1),
  576. std::equal_to<const int>()) == false);
  577. #endif
  578. }
  579. {
  580. const int ia[] = {0, 1, 2};
  581. const int ib[] = {2, 1, 0};
  582. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  583. assert(std::is_permutation(forward_iterator<const int*>(ia),
  584. forward_iterator<const int*>(ia + sa),
  585. forward_iterator<const int*>(ib),
  586. std::equal_to<const int>()) == true);
  587. #ifdef HAS_FOUR_ITERATOR_VERSION
  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),
  592. std::equal_to<const int>()) == true);
  593. assert(std::is_permutation(forward_iterator<const int*>(ia),
  594. forward_iterator<const int*>(ia + sa),
  595. forward_iterator<const int*>(ib),
  596. forward_iterator<const int*>(ib + sa - 1),
  597. std::equal_to<const int>()) == false);
  598. #endif
  599. }
  600. {
  601. const int ia[] = {0, 1, 2};
  602. const int ib[] = {2, 0, 1};
  603. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  604. assert(std::is_permutation(forward_iterator<const int*>(ia),
  605. forward_iterator<const int*>(ia + sa),
  606. forward_iterator<const int*>(ib),
  607. std::equal_to<const int>()) == true);
  608. #ifdef HAS_FOUR_ITERATOR_VERSION
  609. assert(std::is_permutation(forward_iterator<const int*>(ia),
  610. forward_iterator<const int*>(ia + sa),
  611. forward_iterator<const int*>(ib),
  612. forward_iterator<const int*>(ib + sa),
  613. std::equal_to<const int>()) == true);
  614. assert(std::is_permutation(forward_iterator<const int*>(ia),
  615. forward_iterator<const int*>(ia + sa),
  616. forward_iterator<const int*>(ib),
  617. forward_iterator<const int*>(ib + sa - 1),
  618. std::equal_to<const int>()) == false);
  619. #endif
  620. }
  621. {
  622. const int ia[] = {0, 0, 1};
  623. const int ib[] = {1, 0, 1};
  624. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  625. assert(std::is_permutation(forward_iterator<const int*>(ia),
  626. forward_iterator<const int*>(ia + sa),
  627. forward_iterator<const int*>(ib),
  628. std::equal_to<const int>()) == false);
  629. #ifdef HAS_FOUR_ITERATOR_VERSION
  630. assert(std::is_permutation(forward_iterator<const int*>(ia),
  631. forward_iterator<const int*>(ia + sa),
  632. forward_iterator<const int*>(ib),
  633. forward_iterator<const int*>(ib + sa),
  634. std::equal_to<const int>()) == false);
  635. #endif
  636. }
  637. {
  638. const int ia[] = {0, 0, 1};
  639. const int ib[] = {1, 0, 0};
  640. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  641. assert(std::is_permutation(forward_iterator<const int*>(ia),
  642. forward_iterator<const int*>(ia + sa),
  643. forward_iterator<const int*>(ib),
  644. std::equal_to<const int>()) == true);
  645. #ifdef HAS_FOUR_ITERATOR_VERSION
  646. assert(std::is_permutation(forward_iterator<const int*>(ia),
  647. forward_iterator<const int*>(ia + sa),
  648. forward_iterator<const int*>(ib),
  649. forward_iterator<const int*>(ib + sa),
  650. std::equal_to<const int>()) == true);
  651. assert(std::is_permutation(forward_iterator<const int*>(ia),
  652. forward_iterator<const int*>(ia + sa),
  653. forward_iterator<const int*>(ib + 1),
  654. forward_iterator<const int*>(ib + sa),
  655. std::equal_to<const int>()) == false);
  656. assert(std::is_permutation(forward_iterator<const int*>(ia),
  657. forward_iterator<const int*>(ia + sa),
  658. forward_iterator<const int*>(ib),
  659. forward_iterator<const int*>(ib + sa - 1),
  660. std::equal_to<const int>()) == false);
  661. #endif
  662. }
  663. {
  664. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  665. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  666. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  667. assert(std::is_permutation(forward_iterator<const int*>(ia),
  668. forward_iterator<const int*>(ia + sa),
  669. forward_iterator<const int*>(ib),
  670. std::equal_to<const int>()) == true);
  671. #ifdef HAS_FOUR_ITERATOR_VERSION
  672. assert(std::is_permutation(forward_iterator<const int*>(ia),
  673. forward_iterator<const int*>(ia + sa),
  674. forward_iterator<const int*>(ib),
  675. forward_iterator<const int*>(ib + sa),
  676. std::equal_to<const int>()) == true);
  677. assert(std::is_permutation(forward_iterator<const int*>(ia),
  678. forward_iterator<const int*>(ia + sa),
  679. forward_iterator<const int*>(ib + 1),
  680. forward_iterator<const int*>(ib + sa),
  681. std::equal_to<const int>()) == false);
  682. assert(std::is_permutation(forward_iterator<const int*>(ia),
  683. forward_iterator<const int*>(ia + sa),
  684. forward_iterator<const int*>(ib),
  685. forward_iterator<const int*>(ib + sa - 1),
  686. std::equal_to<const int>()) == false);
  687. comparison_count = 0;
  688. assert(std::is_permutation(forward_iterator<const int*>(ia),
  689. forward_iterator<const int*>(ia + sa),
  690. forward_iterator<const int*>(ib),
  691. forward_iterator<const int*>(ib + sa - 1),
  692. counting_equals<const int>) == false);
  693. assert ( comparison_count > 0 );
  694. comparison_count = 0;
  695. assert(std::is_permutation(random_access_iterator<const int*>(ia),
  696. random_access_iterator<const int*>(ia + sa),
  697. random_access_iterator<const int*>(ib),
  698. random_access_iterator<const int*>(ib + sa - 1),
  699. counting_equals<const int>) == false);
  700. assert ( comparison_count == 0 );
  701. #endif
  702. }
  703. {
  704. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  705. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
  706. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  707. assert(std::is_permutation(forward_iterator<const int*>(ia),
  708. forward_iterator<const int*>(ia + sa),
  709. forward_iterator<const int*>(ib),
  710. std::equal_to<const int>()) == false);
  711. #ifdef HAS_FOUR_ITERATOR_VERSION
  712. assert(std::is_permutation(forward_iterator<const int*>(ia),
  713. forward_iterator<const int*>(ia + sa),
  714. forward_iterator<const int*>(ib),
  715. forward_iterator<const int*>(ib + sa),
  716. std::equal_to<const int>()) == false);
  717. #endif
  718. }
  719. }