1// Copyright (C) 2015 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3.  If not see
16// <http://www.gnu.org/licenses/>.
17
18// { dg-options "-std=gnu++11" }
19
20#include <algorithm>
21#include <iterator>
22#include <forward_list>
23#include <list>
24#include <vector>
25#include <testsuite_hooks.h>
26
27template<typename Container>
28void
29test(Container& c)
30{
31  int size = std::distance(c.begin(), c.end());
32  for (int i=0; i < size; ++i)
33  {
34    auto first = c.begin(), middle = std::next(first, i), last = c.end();
35    auto r = std::rotate(first, middle, last);
36    auto expected = std::next(first, std::distance(middle, last));
37    VERIFY( r == expected );
38  }
39}
40
41void
42test01()
43{
44  // test random access iterators
45  std::vector<int> v{ 0, 1, 2, 3, 4 };
46  test(v);
47  v.push_back(5);
48  test(v);
49}
50
51void
52test02()
53{
54  // test bidirectional iterators
55  std::list<int> l{ 0, 1, 2, 3, 4 };
56  test(l);
57  l.push_back(5);
58  test(l);
59}
60
61void
62test03()
63{
64  // test forward iterators
65  std::forward_list<int> l{ 0, 1, 2, 3, 4 };
66  test(l);
67  l.push_front(5);
68  test(l);
69}
70
71int
72main()
73{
74  test01();
75  test02();
76  test03();
77}
78