Home | History | Annotate | Download | only in adjacent.difference
      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 
     10 // <numeric>
     11 
     12 // template <InputIterator InIter,
     13 //           OutputIterator<auto, const InIter::value_type&> OutIter,
     14 //           Callable<auto, const InIter::value_type&, const InIter::value_type&> BinaryOperation>
     15 //   requires Constructible<InIter::value_type, InIter::reference>
     16 //         && OutputIterator<OutIter, BinaryOperation::result_type>
     17 //         && MoveAssignable<InIter::value_type>
     18 //         && CopyConstructible<BinaryOperation>
     19 //   OutIter
     20 //   adjacent_difference(InIter first, InIter last, OutIter result, BinaryOperation binary_op);
     21 
     22 #include <numeric>
     23 #include <functional>
     24 #include <cassert>
     25 
     26 #include "test_iterators.h"
     27 
     28 template <class InIter, class OutIter>
     29 void
     30 test()
     31 {
     32     int ia[] = {15, 10, 6, 3, 1};
     33     int ir[] = {15, 25, 16, 9, 4};
     34     const unsigned s = sizeof(ia) / sizeof(ia[0]);
     35     int ib[s] = {0};
     36     OutIter r = std::adjacent_difference(InIter(ia), InIter(ia+s), OutIter(ib),
     37                                          std::plus<int>());
     38     assert(base(r) == ib + s);
     39     for (unsigned i = 0; i < s; ++i)
     40         assert(ib[i] == ir[i]);
     41 }
     42 
     43 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     44 
     45 class Y;
     46 
     47 class X
     48 {
     49     int i_;
     50 
     51     X& operator=(const X&);
     52 public:
     53     explicit X(int i) : i_(i) {}
     54     X(const X& x) : i_(x.i_) {}
     55     X& operator=(X&& x)
     56     {
     57         i_ = x.i_;
     58         x.i_ = -1;
     59         return *this;
     60     }
     61 
     62     friend X operator-(const X& x, const X& y) {return X(x.i_ - y.i_);}
     63 
     64     friend class Y;
     65 };
     66 
     67 class Y
     68 {
     69     int i_;
     70 
     71     Y& operator=(const Y&);
     72 public:
     73     explicit Y(int i) : i_(i) {}
     74     Y(const Y& y) : i_(y.i_) {}
     75     void operator=(const X& x) {i_ = x.i_;}
     76 };
     77 
     78 #endif
     79 
     80 
     81 int main()
     82 {
     83     test<input_iterator<const int*>, output_iterator<int*> >();
     84     test<input_iterator<const int*>, forward_iterator<int*> >();
     85     test<input_iterator<const int*>, bidirectional_iterator<int*> >();
     86     test<input_iterator<const int*>, random_access_iterator<int*> >();
     87     test<input_iterator<const int*>, int*>();
     88 
     89     test<forward_iterator<const int*>, output_iterator<int*> >();
     90     test<forward_iterator<const int*>, forward_iterator<int*> >();
     91     test<forward_iterator<const int*>, bidirectional_iterator<int*> >();
     92     test<forward_iterator<const int*>, random_access_iterator<int*> >();
     93     test<forward_iterator<const int*>, int*>();
     94 
     95     test<bidirectional_iterator<const int*>, output_iterator<int*> >();
     96     test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
     97     test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
     98     test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
     99     test<bidirectional_iterator<const int*>, int*>();
    100 
    101     test<random_access_iterator<const int*>, output_iterator<int*> >();
    102     test<random_access_iterator<const int*>, forward_iterator<int*> >();
    103     test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
    104     test<random_access_iterator<const int*>, random_access_iterator<int*> >();
    105     test<random_access_iterator<const int*>, int*>();
    106 
    107     test<const int*, output_iterator<int*> >();
    108     test<const int*, forward_iterator<int*> >();
    109     test<const int*, bidirectional_iterator<int*> >();
    110     test<const int*, random_access_iterator<int*> >();
    111     test<const int*, int*>();
    112 
    113 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    114     X x[3] = {X(1), X(2), X(3)};
    115     Y y[3] = {Y(1), Y(2), Y(3)};
    116     std::adjacent_difference(x, x+3, y, std::minus<X>());
    117 #endif
    118 }
    119