adjacent_difference.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Range v3 library
  2. //
  3. // Copyright Eric Niebler 2014-present
  4. // Copyright Gonzalo Brito Gadeschi 2014
  5. //
  6. // Use, modification and distribution is subject to the
  7. // Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. //
  11. // Project home: https://github.com/ericniebler/range-v3
  12. //
  13. // Implementation based on the code in libc++
  14. // http://http://libcxx.llvm.org/
  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 <range/v3/core.hpp>
  24. #include <range/v3/numeric/adjacent_difference.hpp>
  25. #include "../simple_test.hpp"
  26. #include "../test_iterators.hpp"
  27. struct S
  28. {
  29. int i;
  30. };
  31. template<class InIter, class OutIter, class InSent = InIter> void test()
  32. {
  33. using ranges::adjacent_difference;
  34. using ranges::make_subrange;
  35. { // iterator
  36. int ia[] = {15, 10, 6, 3, 1};
  37. int ir[] = {15, -5, -4, -3, -2};
  38. const unsigned s = sizeof(ia) / sizeof(ia[0]);
  39. int ib[s] = {0};
  40. auto r = adjacent_difference(InIter(ia), InSent(ia + s), OutIter(ib));
  41. CHECK(base(r.in) == ia + s);
  42. CHECK(base(r.out) == ib + s);
  43. for(unsigned i = 0; i < s; ++i)
  44. {
  45. CHECK(ib[i] == ir[i]);
  46. }
  47. }
  48. { // range + output iterator
  49. int ia[] = {15, 10, 6, 3, 1};
  50. int ir[] = {15, -5, -4, -3, -2};
  51. const unsigned s = sizeof(ia) / sizeof(ia[0]);
  52. int ib[s] = {0};
  53. auto rng = make_subrange(InIter(ia), InSent(ia + s));
  54. auto r = adjacent_difference(rng, OutIter(ib));
  55. CHECK(base(r.in) == ia + s);
  56. CHECK(base(r.out) == ib + s);
  57. for(unsigned i = 0; i < s; ++i)
  58. {
  59. CHECK(ib[i] == ir[i]);
  60. }
  61. }
  62. { // range + output range
  63. int ia[] = {15, 10, 6, 3, 1};
  64. int ir[] = {15, -5, -4, -3, -2};
  65. const unsigned s = sizeof(ia) / sizeof(ia[0]);
  66. int ib[s] = {0};
  67. auto rng = make_subrange(InIter(ia), InSent(ia + s));
  68. auto orng = make_subrange(OutIter(ib), OutIter(ib + s));
  69. auto r = adjacent_difference(rng, orng);
  70. CHECK(base(r.in) == ia + s);
  71. CHECK(base(r.out) == ib + s);
  72. for(unsigned i = 0; i < s; ++i)
  73. {
  74. CHECK(ib[i] == ir[i]);
  75. }
  76. }
  77. {
  78. int ia[] = {15, 10, 6, 3, 1};
  79. int ir[] = {15, 25, 16, 9, 4};
  80. const unsigned s = sizeof(ia) / sizeof(ia[0]);
  81. int ib[s] = {0};
  82. auto rng = make_subrange(InIter(ia), InSent(ia + s));
  83. auto orng = make_subrange(OutIter(ib), OutIter(ib + s));
  84. auto r = adjacent_difference(rng, orng, std::plus<int>());
  85. CHECK(base(r.in) == ia + s);
  86. CHECK(base(r.out) == ib + s);
  87. for(unsigned i = 0; i < s; ++i)
  88. {
  89. CHECK(ib[i] == ir[i]);
  90. }
  91. }
  92. }
  93. int main()
  94. {
  95. test<InputIterator<const int *>, InputIterator<int *>>();
  96. test<InputIterator<const int *>, ForwardIterator<int *>>();
  97. test<InputIterator<const int *>, BidirectionalIterator<int *>>();
  98. test<InputIterator<const int *>, RandomAccessIterator<int *>>();
  99. test<InputIterator<const int *>, int *>();
  100. test<ForwardIterator<const int *>, InputIterator<int *>>();
  101. test<ForwardIterator<const int *>, ForwardIterator<int *>>();
  102. test<ForwardIterator<const int *>, BidirectionalIterator<int *>>();
  103. test<ForwardIterator<const int *>, RandomAccessIterator<int *>>();
  104. test<ForwardIterator<const int *>, int *>();
  105. test<BidirectionalIterator<const int *>, InputIterator<int *>>();
  106. test<BidirectionalIterator<const int *>, ForwardIterator<int *>>();
  107. test<BidirectionalIterator<const int *>, BidirectionalIterator<int *>>();
  108. test<BidirectionalIterator<const int *>, RandomAccessIterator<int *>>();
  109. test<BidirectionalIterator<const int *>, int *>();
  110. test<RandomAccessIterator<const int *>, InputIterator<int *>>();
  111. test<RandomAccessIterator<const int *>, ForwardIterator<int *>>();
  112. test<RandomAccessIterator<const int *>, BidirectionalIterator<int *>>();
  113. test<RandomAccessIterator<const int *>, RandomAccessIterator<int *>>();
  114. test<RandomAccessIterator<const int *>, int *>();
  115. test<const int *, InputIterator<int *>>();
  116. test<const int *, ForwardIterator<int *>>();
  117. test<const int *, BidirectionalIterator<int *>>();
  118. test<const int *, RandomAccessIterator<int *>>();
  119. test<const int *, int *>();
  120. using ranges::adjacent_difference;
  121. { // Test projections
  122. S ia[] = {{15}, {10}, {6}, {3}, {1}};
  123. int ir[] = {15, -5, -4, -3, -2};
  124. const unsigned s = sizeof(ir) / sizeof(ir[0]);
  125. int ib[s] = {0};
  126. auto r = adjacent_difference(ranges::begin(ia), ranges::begin(ia) + s,
  127. ranges::begin(ib), std::minus<int>(), &S::i);
  128. CHECK(base(r.in) == ia + s);
  129. CHECK(base(r.out) == ib + s);
  130. for(unsigned i = 0; i < s; ++i)
  131. {
  132. CHECK(ib[i] == ir[i]);
  133. }
  134. }
  135. { // Test BinaryOp
  136. int ia[] = {15, 10, 6, 3, 1};
  137. int ir[] = {15, 25, 16, 9, 4};
  138. const unsigned s = sizeof(ir) / sizeof(ir[0]);
  139. int ib[s] = {0};
  140. auto r = adjacent_difference(ia, ranges::begin(ib), std::plus<int>());
  141. CHECK(base(r.in) == ia + s);
  142. CHECK(base(r.out) == ib + s);
  143. for(unsigned i = 0; i < s; ++i)
  144. {
  145. CHECK(ib[i] == ir[i]);
  146. }
  147. }
  148. { // Test calling it with an array
  149. int ia[] = {15, 10, 6, 3, 1};
  150. int ir[] = {15, 25, 16, 9, 4};
  151. const unsigned s = sizeof(ir) / sizeof(ir[0]);
  152. int ib[s] = {0};
  153. auto r = adjacent_difference(ia, ib, std::plus<int>());
  154. CHECK(base(r.in) == ia + s);
  155. CHECK(base(r.out) == ib + s);
  156. for(unsigned i = 0; i < s; ++i)
  157. {
  158. CHECK(ib[i] == ir[i]);
  159. }
  160. }
  161. return ::test_result();
  162. }