1// { dg-options "-std=gnu++11" }
2
3// Copyright (C) 2008-2015 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3.  If not see
18// <http://www.gnu.org/licenses/>.
19
20// 23.2.3.n forward_list xxx [lib.forward_list.xxx]
21
22#include <forward_list>
23#include <testsuite_hooks.h>
24
25// This test verifies the following:
26//   cbegin
27//   erase_after one iterator
28//   pos is useable and points to current element
29void
30test01()
31{
32  bool test __attribute__((unused)) = true;
33
34  std::forward_list<int> fl({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
35
36  std::forward_list<int>::const_iterator pos = fl.cbegin();
37  ++pos;
38  VERIFY( *pos == 1 );
39
40  std::forward_list<int>::iterator pos2 = fl.erase_after(pos);
41
42  VERIFY( *pos == 1 );
43  ++pos;
44  VERIFY( *pos == 3 );
45  VERIFY( pos == pos2 );
46}
47
48// This test verifies the following:
49//   cbegin
50//   erase_after iterator range
51//   pos is useable and points to current element
52void
53test02()
54{
55  bool test __attribute__((unused)) = true;
56
57  std::forward_list<int> fl({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
58
59  std::forward_list<int>::const_iterator pos = fl.cbegin();
60  ++pos;
61  VERIFY( *pos == 1 );
62
63  std::forward_list<int>::iterator stop = fl.begin();
64  ++stop;
65  ++stop;
66  ++stop;
67  ++stop;
68  VERIFY( *stop == 4 );
69
70  std::forward_list<int>::iterator pos2 = fl.erase_after(pos, stop);
71
72  VERIFY( pos2 == stop );
73  VERIFY( *pos == 1 );
74  ++pos;
75  VERIFY( *pos == 4 );
76  VERIFY( std::distance(fl.begin(), fl.end()) == 8 );
77
78  std::forward_list<int>::iterator pos3
79    = fl.erase_after(pos, fl.end());
80  VERIFY( pos3 == fl.end() );
81  VERIFY( ++pos == fl.end() );
82  VERIFY( std::distance(fl.begin(), fl.end()) == 3 );
83
84  std::forward_list<int>::iterator pos4
85    = fl.erase_after(fl.before_begin(), pos);
86  VERIFY( pos4 == pos );
87  VERIFY( std::distance(fl.begin(), fl.end()) == 0 );
88  VERIFY( fl.empty() );
89}
90
91int
92main()
93{
94  test01();
95  test02();
96  return 0;
97}
98