111
|
1 // { dg-do compile }
|
|
2 // { dg-options "-ftracer -fno-tree-dce -fno-tree-sra" }
|
131
|
3 // { dg-additional-options "-Wno-return-type" }
|
111
|
4
|
|
5 struct bidirectional_iterator_tag
|
|
6 {};
|
|
7 struct random_access_iterator_tag:bidirectional_iterator_tag
|
|
8 {};
|
|
9 template < typename _Category, typename, typename _Distance, typename > struct iterator
|
|
10 {
|
|
11 typedef _Distance difference_type;
|
|
12 };
|
|
13 template < typename _Iterator > struct iterator_traits
|
|
14 {
|
|
15 typedef typename _Iterator::difference_type difference_type;
|
|
16 };
|
|
17 template < typename _Tp > struct iterator_traits <_Tp * >
|
|
18 {
|
|
19 typedef random_access_iterator_tag iterator_category;
|
|
20 typedef _Tp value_type;
|
|
21 typedef int difference_type;
|
|
22 typedef _Tp reference;
|
|
23 };
|
|
24 template < typename _Iterator > class reverse_iterator:
|
|
25 public
|
|
26 iterator < typename iterator_traits < _Iterator >::iterator_category,
|
|
27 typename iterator_traits < _Iterator >::value_type,
|
|
28 typename iterator_traits < _Iterator >::difference_type, typename iterator_traits < _Iterator >::reference >
|
|
29 {
|
|
30 _Iterator current;
|
|
31 public:
|
|
32 typedef _Iterator iterator_type;
|
|
33 reverse_iterator (const reverse_iterator & __x):current (__x.current)
|
|
34 {}
|
|
35 iterator_type base ()
|
|
36 {
|
|
37 return current;
|
|
38 }
|
|
39 reverse_iterator operator++ ()
|
|
40 {
|
|
41 --current;
|
|
42 }
|
|
43 };
|
|
44 template
|
|
45 <
|
|
46 typename
|
|
47 _Iterator
|
|
48 >
|
|
49 bool
|
|
50 operator
|
|
51 ==
|
|
52 (reverse_iterator < _Iterator > __x, reverse_iterator < _Iterator > __y)
|
|
53 {
|
|
54 return __x.base () == __y.base ();
|
|
55 }
|
|
56
|
|
57 template
|
|
58 <
|
|
59 typename
|
|
60 _Iterator
|
|
61 >
|
|
62 typename
|
|
63 reverse_iterator
|
|
64 <
|
|
65 _Iterator
|
|
66 >::difference_type
|
|
67 operator
|
|
68 - (reverse_iterator < _Iterator >, reverse_iterator < _Iterator >)
|
|
69 {}
|
|
70 template
|
|
71 <
|
|
72 typename
|
|
73 _RandomAccessIterator
|
|
74 >
|
|
75 _RandomAccessIterator
|
|
76 __find
|
|
77 (_RandomAccessIterator
|
|
78 __first, _RandomAccessIterator __last)
|
|
79 {
|
|
80 typename
|
|
81 iterator_traits
|
|
82 <
|
|
83 _RandomAccessIterator
|
|
84 >::difference_type __trip_count (__last - __first);
|
|
85 for (; __trip_count; --__trip_count)
|
|
86 ++__first;
|
|
87 return __last;
|
|
88 }
|
|
89 typedef reverse_iterator < int* > _ForwardIterator1;
|
|
90 _ForwardIterator1
|
|
91 search
|
|
92 (_ForwardIterator1
|
|
93 __first1,
|
|
94 _ForwardIterator1
|
|
95 __last1)
|
|
96 {
|
|
97 for (;;)
|
|
98 {
|
|
99 __first1 = __find (__first1, __last1);
|
|
100 if (__first1 == __last1)
|
|
101 return __last1;
|
|
102 }
|
|
103 }
|