is_permutation.cpp 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. // Range v3 library
  2. //
  3. // Copyright Eric Niebler 2014-present
  4. //
  5. // Use, modification and distribution is subject to the
  6. // Boost Software License, Version 1.0. (See accompanying
  7. // file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Project home: https://github.com/ericniebler/range-v3
  11. //
  12. // Copyright 2005 - 2007 Adobe Systems Incorporated
  13. // Distributed under the MIT License(see accompanying file LICENSE_1_0_0.txt
  14. // or a copy at http://stlab.adobe.com/licenses.html)
  15. //===----------------------------------------------------------------------===//
  16. //
  17. // The LLVM Compiler Infrastructure
  18. //
  19. // This file is dual licensed under the MIT and the University of Illinois Open
  20. // Source Licenses. See LICENSE.TXT for details.
  21. //
  22. //===----------------------------------------------------------------------===//
  23. #include <utility>
  24. #include <range/v3/core.hpp>
  25. #include <range/v3/algorithm/permutation.hpp>
  26. #include "../simple_test.hpp"
  27. #include "../test_utils.hpp"
  28. #include "../test_iterators.hpp"
  29. RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
  30. int comparison_count = 0;
  31. template<typename T>
  32. bool counting_equals( T const &a, T const &b )
  33. {
  34. ++comparison_count;
  35. return a == b;
  36. }
  37. struct S
  38. {
  39. int i;
  40. };
  41. struct T
  42. {
  43. int i;
  44. };
  45. int main()
  46. {
  47. {
  48. const int ia[] = {0};
  49. const int ib[] = {0};
  50. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  51. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  52. ForwardIterator<const int*>(ia + 0),
  53. ForwardIterator<const int*>(ib),
  54. std::equal_to<const int>()) == true);
  55. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  56. ForwardIterator<const int*>(ia + sa),
  57. ForwardIterator<const int*>(ib),
  58. std::equal_to<const int>()) == true);
  59. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  60. ForwardIterator<const int*>(ia + sa),
  61. ForwardIterator<const int*>(ib),
  62. ForwardIterator<const int*>(ib + sa),
  63. std::equal_to<const int>()) == true);
  64. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  65. ForwardIterator<const int*>(ia + sa),
  66. ForwardIterator<const int*>(ib),
  67. ForwardIterator<const int*>(ib + sa - 1),
  68. std::equal_to<const int>()) == false);
  69. }
  70. {
  71. const int ia[] = {0};
  72. const int ib[] = {1};
  73. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  74. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  75. ForwardIterator<const int*>(ia + sa),
  76. ForwardIterator<const int*>(ib),
  77. std::equal_to<const int>()) == false);
  78. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  79. ForwardIterator<const int*>(ia + sa),
  80. ForwardIterator<const int*>(ib),
  81. ForwardIterator<const int*>(ib + sa),
  82. std::equal_to<const int>()) == false);
  83. }
  84. {
  85. const int ia[] = {0, 0};
  86. const int ib[] = {0, 0};
  87. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  88. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  89. ForwardIterator<const int*>(ia + sa),
  90. ForwardIterator<const int*>(ib),
  91. std::equal_to<const int>()) == true);
  92. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  93. ForwardIterator<const int*>(ia + sa),
  94. ForwardIterator<const int*>(ib),
  95. ForwardIterator<const int*>(ib + sa),
  96. std::equal_to<const int>()) == true);
  97. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  98. ForwardIterator<const int*>(ia + sa),
  99. ForwardIterator<const int*>(ib),
  100. ForwardIterator<const int*>(ib + sa - 1),
  101. std::equal_to<const int>()) == false);
  102. }
  103. {
  104. const int ia[] = {0, 0};
  105. const int ib[] = {0, 1};
  106. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  107. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  108. ForwardIterator<const int*>(ia + sa),
  109. ForwardIterator<const int*>(ib),
  110. std::equal_to<const int>()) == false);
  111. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  112. ForwardIterator<const int*>(ia + sa),
  113. ForwardIterator<const int*>(ib),
  114. ForwardIterator<const int*>(ib + sa),
  115. std::equal_to<const int>()) == false);
  116. }
  117. {
  118. const int ia[] = {0, 0};
  119. const int ib[] = {1, 0};
  120. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  121. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  122. ForwardIterator<const int*>(ia + sa),
  123. ForwardIterator<const int*>(ib),
  124. std::equal_to<const int>()) == false);
  125. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  126. ForwardIterator<const int*>(ia + sa),
  127. ForwardIterator<const int*>(ib),
  128. ForwardIterator<const int*>(ib + sa),
  129. std::equal_to<const int>()) == false);
  130. }
  131. {
  132. const int ia[] = {0, 0};
  133. const int ib[] = {1, 1};
  134. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  135. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  136. ForwardIterator<const int*>(ia + sa),
  137. ForwardIterator<const int*>(ib),
  138. std::equal_to<const int>()) == false);
  139. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  140. ForwardIterator<const int*>(ia + sa),
  141. ForwardIterator<const int*>(ib),
  142. ForwardIterator<const int*>(ib + sa),
  143. std::equal_to<const int>()) == false);
  144. }
  145. {
  146. const int ia[] = {0, 1};
  147. const int ib[] = {0, 0};
  148. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  149. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  150. ForwardIterator<const int*>(ia + sa),
  151. ForwardIterator<const int*>(ib),
  152. std::equal_to<const int>()) == false);
  153. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  154. ForwardIterator<const int*>(ia + sa),
  155. ForwardIterator<const int*>(ib),
  156. ForwardIterator<const int*>(ib + sa),
  157. std::equal_to<const int>()) == false);
  158. }
  159. {
  160. const int ia[] = {0, 1};
  161. const int ib[] = {0, 1};
  162. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  163. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  164. ForwardIterator<const int*>(ia + sa),
  165. ForwardIterator<const int*>(ib),
  166. std::equal_to<const int>()) == true);
  167. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  168. ForwardIterator<const int*>(ia + sa),
  169. ForwardIterator<const int*>(ib),
  170. ForwardIterator<const int*>(ib + sa),
  171. std::equal_to<const int>()) == true);
  172. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  173. ForwardIterator<const int*>(ia + sa),
  174. ForwardIterator<const int*>(ib),
  175. ForwardIterator<const int*>(ib + sa - 1),
  176. std::equal_to<const int>()) == false);
  177. }
  178. {
  179. const int ia[] = {0, 1};
  180. const int ib[] = {1, 0};
  181. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  182. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  183. ForwardIterator<const int*>(ia + sa),
  184. ForwardIterator<const int*>(ib),
  185. std::equal_to<const int>()) == true);
  186. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  187. ForwardIterator<const int*>(ia + sa),
  188. ForwardIterator<const int*>(ib),
  189. ForwardIterator<const int*>(ib + sa),
  190. std::equal_to<const int>()) == true);
  191. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  192. ForwardIterator<const int*>(ia + sa),
  193. ForwardIterator<const int*>(ib),
  194. ForwardIterator<const int*>(ib + sa - 1),
  195. std::equal_to<const int>()) == false);
  196. }
  197. {
  198. const int ia[] = {0, 1};
  199. const int ib[] = {1, 1};
  200. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  201. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  202. ForwardIterator<const int*>(ia + sa),
  203. ForwardIterator<const int*>(ib),
  204. std::equal_to<const int>()) == false);
  205. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  206. ForwardIterator<const int*>(ia + sa),
  207. ForwardIterator<const int*>(ib),
  208. ForwardIterator<const int*>(ib + sa),
  209. std::equal_to<const int>()) == false);
  210. }
  211. {
  212. const int ia[] = {1, 0};
  213. const int ib[] = {0, 0};
  214. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  215. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  216. ForwardIterator<const int*>(ia + sa),
  217. ForwardIterator<const int*>(ib),
  218. std::equal_to<const int>()) == false);
  219. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  220. ForwardIterator<const int*>(ia + sa),
  221. ForwardIterator<const int*>(ib),
  222. ForwardIterator<const int*>(ib + sa),
  223. std::equal_to<const int>()) == false);
  224. }
  225. {
  226. const int ia[] = {1, 0};
  227. const int ib[] = {0, 1};
  228. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  229. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  230. ForwardIterator<const int*>(ia + sa),
  231. ForwardIterator<const int*>(ib),
  232. std::equal_to<const int>()) == true);
  233. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  234. ForwardIterator<const int*>(ia + sa),
  235. ForwardIterator<const int*>(ib),
  236. ForwardIterator<const int*>(ib + sa),
  237. std::equal_to<const int>()) == true);
  238. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  239. ForwardIterator<const int*>(ia + sa),
  240. ForwardIterator<const int*>(ib),
  241. ForwardIterator<const int*>(ib + sa - 1),
  242. std::equal_to<const int>()) == false);
  243. }
  244. {
  245. const int ia[] = {1, 0};
  246. const int ib[] = {1, 0};
  247. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  248. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  249. ForwardIterator<const int*>(ia + sa),
  250. ForwardIterator<const int*>(ib),
  251. std::equal_to<const int>()) == true);
  252. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  253. ForwardIterator<const int*>(ia + sa),
  254. ForwardIterator<const int*>(ib),
  255. ForwardIterator<const int*>(ib + sa),
  256. std::equal_to<const int>()) == true);
  257. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  258. ForwardIterator<const int*>(ia + sa),
  259. ForwardIterator<const int*>(ib),
  260. ForwardIterator<const int*>(ib + sa - 1),
  261. std::equal_to<const int>()) == false);
  262. }
  263. {
  264. const int ia[] = {1, 0};
  265. const int ib[] = {1, 1};
  266. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  267. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  268. ForwardIterator<const int*>(ia + sa),
  269. ForwardIterator<const int*>(ib),
  270. std::equal_to<const int>()) == false);
  271. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  272. ForwardIterator<const int*>(ia + sa),
  273. ForwardIterator<const int*>(ib),
  274. ForwardIterator<const int*>(ib + sa),
  275. std::equal_to<const int>()) == false);
  276. }
  277. {
  278. const int ia[] = {1, 1};
  279. const int ib[] = {0, 0};
  280. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  281. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  282. ForwardIterator<const int*>(ia + sa),
  283. ForwardIterator<const int*>(ib),
  284. std::equal_to<const int>()) == false);
  285. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  286. ForwardIterator<const int*>(ia + sa),
  287. ForwardIterator<const int*>(ib),
  288. ForwardIterator<const int*>(ib + sa),
  289. std::equal_to<const int>()) == false);
  290. }
  291. {
  292. const int ia[] = {1, 1};
  293. const int ib[] = {0, 1};
  294. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  295. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  296. ForwardIterator<const int*>(ia + sa),
  297. ForwardIterator<const int*>(ib),
  298. std::equal_to<const int>()) == false);
  299. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  300. ForwardIterator<const int*>(ia + sa),
  301. ForwardIterator<const int*>(ib),
  302. ForwardIterator<const int*>(ib + sa),
  303. std::equal_to<const int>()) == false);
  304. }
  305. {
  306. const int ia[] = {1, 1};
  307. const int ib[] = {1, 0};
  308. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  309. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  310. ForwardIterator<const int*>(ia + sa),
  311. ForwardIterator<const int*>(ib),
  312. std::equal_to<const int>()) == false);
  313. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  314. ForwardIterator<const int*>(ia + sa),
  315. ForwardIterator<const int*>(ib),
  316. ForwardIterator<const int*>(ib + sa),
  317. std::equal_to<const int>()) == false);
  318. }
  319. {
  320. const int ia[] = {1, 1};
  321. const int ib[] = {1, 1};
  322. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  323. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  324. ForwardIterator<const int*>(ia + sa),
  325. ForwardIterator<const int*>(ib),
  326. std::equal_to<const int>()) == true);
  327. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  328. ForwardIterator<const int*>(ia + sa),
  329. ForwardIterator<const int*>(ib),
  330. ForwardIterator<const int*>(ib + sa),
  331. std::equal_to<const int>()) == true);
  332. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  333. ForwardIterator<const int*>(ia + sa),
  334. ForwardIterator<const int*>(ib),
  335. ForwardIterator<const int*>(ib + sa - 1),
  336. std::equal_to<const int>()) == false);
  337. }
  338. {
  339. const int ia[] = {0, 0, 0};
  340. const int ib[] = {1, 0, 0};
  341. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  342. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  343. ForwardIterator<const int*>(ia + sa),
  344. ForwardIterator<const int*>(ib),
  345. std::equal_to<const int>()) == false);
  346. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  347. ForwardIterator<const int*>(ia + sa),
  348. ForwardIterator<const int*>(ib),
  349. ForwardIterator<const int*>(ib + sa),
  350. std::equal_to<const int>()) == false);
  351. }
  352. {
  353. const int ia[] = {0, 0, 0};
  354. const int ib[] = {1, 0, 1};
  355. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  356. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  357. ForwardIterator<const int*>(ia + sa),
  358. ForwardIterator<const int*>(ib),
  359. std::equal_to<const int>()) == false);
  360. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  361. ForwardIterator<const int*>(ia + sa),
  362. ForwardIterator<const int*>(ib),
  363. ForwardIterator<const int*>(ib + sa),
  364. std::equal_to<const int>()) == false);
  365. }
  366. {
  367. const int ia[] = {0, 0, 0};
  368. const int ib[] = {1, 0, 2};
  369. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  370. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  371. ForwardIterator<const int*>(ia + sa),
  372. ForwardIterator<const int*>(ib),
  373. std::equal_to<const int>()) == false);
  374. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  375. ForwardIterator<const int*>(ia + sa),
  376. ForwardIterator<const int*>(ib),
  377. ForwardIterator<const int*>(ib + sa),
  378. std::equal_to<const int>()) == false);
  379. }
  380. {
  381. const int ia[] = {0, 0, 0};
  382. const int ib[] = {1, 1, 0};
  383. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  384. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  385. ForwardIterator<const int*>(ia + sa),
  386. ForwardIterator<const int*>(ib),
  387. std::equal_to<const int>()) == false);
  388. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  389. ForwardIterator<const int*>(ia + sa),
  390. ForwardIterator<const int*>(ib),
  391. ForwardIterator<const int*>(ib + sa),
  392. std::equal_to<const int>()) == false);
  393. }
  394. {
  395. const int ia[] = {0, 0, 0};
  396. const int ib[] = {1, 1, 1};
  397. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  398. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  399. ForwardIterator<const int*>(ia + sa),
  400. ForwardIterator<const int*>(ib),
  401. std::equal_to<const int>()) == false);
  402. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  403. ForwardIterator<const int*>(ia + sa),
  404. ForwardIterator<const int*>(ib),
  405. ForwardIterator<const int*>(ib + sa),
  406. std::equal_to<const int>()) == false);
  407. }
  408. {
  409. const int ia[] = {0, 0, 0};
  410. const int ib[] = {1, 1, 2};
  411. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  412. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  413. ForwardIterator<const int*>(ia + sa),
  414. ForwardIterator<const int*>(ib),
  415. std::equal_to<const int>()) == false);
  416. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  417. ForwardIterator<const int*>(ia + sa),
  418. ForwardIterator<const int*>(ib),
  419. ForwardIterator<const int*>(ib + sa),
  420. std::equal_to<const int>()) == false);
  421. }
  422. {
  423. const int ia[] = {0, 0, 0};
  424. const int ib[] = {1, 2, 0};
  425. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  426. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  427. ForwardIterator<const int*>(ia + sa),
  428. ForwardIterator<const int*>(ib),
  429. std::equal_to<const int>()) == false);
  430. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  431. ForwardIterator<const int*>(ia + sa),
  432. ForwardIterator<const int*>(ib),
  433. ForwardIterator<const int*>(ib + sa),
  434. std::equal_to<const int>()) == false);
  435. }
  436. {
  437. const int ia[] = {0, 0, 0};
  438. const int ib[] = {1, 2, 1};
  439. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  440. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  441. ForwardIterator<const int*>(ia + sa),
  442. ForwardIterator<const int*>(ib),
  443. std::equal_to<const int>()) == false);
  444. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  445. ForwardIterator<const int*>(ia + sa),
  446. ForwardIterator<const int*>(ib),
  447. ForwardIterator<const int*>(ib + sa),
  448. std::equal_to<const int>()) == false);
  449. }
  450. {
  451. const int ia[] = {0, 0, 0};
  452. const int ib[] = {1, 2, 2};
  453. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  454. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  455. ForwardIterator<const int*>(ia + sa),
  456. ForwardIterator<const int*>(ib),
  457. std::equal_to<const int>()) == false);
  458. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  459. ForwardIterator<const int*>(ia + sa),
  460. ForwardIterator<const int*>(ib),
  461. ForwardIterator<const int*>(ib + sa),
  462. std::equal_to<const int>()) == false);
  463. }
  464. {
  465. const int ia[] = {0, 0, 1};
  466. const int ib[] = {1, 0, 0};
  467. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  468. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  469. ForwardIterator<const int*>(ia + sa),
  470. ForwardIterator<const int*>(ib),
  471. std::equal_to<const int>()) == true);
  472. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  473. ForwardIterator<const int*>(ia + sa),
  474. ForwardIterator<const int*>(ib),
  475. ForwardIterator<const int*>(ib + sa),
  476. std::equal_to<const int>()) == true);
  477. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  478. ForwardIterator<const int*>(ia + sa),
  479. ForwardIterator<const int*>(ib),
  480. ForwardIterator<const int*>(ib + sa - 1),
  481. std::equal_to<const int>()) == false);
  482. }
  483. {
  484. const int ia[] = {0, 0, 1};
  485. const int ib[] = {1, 0, 1};
  486. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  487. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  488. ForwardIterator<const int*>(ia + sa),
  489. ForwardIterator<const int*>(ib),
  490. std::equal_to<const int>()) == false);
  491. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  492. ForwardIterator<const int*>(ia + sa),
  493. ForwardIterator<const int*>(ib),
  494. ForwardIterator<const int*>(ib + sa),
  495. std::equal_to<const int>()) == false);
  496. }
  497. {
  498. const int ia[] = {0, 1, 2};
  499. const int ib[] = {1, 0, 2};
  500. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  501. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  502. ForwardIterator<const int*>(ia + sa),
  503. ForwardIterator<const int*>(ib),
  504. std::equal_to<const int>()) == true);
  505. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  506. ForwardIterator<const int*>(ia + sa),
  507. ForwardIterator<const int*>(ib),
  508. ForwardIterator<const int*>(ib + sa),
  509. std::equal_to<const int>()) == true);
  510. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  511. ForwardIterator<const int*>(ia + sa),
  512. ForwardIterator<const int*>(ib),
  513. ForwardIterator<const int*>(ib + sa - 1),
  514. std::equal_to<const int>()) == false);
  515. }
  516. {
  517. const int ia[] = {0, 1, 2};
  518. const int ib[] = {1, 2, 0};
  519. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  520. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  521. ForwardIterator<const int*>(ia + sa),
  522. ForwardIterator<const int*>(ib),
  523. std::equal_to<const int>()) == true);
  524. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  525. ForwardIterator<const int*>(ia + sa),
  526. ForwardIterator<const int*>(ib),
  527. ForwardIterator<const int*>(ib + sa),
  528. std::equal_to<const int>()) == true);
  529. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  530. ForwardIterator<const int*>(ia + sa),
  531. ForwardIterator<const int*>(ib),
  532. ForwardIterator<const int*>(ib + sa - 1),
  533. std::equal_to<const int>()) == false);
  534. }
  535. {
  536. const int ia[] = {0, 1, 2};
  537. const int ib[] = {2, 1, 0};
  538. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  539. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  540. ForwardIterator<const int*>(ia + sa),
  541. ForwardIterator<const int*>(ib),
  542. std::equal_to<const int>()) == true);
  543. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  544. ForwardIterator<const int*>(ia + sa),
  545. ForwardIterator<const int*>(ib),
  546. ForwardIterator<const int*>(ib + sa),
  547. std::equal_to<const int>()) == true);
  548. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  549. ForwardIterator<const int*>(ia + sa),
  550. ForwardIterator<const int*>(ib),
  551. ForwardIterator<const int*>(ib + sa - 1),
  552. std::equal_to<const int>()) == false);
  553. }
  554. {
  555. const int ia[] = {0, 1, 2};
  556. const int ib[] = {2, 0, 1};
  557. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  558. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  559. ForwardIterator<const int*>(ia + sa),
  560. ForwardIterator<const int*>(ib),
  561. std::equal_to<const int>()) == true);
  562. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  563. ForwardIterator<const int*>(ia + sa),
  564. ForwardIterator<const int*>(ib),
  565. ForwardIterator<const int*>(ib + sa),
  566. std::equal_to<const int>()) == true);
  567. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  568. ForwardIterator<const int*>(ia + sa),
  569. ForwardIterator<const int*>(ib),
  570. ForwardIterator<const int*>(ib + sa - 1),
  571. std::equal_to<const int>()) == false);
  572. }
  573. {
  574. const int ia[] = {0, 0, 1};
  575. const int ib[] = {1, 0, 1};
  576. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  577. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  578. ForwardIterator<const int*>(ia + sa),
  579. ForwardIterator<const int*>(ib),
  580. std::equal_to<const int>()) == false);
  581. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  582. ForwardIterator<const int*>(ia + sa),
  583. ForwardIterator<const int*>(ib),
  584. ForwardIterator<const int*>(ib + sa),
  585. std::equal_to<const int>()) == false);
  586. }
  587. {
  588. const int ia[] = {0, 0, 1};
  589. const int ib[] = {1, 0, 0};
  590. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  591. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  592. ForwardIterator<const int*>(ia + sa),
  593. ForwardIterator<const int*>(ib),
  594. std::equal_to<const int>()) == true);
  595. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  596. ForwardIterator<const int*>(ia + sa),
  597. ForwardIterator<const int*>(ib),
  598. ForwardIterator<const int*>(ib + sa),
  599. std::equal_to<const int>()) == true);
  600. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  601. ForwardIterator<const int*>(ia + sa),
  602. ForwardIterator<const int*>(ib + 1),
  603. ForwardIterator<const int*>(ib + sa),
  604. std::equal_to<const int>()) == false);
  605. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  606. ForwardIterator<const int*>(ia + sa),
  607. ForwardIterator<const int*>(ib),
  608. ForwardIterator<const int*>(ib + sa - 1),
  609. std::equal_to<const int>()) == false);
  610. }
  611. {
  612. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  613. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  614. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  615. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  616. ForwardIterator<const int*>(ia + sa),
  617. ForwardIterator<const int*>(ib),
  618. std::equal_to<const int>()) == true);
  619. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  620. ForwardIterator<const int*>(ia + sa),
  621. ForwardIterator<const int*>(ib),
  622. ForwardIterator<const int*>(ib + sa),
  623. std::equal_to<const int>()) == true);
  624. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  625. ForwardIterator<const int*>(ia + sa),
  626. ForwardIterator<const int*>(ib + 1),
  627. ForwardIterator<const int*>(ib + sa),
  628. std::equal_to<const int>()) == false);
  629. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  630. ForwardIterator<const int*>(ia + sa),
  631. ForwardIterator<const int*>(ib),
  632. ForwardIterator<const int*>(ib + sa - 1),
  633. std::equal_to<const int>()) == false);
  634. comparison_count = 0;
  635. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  636. ForwardIterator<const int*>(ia + sa),
  637. ForwardIterator<const int*>(ib),
  638. ForwardIterator<const int*>(ib + sa - 1),
  639. counting_equals<const int>) == false);
  640. CHECK( comparison_count > 0 );
  641. comparison_count = 0;
  642. CHECK(ranges::is_permutation(RandomAccessIterator<const int*>(ia),
  643. RandomAccessIterator<const int*>(ia + sa),
  644. RandomAccessIterator<const int*>(ib),
  645. RandomAccessIterator<const int*>(ib + sa - 1),
  646. counting_equals<const int>) == false);
  647. CHECK ( comparison_count == 0 );
  648. }
  649. {
  650. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  651. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 0};
  652. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  653. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  654. ForwardIterator<const int*>(ia + sa),
  655. ForwardIterator<const int*>(ib),
  656. std::equal_to<const int>()) == false);
  657. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  658. ForwardIterator<const int*>(ia + sa),
  659. ForwardIterator<const int*>(ib),
  660. ForwardIterator<const int*>(ib + sa),
  661. std::equal_to<const int>()) == false);
  662. }
  663. // Iterator tests, without predicate:
  664. {
  665. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  666. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  667. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  668. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  669. ForwardIterator<const int*>(ia + sa),
  670. ForwardIterator<const int*>(ib)) == true);
  671. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  672. ForwardIterator<const int*>(ia + sa),
  673. ForwardIterator<const int*>(ib),
  674. ForwardIterator<const int*>(ib + sa)) == true);
  675. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  676. ForwardIterator<const int*>(ia + sa),
  677. ForwardIterator<const int*>(ib + 1),
  678. ForwardIterator<const int*>(ib + sa)) == false);
  679. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  680. ForwardIterator<const int*>(ia + sa),
  681. ForwardIterator<const int*>(ib),
  682. ForwardIterator<const int*>(ib + sa - 1)) == false);
  683. }
  684. // Iterator tests, with sentinels:
  685. {
  686. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  687. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  688. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  689. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  690. Sentinel<const int*>(ia + sa),
  691. ForwardIterator<const int*>(ib)) == true);
  692. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  693. Sentinel<const int*>(ia + sa),
  694. ForwardIterator<const int*>(ib),
  695. Sentinel<const int*>(ib + sa)) == true);
  696. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  697. Sentinel<const int*>(ia + sa),
  698. ForwardIterator<const int*>(ib + 1),
  699. Sentinel<const int*>(ib + sa)) == false);
  700. CHECK(ranges::is_permutation(ForwardIterator<const int*>(ia),
  701. Sentinel<const int*>(ia + sa),
  702. ForwardIterator<const int*>(ib),
  703. Sentinel<const int*>(ib + sa - 1)) == false);
  704. }
  705. // common_range tests, with sentinels:
  706. {
  707. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  708. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  709. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  710. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  711. Sentinel<const int*>(ia + sa)),
  712. ForwardIterator<const int*>(ib)) == true);
  713. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  714. Sentinel<const int*>(ia + sa)),
  715. ranges::make_subrange(ForwardIterator<const int*>(ib),
  716. Sentinel<const int*>(ib + sa))) == true);
  717. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  718. Sentinel<const int*>(ia + sa)),
  719. ranges::make_subrange(ForwardIterator<const int*>(ib + 1),
  720. Sentinel<const int*>(ib + sa))) == false);
  721. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  722. Sentinel<const int*>(ia + sa)),
  723. ranges::make_subrange(ForwardIterator<const int*>(ib),
  724. Sentinel<const int*>(ib + sa - 1))) == false);
  725. }
  726. // common_range tests, with sentinels, with predicate:
  727. {
  728. const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4};
  729. const int ib[] = {4, 2, 3, 0, 1, 4, 0, 5, 6, 2};
  730. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  731. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  732. Sentinel<const int*>(ia + sa)),
  733. ForwardIterator<const int*>(ib),
  734. std::equal_to<int const>()) == true);
  735. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  736. Sentinel<const int*>(ia + sa)),
  737. ranges::make_subrange(ForwardIterator<const int*>(ib),
  738. Sentinel<const int*>(ib + sa)),
  739. std::equal_to<int const>()) == true);
  740. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  741. Sentinel<const int*>(ia + sa)),
  742. ranges::make_subrange(ForwardIterator<const int*>(ib + 1),
  743. Sentinel<const int*>(ib + sa)),
  744. std::equal_to<int const>()) == false);
  745. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const int*>(ia),
  746. Sentinel<const int*>(ia + sa)),
  747. ranges::make_subrange(ForwardIterator<const int*>(ib),
  748. Sentinel<const int*>(ib + sa - 1)),
  749. std::equal_to<int const>()) == false);
  750. }
  751. // common_range tests, with sentinels, with predicate and projections:
  752. {
  753. const S ia[] = {{0}, {1}, {2}, {3}, {0}, {5}, {6}, {2}, {4}, {4}};
  754. const T ib[] = {{4}, {2}, {3}, {0}, {1}, {4}, {0}, {5}, {6}, {2}};
  755. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  756. CHECK(ranges::is_permutation(ia, &ib[0], std::equal_to<int const>(), &S::i, &T::i) == true);
  757. CHECK(ranges::is_permutation(ia, ib, std::equal_to<int const>(), &S::i, &T::i) == true);
  758. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const S*>(ia),
  759. Sentinel<const S*>(ia + sa)),
  760. ranges::make_subrange(ForwardIterator<const T*>(ib + 1),
  761. Sentinel<const T*>(ib + sa)),
  762. std::equal_to<int const>(), &S::i, &T::i) == false);
  763. CHECK(ranges::is_permutation(ranges::make_subrange(ForwardIterator<const S*>(ia),
  764. Sentinel<const S*>(ia + sa)),
  765. ranges::make_subrange(ForwardIterator<const T*>(ib),
  766. Sentinel<const T*>(ib + sa - 1)),
  767. std::equal_to<int const>(), &S::i, &T::i) == false);
  768. }
  769. // Iterator tests, with sentinels, with predicate and projections:
  770. {
  771. const S ia[] = {{0}, {1}, {2}, {3}, {0}, {5}, {6}, {2}, {4}, {4}};
  772. const T ib[] = {{4}, {2}, {3}, {0}, {1}, {4}, {0}, {5}, {6}, {2}};
  773. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  774. CHECK(ranges::is_permutation(ForwardIterator<const S*>(ia),
  775. Sentinel<const S*>(ia + sa),
  776. ForwardIterator<const T*>(ib),
  777. std::equal_to<int const>(), &S::i, &T::i) == true);
  778. CHECK(ranges::is_permutation(ForwardIterator<const S*>(ia),
  779. Sentinel<const S*>(ia + sa),
  780. ForwardIterator<const T*>(ib),
  781. Sentinel<const T*>(ib + sa),
  782. std::equal_to<int const>(), &S::i, &T::i) == true);
  783. CHECK(ranges::is_permutation(ForwardIterator<const S*>(ia),
  784. Sentinel<const S*>(ia + sa),
  785. ForwardIterator<const T*>(ib + 1),
  786. Sentinel<const T*>(ib + sa),
  787. std::equal_to<int const>(), &S::i, &T::i) == false);
  788. CHECK(ranges::is_permutation(ForwardIterator<const S*>(ia),
  789. Sentinel<const S*>(ia + sa),
  790. ForwardIterator<const T*>(ib),
  791. Sentinel<const T*>(ib + sa - 1),
  792. std::equal_to<int const>(), &S::i, &T::i) == false);
  793. }
  794. return ::test_result();
  795. }