1e4b17023SJohn Marino // Profiling iterator implementation -*- C++ -*-
2e4b17023SJohn Marino
3e4b17023SJohn Marino // Copyright (C) 2009, 2010 Free Software Foundation, Inc.
4e4b17023SJohn Marino //
5e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free
6e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
7e4b17023SJohn Marino // terms of the GNU General Public License as published by the
8e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
9e4b17023SJohn Marino // any later version.
10e4b17023SJohn Marino
11e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
12e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
13e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14e4b17023SJohn Marino // GNU General Public License for more details.
15e4b17023SJohn Marino
16e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
17e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
18e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
19e4b17023SJohn Marino
20e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
21e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
22e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
24e4b17023SJohn Marino
25e4b17023SJohn Marino /** @file profile/iterator_tracker.h
26e4b17023SJohn Marino * This file is a GNU profile extension to the Standard C++ Library.
27e4b17023SJohn Marino */
28e4b17023SJohn Marino
29e4b17023SJohn Marino #ifndef _GLIBCXX_PROFILE_ITERATOR_TRACKER
30e4b17023SJohn Marino #define _GLIBCXX_PROFILE_ITERATOR_TRACKER 1
31e4b17023SJohn Marino
32e4b17023SJohn Marino #include <ext/type_traits.h>
33e4b17023SJohn Marino
_GLIBCXX_VISIBILITY(default)34e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
35e4b17023SJohn Marino {
36e4b17023SJohn Marino namespace __profile
37e4b17023SJohn Marino {
38e4b17023SJohn Marino
39e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
40e4b17023SJohn Marino class __iterator_tracker
41e4b17023SJohn Marino {
42e4b17023SJohn Marino typedef __iterator_tracker _Self;
43e4b17023SJohn Marino
44e4b17023SJohn Marino // The underlying iterator
45e4b17023SJohn Marino _Iterator _M_current;
46e4b17023SJohn Marino
47e4b17023SJohn Marino // The underlying data structure
48e4b17023SJohn Marino const _Sequence* _M_ds;
49e4b17023SJohn Marino typedef std::iterator_traits<_Iterator> _Traits;
50e4b17023SJohn Marino
51e4b17023SJohn Marino public:
52e4b17023SJohn Marino typedef _Iterator _Base_iterator;
53e4b17023SJohn Marino typedef typename _Traits::iterator_category iterator_category;
54e4b17023SJohn Marino typedef typename _Traits::value_type value_type;
55e4b17023SJohn Marino typedef typename _Traits::difference_type difference_type;
56e4b17023SJohn Marino typedef typename _Traits::reference reference;
57e4b17023SJohn Marino typedef typename _Traits::pointer pointer;
58e4b17023SJohn Marino
59e4b17023SJohn Marino __iterator_tracker()
60e4b17023SJohn Marino : _M_current(), _M_ds(0) { }
61e4b17023SJohn Marino
62e4b17023SJohn Marino __iterator_tracker(const _Iterator& __i, const _Sequence* __seq)
63e4b17023SJohn Marino : _M_current(__i), _M_ds(__seq) { }
64e4b17023SJohn Marino
65e4b17023SJohn Marino __iterator_tracker(const __iterator_tracker& __x)
66e4b17023SJohn Marino : _M_current(__x._M_current), _M_ds(__x._M_ds) { }
67e4b17023SJohn Marino
68e4b17023SJohn Marino template<typename _MutableIterator>
69e4b17023SJohn Marino __iterator_tracker(const __iterator_tracker<_MutableIterator,
70e4b17023SJohn Marino typename __gnu_cxx::__enable_if
71e4b17023SJohn Marino <(std::__are_same<_MutableIterator, typename
72e4b17023SJohn Marino _Sequence::iterator::_Base_iterator>::__value),
73e4b17023SJohn Marino _Sequence>::__type>& __x)
74e4b17023SJohn Marino : _M_current(__x.base()), _M_ds(__x._M_get_sequence()) { }
75e4b17023SJohn Marino
76e4b17023SJohn Marino _Iterator
77e4b17023SJohn Marino base() const { return _M_current; }
78e4b17023SJohn Marino
79e4b17023SJohn Marino /**
80e4b17023SJohn Marino * @brief Conversion to underlying non-debug iterator to allow
81e4b17023SJohn Marino * better interaction with non-profile containers.
82e4b17023SJohn Marino */
83e4b17023SJohn Marino operator _Iterator() const { return _M_current; }
84e4b17023SJohn Marino
85e4b17023SJohn Marino pointer
86e4b17023SJohn Marino operator->() const { return &*_M_current; }
87e4b17023SJohn Marino
88e4b17023SJohn Marino __iterator_tracker&
89e4b17023SJohn Marino operator++()
90e4b17023SJohn Marino {
91e4b17023SJohn Marino _M_ds->_M_profile_iterate();
92e4b17023SJohn Marino ++_M_current;
93e4b17023SJohn Marino return *this;
94e4b17023SJohn Marino }
95e4b17023SJohn Marino
96*5ce9237cSJohn Marino __iterator_tracker
97e4b17023SJohn Marino operator++(int)
98e4b17023SJohn Marino {
99e4b17023SJohn Marino _M_ds->_M_profile_iterate();
100e4b17023SJohn Marino __iterator_tracker __tmp(*this);
101e4b17023SJohn Marino ++_M_current;
102e4b17023SJohn Marino return __tmp;
103e4b17023SJohn Marino }
104e4b17023SJohn Marino
105e4b17023SJohn Marino __iterator_tracker&
106e4b17023SJohn Marino operator--()
107e4b17023SJohn Marino {
108e4b17023SJohn Marino _M_ds->_M_profile_iterate(1);
109e4b17023SJohn Marino --_M_current;
110e4b17023SJohn Marino return *this;
111e4b17023SJohn Marino }
112e4b17023SJohn Marino
113*5ce9237cSJohn Marino __iterator_tracker
114e4b17023SJohn Marino operator--(int)
115e4b17023SJohn Marino {
116e4b17023SJohn Marino _M_ds->_M_profile_iterate(1);
117e4b17023SJohn Marino __iterator_tracker __tmp(*this);
118e4b17023SJohn Marino --_M_current;
119e4b17023SJohn Marino return __tmp;
120e4b17023SJohn Marino }
121e4b17023SJohn Marino
122e4b17023SJohn Marino __iterator_tracker&
123e4b17023SJohn Marino operator=(const __iterator_tracker& __x)
124e4b17023SJohn Marino {
125e4b17023SJohn Marino _M_current = __x._M_current;
126e4b17023SJohn Marino return *this;
127e4b17023SJohn Marino }
128e4b17023SJohn Marino
129e4b17023SJohn Marino reference
130e4b17023SJohn Marino operator*() const
131e4b17023SJohn Marino { return *_M_current; }
132e4b17023SJohn Marino
133e4b17023SJohn Marino // ------ Random access iterator requirements ------
134e4b17023SJohn Marino reference
135e4b17023SJohn Marino operator[](const difference_type& __n) const
136e4b17023SJohn Marino { return _M_current[__n]; }
137e4b17023SJohn Marino
138e4b17023SJohn Marino __iterator_tracker&
139e4b17023SJohn Marino operator+=(const difference_type& __n)
140e4b17023SJohn Marino {
141e4b17023SJohn Marino _M_current += __n;
142e4b17023SJohn Marino return *this;
143e4b17023SJohn Marino }
144e4b17023SJohn Marino
145e4b17023SJohn Marino __iterator_tracker
146e4b17023SJohn Marino operator+(const difference_type& __n) const
147e4b17023SJohn Marino {
148e4b17023SJohn Marino __iterator_tracker __tmp(*this);
149e4b17023SJohn Marino __tmp += __n;
150e4b17023SJohn Marino return __tmp;
151e4b17023SJohn Marino }
152e4b17023SJohn Marino
153e4b17023SJohn Marino __iterator_tracker&
154e4b17023SJohn Marino operator-=(const difference_type& __n)
155e4b17023SJohn Marino {
156e4b17023SJohn Marino _M_current += -__n;
157e4b17023SJohn Marino return *this;
158e4b17023SJohn Marino }
159e4b17023SJohn Marino
160e4b17023SJohn Marino __iterator_tracker
161e4b17023SJohn Marino operator-(const difference_type& __n) const
162e4b17023SJohn Marino {
163e4b17023SJohn Marino __iterator_tracker __tmp(*this);
164e4b17023SJohn Marino __tmp -= __n;
165e4b17023SJohn Marino return __tmp;
166e4b17023SJohn Marino }
167e4b17023SJohn Marino
168e4b17023SJohn Marino void
169e4b17023SJohn Marino _M_find()
170e4b17023SJohn Marino { _M_ds->_M_profile_find(); }
171e4b17023SJohn Marino
172e4b17023SJohn Marino const _Sequence*
173e4b17023SJohn Marino _M_get_sequence() const
174e4b17023SJohn Marino { return static_cast<const _Sequence*>(_M_ds); }
175e4b17023SJohn Marino };
176e4b17023SJohn Marino
177e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
178e4b17023SJohn Marino inline bool
179e4b17023SJohn Marino operator==(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
180e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
181e4b17023SJohn Marino { return __lhs.base() == __rhs.base(); }
182e4b17023SJohn Marino
183e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
184e4b17023SJohn Marino inline bool
185e4b17023SJohn Marino operator==(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
186e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
187e4b17023SJohn Marino { return __lhs.base() == __rhs.base(); }
188e4b17023SJohn Marino
189e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
190e4b17023SJohn Marino inline bool
191e4b17023SJohn Marino operator!=(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
192e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
193e4b17023SJohn Marino { return __lhs.base() != __rhs.base(); }
194e4b17023SJohn Marino
195e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
196e4b17023SJohn Marino inline bool
197e4b17023SJohn Marino operator!=(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
198e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
199e4b17023SJohn Marino { return __lhs.base() != __rhs.base(); }
200e4b17023SJohn Marino
201e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
202e4b17023SJohn Marino inline bool
203e4b17023SJohn Marino operator<(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
204e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
205e4b17023SJohn Marino { return __lhs.base() < __rhs.base(); }
206e4b17023SJohn Marino
207e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
208e4b17023SJohn Marino inline bool
209e4b17023SJohn Marino operator<(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
210e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
211e4b17023SJohn Marino { return __lhs.base() < __rhs.base(); }
212e4b17023SJohn Marino
213e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
214e4b17023SJohn Marino inline bool
215e4b17023SJohn Marino operator<=(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
216e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
217e4b17023SJohn Marino { return __lhs.base() <= __rhs.base(); }
218e4b17023SJohn Marino
219e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
220e4b17023SJohn Marino inline bool
221e4b17023SJohn Marino operator<=(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
222e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
223e4b17023SJohn Marino { return __lhs.base() <= __rhs.base(); }
224e4b17023SJohn Marino
225e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
226e4b17023SJohn Marino inline bool
227e4b17023SJohn Marino operator>(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
228e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
229e4b17023SJohn Marino { return __lhs.base() > __rhs.base(); }
230e4b17023SJohn Marino
231e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
232e4b17023SJohn Marino inline bool
233e4b17023SJohn Marino operator>(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
234e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
235e4b17023SJohn Marino { return __lhs.base() > __rhs.base(); }
236e4b17023SJohn Marino
237e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
238e4b17023SJohn Marino inline bool
239e4b17023SJohn Marino operator>=(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
240e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
241e4b17023SJohn Marino { return __lhs.base() >= __rhs.base(); }
242e4b17023SJohn Marino
243e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
244e4b17023SJohn Marino inline bool
245e4b17023SJohn Marino operator>=(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
246e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
247e4b17023SJohn Marino { return __lhs.base() >= __rhs.base(); }
248e4b17023SJohn Marino
249e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS
250e4b17023SJohn Marino // According to the resolution of DR179 not only the various comparison
251e4b17023SJohn Marino // operators but also operator- must accept mixed iterator/const_iterator
252e4b17023SJohn Marino // parameters.
253e4b17023SJohn Marino template<typename _IteratorL, typename _IteratorR, typename _Sequence>
254e4b17023SJohn Marino inline typename __iterator_tracker<_IteratorL, _Sequence>::difference_type
255e4b17023SJohn Marino operator-(const __iterator_tracker<_IteratorL, _Sequence>& __lhs,
256e4b17023SJohn Marino const __iterator_tracker<_IteratorR, _Sequence>& __rhs)
257e4b17023SJohn Marino { return __lhs.base() - __rhs.base(); }
258e4b17023SJohn Marino
259e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
260e4b17023SJohn Marino inline typename __iterator_tracker<_Iterator, _Sequence>::difference_type
261e4b17023SJohn Marino operator-(const __iterator_tracker<_Iterator, _Sequence>& __lhs,
262e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __rhs)
263e4b17023SJohn Marino { return __lhs.base() - __rhs.base(); }
264e4b17023SJohn Marino
265e4b17023SJohn Marino template<typename _Iterator, typename _Sequence>
266e4b17023SJohn Marino inline __iterator_tracker<_Iterator, _Sequence>
267e4b17023SJohn Marino operator+(typename __iterator_tracker<_Iterator,_Sequence>::difference_type
268e4b17023SJohn Marino __n,
269e4b17023SJohn Marino const __iterator_tracker<_Iterator, _Sequence>& __i)
270e4b17023SJohn Marino { return __i + __n; }
271e4b17023SJohn Marino
272e4b17023SJohn Marino } // namespace __profile
273e4b17023SJohn Marino } // namespace std
274e4b17023SJohn Marino #endif
275