transform.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  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. //
  13. // The LLVM Compiler Infrastructure
  14. //
  15. // This file is dual licensed under the MIT and the University of Illinois Open
  16. // Source Licenses. See LICENSE.TXT for details.
  17. //
  18. //===----------------------------------------------------------------------===//
  19. #include <functional>
  20. #include <range/v3/core.hpp>
  21. #include <range/v3/algorithm/transform.hpp>
  22. #include <range/v3/view/unbounded.hpp>
  23. #include "../simple_test.hpp"
  24. #include "../test_iterators.hpp"
  25. using namespace std::placeholders;
  26. RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
  27. template<class InIter, class OutIter>
  28. void
  29. test1()
  30. {
  31. {
  32. int ia[] = {0, 1, 2, 3, 4};
  33. constexpr auto sa = ranges::size(ia);
  34. int ib[sa] = {0};
  35. ranges::unary_transform_result<InIter, OutIter> r =
  36. ranges::transform(InIter(ia), Sentinel<int const *>(ia+sa), OutIter(ib),
  37. std::bind(std::plus<int>(), _1, 1));
  38. CHECK(base(r.in) == ia + sa);
  39. CHECK(base(r.out) == ib + sa);
  40. CHECK(ib[0] == 1);
  41. CHECK(ib[1] == 2);
  42. CHECK(ib[2] == 3);
  43. CHECK(ib[3] == 4);
  44. CHECK(ib[4] == 5);
  45. }
  46. {
  47. int ia[] = {0, 1, 2, 3, 4};
  48. constexpr auto sa = ranges::size(ia);
  49. int ib[sa] = {0};
  50. auto rng = ranges::make_subrange(InIter(ia), Sentinel<int const *>(ia + sa));
  51. ranges::unary_transform_result<InIter, OutIter> r =
  52. ranges::transform(rng, OutIter(ib),
  53. std::bind(std::plus<int>(), _1, 1));
  54. CHECK(base(r.in) == ia + sa);
  55. CHECK(base(r.out) == ib + sa);
  56. CHECK(ib[0] == 1);
  57. CHECK(ib[1] == 2);
  58. CHECK(ib[2] == 3);
  59. CHECK(ib[3] == 4);
  60. CHECK(ib[4] == 5);
  61. }
  62. {
  63. int ia[] = {0, 1, 2, 3, 4};
  64. constexpr auto sa = ranges::size(ia);
  65. int ib[sa] = {0};
  66. auto rng = ranges::make_subrange(InIter(ia), Sentinel<int const *>(ia + sa));
  67. auto r =
  68. ranges::transform(std::move(rng), OutIter(ib),
  69. std::bind(std::plus<int>(), _1, 1));
  70. CHECK(base(r.in) == ia + sa);
  71. CHECK(base(r.out) == ib + sa);
  72. CHECK(ib[0] == 1);
  73. CHECK(ib[1] == 2);
  74. CHECK(ib[2] == 3);
  75. CHECK(ib[3] == 4);
  76. CHECK(ib[4] == 5);
  77. }
  78. }
  79. template<class InIter1, class InIter2, class OutIter>
  80. void
  81. test2()
  82. {
  83. {
  84. int ia[] = {0, 1, 2, 3, 4};
  85. constexpr auto sa = ranges::size(ia);
  86. int ib[sa] = {1, 2, 3, 4, 5};
  87. ranges::binary_transform_result<InIter1, InIter2, OutIter> r =
  88. ranges::transform(InIter1(ib), Sentinel<int const *>(ib + sa), InIter2(ia),
  89. OutIter(ib), std::minus<int>());
  90. CHECK(base(r.in1) == ib + sa);
  91. CHECK(base(r.in2) == ia + sa);
  92. CHECK(base(r.out) == ib + sa);
  93. CHECK(ib[0] == 1);
  94. CHECK(ib[1] == 1);
  95. CHECK(ib[2] == 1);
  96. CHECK(ib[3] == 1);
  97. CHECK(ib[4] == 1);
  98. }
  99. {
  100. int ia[] = {0, 1, 2, 3, 4};
  101. constexpr auto sa = ranges::size(ia);
  102. int ib[sa] = {1, 2, 3, 4, 5};
  103. ranges::binary_transform_result<InIter1, InIter2, OutIter> r =
  104. ranges::transform(InIter1(ib), Sentinel<int const *>(ib + sa),
  105. InIter2(ia), Sentinel<int const *>(ia + sa),
  106. OutIter(ib), std::minus<int>());
  107. CHECK(base(r.in1) == ib + sa);
  108. CHECK(base(r.in2) == ia + sa);
  109. CHECK(base(r.out) == ib + sa);
  110. CHECK(ib[0] == 1);
  111. CHECK(ib[1] == 1);
  112. CHECK(ib[2] == 1);
  113. CHECK(ib[3] == 1);
  114. CHECK(ib[4] == 1);
  115. }
  116. {
  117. int ia[] = {0, 1, 2, 3, 4};
  118. constexpr auto sa = ranges::size(ia);
  119. int ib[sa] = {1, 2, 3, 4, 5};
  120. auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel<int const *>(ib + sa));
  121. ranges::binary_transform_result<InIter1, InIter2, OutIter> r =
  122. ranges::transform(rng0, InIter2(ia),
  123. OutIter(ib), std::minus<int>());
  124. CHECK(base(r.in1) == ib + sa);
  125. CHECK(base(r.in2) == ia + sa);
  126. CHECK(base(r.out) == ib + sa);
  127. CHECK(ib[0] == 1);
  128. CHECK(ib[1] == 1);
  129. CHECK(ib[2] == 1);
  130. CHECK(ib[3] == 1);
  131. CHECK(ib[4] == 1);
  132. }
  133. {
  134. int ia[] = {0, 1, 2, 3, 4};
  135. constexpr auto sa = ranges::size(ia);
  136. int ib[sa] = {1, 2, 3, 4, 5};
  137. auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel<int const *>(ib + sa));
  138. auto r =
  139. ranges::transform(std::move(rng0), InIter2(ia),
  140. OutIter(ib), std::minus<int>());
  141. CHECK(base(r.in1) == ib + sa);
  142. CHECK(base(r.in2) == ia + sa);
  143. CHECK(base(r.out) == ib + sa);
  144. CHECK(ib[0] == 1);
  145. CHECK(ib[1] == 1);
  146. CHECK(ib[2] == 1);
  147. CHECK(ib[3] == 1);
  148. CHECK(ib[4] == 1);
  149. }
  150. {
  151. int ia[] = {0, 1, 2, 3, 4};
  152. constexpr auto sa = ranges::size(ia);
  153. int ib[sa] = {1, 2, 3, 4, 5};
  154. auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel<int const *>(ib + sa));
  155. auto rng1 = ranges::make_subrange(InIter2(ia), Sentinel<int const *>(ia + sa));
  156. ranges::binary_transform_result<InIter1, InIter2, OutIter> r =
  157. ranges::transform(rng0, rng1, OutIter(ib), std::minus<int>());
  158. CHECK(base(r.in1) == ib + sa);
  159. CHECK(base(r.in2) == ia + sa);
  160. CHECK(base(r.out) == ib + sa);
  161. CHECK(ib[0] == 1);
  162. CHECK(ib[1] == 1);
  163. CHECK(ib[2] == 1);
  164. CHECK(ib[3] == 1);
  165. CHECK(ib[4] == 1);
  166. }
  167. {
  168. int ia[] = {0, 1, 2, 3, 4};
  169. constexpr auto sa = ranges::size(ia);
  170. int ib[sa] = {1, 2, 3, 4, 5};
  171. auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel<int const *>(ib + sa));
  172. auto rng1 = ranges::make_subrange(InIter2(ia), Sentinel<int const *>(ia + sa));
  173. auto r =
  174. ranges::transform(std::move(rng0), std::move(rng1), OutIter(ib), std::minus<int>());
  175. CHECK(base(r.in1) == ib + sa);
  176. CHECK(base(r.in2) == ia + sa);
  177. CHECK(base(r.out) == ib + sa);
  178. CHECK(ib[0] == 1);
  179. CHECK(ib[1] == 1);
  180. CHECK(ib[2] == 1);
  181. CHECK(ib[3] == 1);
  182. CHECK(ib[4] == 1);
  183. }
  184. }
  185. struct S
  186. {
  187. int i;
  188. };
  189. constexpr int plus_one(int i)
  190. {
  191. return i + 1;
  192. }
  193. constexpr bool test_constexpr()
  194. {
  195. using namespace ranges;
  196. int ia[] = {0, 1, 2, 3, 4};
  197. constexpr auto sa = ranges::size(ia);
  198. int ib[sa] = {0};
  199. auto r = transform(ia, ib, plus_one);
  200. STATIC_CHECK_RETURN(r.in == ia + sa);
  201. STATIC_CHECK_RETURN(r.out == ib + sa);
  202. STATIC_CHECK_RETURN(ib[0] == 1);
  203. STATIC_CHECK_RETURN(ib[1] == 2);
  204. STATIC_CHECK_RETURN(ib[2] == 3);
  205. STATIC_CHECK_RETURN(ib[3] == 4);
  206. STATIC_CHECK_RETURN(ib[4] == 5);
  207. return true;
  208. }
  209. int main()
  210. {
  211. test1<InputIterator<const int*>, OutputIterator<int*> >();
  212. test1<InputIterator<const int*>, InputIterator<int*> >();
  213. test1<InputIterator<const int*>, ForwardIterator<int*> >();
  214. test1<InputIterator<const int*>, BidirectionalIterator<int*> >();
  215. test1<InputIterator<const int*>, RandomAccessIterator<int*> >();
  216. test1<InputIterator<const int*>, int*>();
  217. test1<ForwardIterator<const int*>, OutputIterator<int*> >();
  218. test1<ForwardIterator<const int*>, InputIterator<int*> >();
  219. test1<ForwardIterator<const int*>, ForwardIterator<int*> >();
  220. test1<ForwardIterator<const int*>, BidirectionalIterator<int*> >();
  221. test1<ForwardIterator<const int*>, RandomAccessIterator<int*> >();
  222. test1<ForwardIterator<const int*>, int*>();
  223. test1<BidirectionalIterator<const int*>, OutputIterator<int*> >();
  224. test1<BidirectionalIterator<const int*>, InputIterator<int*> >();
  225. test1<BidirectionalIterator<const int*>, ForwardIterator<int*> >();
  226. test1<BidirectionalIterator<const int*>, BidirectionalIterator<int*> >();
  227. test1<BidirectionalIterator<const int*>, RandomAccessIterator<int*> >();
  228. test1<BidirectionalIterator<const int*>, int*>();
  229. test1<RandomAccessIterator<const int*>, OutputIterator<int*> >();
  230. test1<RandomAccessIterator<const int*>, InputIterator<int*> >();
  231. test1<RandomAccessIterator<const int*>, ForwardIterator<int*> >();
  232. test1<RandomAccessIterator<const int*>, BidirectionalIterator<int*> >();
  233. test1<RandomAccessIterator<const int*>, RandomAccessIterator<int*> >();
  234. test1<RandomAccessIterator<const int*>, int*>();
  235. test1<const int*, OutputIterator<int*> >();
  236. test1<const int*, InputIterator<int*> >();
  237. test1<const int*, ForwardIterator<int*> >();
  238. test1<const int*, BidirectionalIterator<int*> >();
  239. test1<const int*, RandomAccessIterator<int*> >();
  240. test1<const int*, int*>();
  241. test2<InputIterator<const int*>, InputIterator<const int*>, OutputIterator<int*> >();
  242. test2<InputIterator<const int*>, InputIterator<const int*>, InputIterator<int*> >();
  243. test2<InputIterator<const int*>, InputIterator<const int*>, ForwardIterator<int*> >();
  244. test2<InputIterator<const int*>, InputIterator<const int*>, BidirectionalIterator<int*> >();
  245. test2<InputIterator<const int*>, InputIterator<const int*>, RandomAccessIterator<int*> >();
  246. test2<InputIterator<const int*>, InputIterator<const int*>, int*>();
  247. test2<InputIterator<const int*>, ForwardIterator<const int*>, OutputIterator<int*> >();
  248. test2<InputIterator<const int*>, ForwardIterator<const int*>, InputIterator<int*> >();
  249. test2<InputIterator<const int*>, ForwardIterator<const int*>, ForwardIterator<int*> >();
  250. test2<InputIterator<const int*>, ForwardIterator<const int*>, BidirectionalIterator<int*> >();
  251. test2<InputIterator<const int*>, ForwardIterator<const int*>, RandomAccessIterator<int*> >();
  252. test2<InputIterator<const int*>, ForwardIterator<const int*>, int*>();
  253. test2<InputIterator<const int*>, BidirectionalIterator<const int*>, OutputIterator<int*> >();
  254. test2<InputIterator<const int*>, BidirectionalIterator<const int*>, InputIterator<int*> >();
  255. test2<InputIterator<const int*>, BidirectionalIterator<const int*>, ForwardIterator<int*> >();
  256. test2<InputIterator<const int*>, BidirectionalIterator<const int*>, BidirectionalIterator<int*> >();
  257. test2<InputIterator<const int*>, BidirectionalIterator<const int*>, RandomAccessIterator<int*> >();
  258. test2<InputIterator<const int*>, BidirectionalIterator<const int*>, int*>();
  259. test2<InputIterator<const int*>, RandomAccessIterator<const int*>, OutputIterator<int*> >();
  260. test2<InputIterator<const int*>, RandomAccessIterator<const int*>, InputIterator<int*> >();
  261. test2<InputIterator<const int*>, RandomAccessIterator<const int*>, ForwardIterator<int*> >();
  262. test2<InputIterator<const int*>, RandomAccessIterator<const int*>, BidirectionalIterator<int*> >();
  263. test2<InputIterator<const int*>, RandomAccessIterator<const int*>, RandomAccessIterator<int*> >();
  264. test2<InputIterator<const int*>, RandomAccessIterator<const int*>, int*>();
  265. test2<InputIterator<const int*>, const int*, OutputIterator<int*> >();
  266. test2<InputIterator<const int*>, const int*, InputIterator<int*> >();
  267. test2<InputIterator<const int*>, const int*, ForwardIterator<int*> >();
  268. test2<InputIterator<const int*>, const int*, BidirectionalIterator<int*> >();
  269. test2<InputIterator<const int*>, const int*, RandomAccessIterator<int*> >();
  270. test2<InputIterator<const int*>, const int*, int*>();
  271. test2<ForwardIterator<const int*>, InputIterator<const int*>, OutputIterator<int*> >();
  272. test2<ForwardIterator<const int*>, InputIterator<const int*>, InputIterator<int*> >();
  273. test2<ForwardIterator<const int*>, InputIterator<const int*>, ForwardIterator<int*> >();
  274. test2<ForwardIterator<const int*>, InputIterator<const int*>, BidirectionalIterator<int*> >();
  275. test2<ForwardIterator<const int*>, InputIterator<const int*>, RandomAccessIterator<int*> >();
  276. test2<ForwardIterator<const int*>, InputIterator<const int*>, int*>();
  277. test2<ForwardIterator<const int*>, ForwardIterator<const int*>, OutputIterator<int*> >();
  278. test2<ForwardIterator<const int*>, ForwardIterator<const int*>, InputIterator<int*> >();
  279. test2<ForwardIterator<const int*>, ForwardIterator<const int*>, ForwardIterator<int*> >();
  280. test2<ForwardIterator<const int*>, ForwardIterator<const int*>, BidirectionalIterator<int*> >();
  281. test2<ForwardIterator<const int*>, ForwardIterator<const int*>, RandomAccessIterator<int*> >();
  282. test2<ForwardIterator<const int*>, ForwardIterator<const int*>, int*>();
  283. test2<ForwardIterator<const int*>, BidirectionalIterator<const int*>, OutputIterator<int*> >();
  284. test2<ForwardIterator<const int*>, BidirectionalIterator<const int*>, InputIterator<int*> >();
  285. test2<ForwardIterator<const int*>, BidirectionalIterator<const int*>, ForwardIterator<int*> >();
  286. test2<ForwardIterator<const int*>, BidirectionalIterator<const int*>, BidirectionalIterator<int*> >();
  287. test2<ForwardIterator<const int*>, BidirectionalIterator<const int*>, RandomAccessIterator<int*> >();
  288. test2<ForwardIterator<const int*>, BidirectionalIterator<const int*>, int*>();
  289. test2<ForwardIterator<const int*>, RandomAccessIterator<const int*>, OutputIterator<int*> >();
  290. test2<ForwardIterator<const int*>, RandomAccessIterator<const int*>, InputIterator<int*> >();
  291. test2<ForwardIterator<const int*>, RandomAccessIterator<const int*>, ForwardIterator<int*> >();
  292. test2<ForwardIterator<const int*>, RandomAccessIterator<const int*>, BidirectionalIterator<int*> >();
  293. test2<ForwardIterator<const int*>, RandomAccessIterator<const int*>, RandomAccessIterator<int*> >();
  294. test2<ForwardIterator<const int*>, RandomAccessIterator<const int*>, int*>();
  295. test2<ForwardIterator<const int*>, const int*, OutputIterator<int*> >();
  296. test2<ForwardIterator<const int*>, const int*, InputIterator<int*> >();
  297. test2<ForwardIterator<const int*>, const int*, ForwardIterator<int*> >();
  298. test2<ForwardIterator<const int*>, const int*, BidirectionalIterator<int*> >();
  299. test2<ForwardIterator<const int*>, const int*, RandomAccessIterator<int*> >();
  300. test2<ForwardIterator<const int*>, const int*, int*>();
  301. test2<BidirectionalIterator<const int*>, InputIterator<const int*>, OutputIterator<int*> >();
  302. test2<BidirectionalIterator<const int*>, InputIterator<const int*>, InputIterator<int*> >();
  303. test2<BidirectionalIterator<const int*>, InputIterator<const int*>, ForwardIterator<int*> >();
  304. test2<BidirectionalIterator<const int*>, InputIterator<const int*>, BidirectionalIterator<int*> >();
  305. test2<BidirectionalIterator<const int*>, InputIterator<const int*>, RandomAccessIterator<int*> >();
  306. test2<BidirectionalIterator<const int*>, InputIterator<const int*>, int*>();
  307. test2<BidirectionalIterator<const int*>, ForwardIterator<const int*>, OutputIterator<int*> >();
  308. test2<BidirectionalIterator<const int*>, ForwardIterator<const int*>, InputIterator<int*> >();
  309. test2<BidirectionalIterator<const int*>, ForwardIterator<const int*>, ForwardIterator<int*> >();
  310. test2<BidirectionalIterator<const int*>, ForwardIterator<const int*>, BidirectionalIterator<int*> >();
  311. test2<BidirectionalIterator<const int*>, ForwardIterator<const int*>, RandomAccessIterator<int*> >();
  312. test2<BidirectionalIterator<const int*>, ForwardIterator<const int*>, int*>();
  313. test2<BidirectionalIterator<const int*>, BidirectionalIterator<const int*>, OutputIterator<int*> >();
  314. test2<BidirectionalIterator<const int*>, BidirectionalIterator<const int*>, InputIterator<int*> >();
  315. test2<BidirectionalIterator<const int*>, BidirectionalIterator<const int*>, ForwardIterator<int*> >();
  316. test2<BidirectionalIterator<const int*>, BidirectionalIterator<const int*>, BidirectionalIterator<int*> >();
  317. test2<BidirectionalIterator<const int*>, BidirectionalIterator<const int*>, RandomAccessIterator<int*> >();
  318. test2<BidirectionalIterator<const int*>, BidirectionalIterator<const int*>, int*>();
  319. test2<BidirectionalIterator<const int*>, RandomAccessIterator<const int*>, OutputIterator<int*> >();
  320. test2<BidirectionalIterator<const int*>, RandomAccessIterator<const int*>, InputIterator<int*> >();
  321. test2<BidirectionalIterator<const int*>, RandomAccessIterator<const int*>, ForwardIterator<int*> >();
  322. test2<BidirectionalIterator<const int*>, RandomAccessIterator<const int*>, BidirectionalIterator<int*> >();
  323. test2<BidirectionalIterator<const int*>, RandomAccessIterator<const int*>, RandomAccessIterator<int*> >();
  324. test2<BidirectionalIterator<const int*>, RandomAccessIterator<const int*>, int*>();
  325. test2<BidirectionalIterator<const int*>, const int*, OutputIterator<int*> >();
  326. test2<BidirectionalIterator<const int*>, const int*, InputIterator<int*> >();
  327. test2<BidirectionalIterator<const int*>, const int*, ForwardIterator<int*> >();
  328. test2<BidirectionalIterator<const int*>, const int*, BidirectionalIterator<int*> >();
  329. test2<BidirectionalIterator<const int*>, const int*, RandomAccessIterator<int*> >();
  330. test2<BidirectionalIterator<const int*>, const int*, int*>();
  331. test2<RandomAccessIterator<const int*>, InputIterator<const int*>, OutputIterator<int*> >();
  332. test2<RandomAccessIterator<const int*>, InputIterator<const int*>, InputIterator<int*> >();
  333. test2<RandomAccessIterator<const int*>, InputIterator<const int*>, ForwardIterator<int*> >();
  334. test2<RandomAccessIterator<const int*>, InputIterator<const int*>, BidirectionalIterator<int*> >();
  335. test2<RandomAccessIterator<const int*>, InputIterator<const int*>, RandomAccessIterator<int*> >();
  336. test2<RandomAccessIterator<const int*>, InputIterator<const int*>, int*>();
  337. test2<RandomAccessIterator<const int*>, ForwardIterator<const int*>, OutputIterator<int*> >();
  338. test2<RandomAccessIterator<const int*>, ForwardIterator<const int*>, InputIterator<int*> >();
  339. test2<RandomAccessIterator<const int*>, ForwardIterator<const int*>, ForwardIterator<int*> >();
  340. test2<RandomAccessIterator<const int*>, ForwardIterator<const int*>, BidirectionalIterator<int*> >();
  341. test2<RandomAccessIterator<const int*>, ForwardIterator<const int*>, RandomAccessIterator<int*> >();
  342. test2<RandomAccessIterator<const int*>, ForwardIterator<const int*>, int*>();
  343. test2<RandomAccessIterator<const int*>, BidirectionalIterator<const int*>, OutputIterator<int*> >();
  344. test2<RandomAccessIterator<const int*>, BidirectionalIterator<const int*>, InputIterator<int*> >();
  345. test2<RandomAccessIterator<const int*>, BidirectionalIterator<const int*>, ForwardIterator<int*> >();
  346. test2<RandomAccessIterator<const int*>, BidirectionalIterator<const int*>, BidirectionalIterator<int*> >();
  347. test2<RandomAccessIterator<const int*>, BidirectionalIterator<const int*>, RandomAccessIterator<int*> >();
  348. test2<RandomAccessIterator<const int*>, BidirectionalIterator<const int*>, int*>();
  349. test2<RandomAccessIterator<const int*>, RandomAccessIterator<const int*>, OutputIterator<int*> >();
  350. test2<RandomAccessIterator<const int*>, RandomAccessIterator<const int*>, InputIterator<int*> >();
  351. test2<RandomAccessIterator<const int*>, RandomAccessIterator<const int*>, ForwardIterator<int*> >();
  352. test2<RandomAccessIterator<const int*>, RandomAccessIterator<const int*>, BidirectionalIterator<int*> >();
  353. test2<RandomAccessIterator<const int*>, RandomAccessIterator<const int*>, RandomAccessIterator<int*> >();
  354. test2<RandomAccessIterator<const int*>, RandomAccessIterator<const int*>, int*>();
  355. test2<RandomAccessIterator<const int*>, const int*, OutputIterator<int*> >();
  356. test2<RandomAccessIterator<const int*>, const int*, InputIterator<int*> >();
  357. test2<RandomAccessIterator<const int*>, const int*, ForwardIterator<int*> >();
  358. test2<RandomAccessIterator<const int*>, const int*, BidirectionalIterator<int*> >();
  359. test2<RandomAccessIterator<const int*>, const int*, RandomAccessIterator<int*> >();
  360. test2<RandomAccessIterator<const int*>, const int*, int*>();
  361. test2<const int*, InputIterator<const int*>, OutputIterator<int*> >();
  362. test2<const int*, InputIterator<const int*>, InputIterator<int*> >();
  363. test2<const int*, InputIterator<const int*>, ForwardIterator<int*> >();
  364. test2<const int*, InputIterator<const int*>, BidirectionalIterator<int*> >();
  365. test2<const int*, InputIterator<const int*>, RandomAccessIterator<int*> >();
  366. test2<const int*, InputIterator<const int*>, int*>();
  367. test2<const int*, ForwardIterator<const int*>, OutputIterator<int*> >();
  368. test2<const int*, ForwardIterator<const int*>, InputIterator<int*> >();
  369. test2<const int*, ForwardIterator<const int*>, ForwardIterator<int*> >();
  370. test2<const int*, ForwardIterator<const int*>, BidirectionalIterator<int*> >();
  371. test2<const int*, ForwardIterator<const int*>, RandomAccessIterator<int*> >();
  372. test2<const int*, ForwardIterator<const int*>, int*>();
  373. test2<const int*, BidirectionalIterator<const int*>, OutputIterator<int*> >();
  374. test2<const int*, BidirectionalIterator<const int*>, InputIterator<int*> >();
  375. test2<const int*, BidirectionalIterator<const int*>, ForwardIterator<int*> >();
  376. test2<const int*, BidirectionalIterator<const int*>, BidirectionalIterator<int*> >();
  377. test2<const int*, BidirectionalIterator<const int*>, RandomAccessIterator<int*> >();
  378. test2<const int*, BidirectionalIterator<const int*>, int*>();
  379. test2<const int*, RandomAccessIterator<const int*>, OutputIterator<int*> >();
  380. test2<const int*, RandomAccessIterator<const int*>, InputIterator<int*> >();
  381. test2<const int*, RandomAccessIterator<const int*>, ForwardIterator<int*> >();
  382. test2<const int*, RandomAccessIterator<const int*>, BidirectionalIterator<int*> >();
  383. test2<const int*, RandomAccessIterator<const int*>, RandomAccessIterator<int*> >();
  384. test2<const int*, RandomAccessIterator<const int*>, int*>();
  385. test2<const int*, const int*, OutputIterator<int*> >();
  386. test2<const int*, const int*, InputIterator<int*> >();
  387. test2<const int*, const int*, ForwardIterator<int*> >();
  388. test2<const int*, const int*, BidirectionalIterator<int*> >();
  389. test2<const int*, const int*, RandomAccessIterator<int*> >();
  390. test2<const int*, const int*, int*>();
  391. int *p = nullptr;
  392. auto unary = [](int i){return i + 1; };
  393. auto binary = [](int i, int j){return i + j; };
  394. S const s[] = {S{1}, S{2}, S{3}, S{4}};
  395. int const i[] = {1, 2, 3, 4};
  396. static_assert(std::is_same<ranges::unary_transform_result<S const*, int*>,
  397. decltype(ranges::transform(s, p, unary, &S::i))>::value, "");
  398. static_assert(std::is_same<ranges::binary_transform_result<S const*, int const *, int*>,
  399. decltype(ranges::transform(s, i, p, binary, &S::i))>::value, "");
  400. static_assert(std::is_same<ranges::binary_transform_result<S const*, S const *, int*>,
  401. decltype(ranges::transform(s, s, p, binary, &S::i, &S::i))>::value, "");
  402. {
  403. STATIC_CHECK(test_constexpr());
  404. }
  405. return ::test_result();
  406. }