15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <algorithm>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// template<BidirectionalIterator InIter, BidirectionalIterator OutIter>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   requires OutputIterator<OutIter, InIter::reference>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   OutIter
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   copy_backward(InIter first, InIter last, OutIter result);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "test_iterators.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class InIter, class OutIter>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test()
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned N = 1000;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ia[N];
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0; i < N; ++i)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ia[i] = i;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ib[N] = {0};
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OutIter r = std::copy_backward(InIter(ia), InIter(ia+N), OutIter(ib+N));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(base(r) == ib);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0; i < N; ++i)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(ia[i] == ib[i]);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<bidirectional_iterator<const int*>, int*>();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<random_access_iterator<const int*>, random_access_iterator<int*> >();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<random_access_iterator<const int*>, int*>();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<const int*, bidirectional_iterator<int*> >();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<const int*, random_access_iterator<int*> >();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test<const int*, int*>();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)