xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/profile/iterator_tracker.h (revision 81fc95a5293ee307c688a350a3feb4734aaddbb4)
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