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