• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/arm-linux/include/c++/4.5.3/debug/
1// Debugging multiset implementation -*- C++ -*-
2
3// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 3, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// Under Section 7 of GPL version 3, you are granted additional
18// permissions described in the GCC Runtime Library Exception, version
19// 3.1, as published by the Free Software Foundation.
20
21// You should have received a copy of the GNU General Public License and
22// a copy of the GCC Runtime Library Exception along with this program;
23// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24// <http://www.gnu.org/licenses/>.
25
26/** @file debug/multiset.h
27 *  This file is a GNU debug extension to the Standard C++ Library.
28 */
29
30#ifndef _GLIBCXX_DEBUG_MULTISET_H
31#define _GLIBCXX_DEBUG_MULTISET_H 1
32
33#include <debug/safe_sequence.h>
34#include <debug/safe_iterator.h>
35#include <utility>
36
37namespace std
38{
39namespace __debug
40{
41  /// Class std::multiset with safety/checking/debug instrumentation.
42  template<typename _Key, typename _Compare = std::less<_Key>,
43	   typename _Allocator = std::allocator<_Key> >
44    class multiset
45    : public _GLIBCXX_STD_D::multiset<_Key, _Compare, _Allocator>,
46      public __gnu_debug::_Safe_sequence<multiset<_Key, _Compare, _Allocator> >
47    {
48      typedef _GLIBCXX_STD_D::multiset<_Key, _Compare, _Allocator> _Base;
49      typedef __gnu_debug::_Safe_sequence<multiset> _Safe_base;
50
51    public:
52      // types:
53      typedef _Key				     key_type;
54      typedef _Key				     value_type;
55      typedef _Compare				     key_compare;
56      typedef _Compare				     value_compare;
57      typedef _Allocator			     allocator_type;
58      typedef typename _Base::reference	             reference;
59      typedef typename _Base::const_reference        const_reference;
60
61      typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, multiset>
62      iterator;
63      typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
64					  multiset> const_iterator;
65
66      typedef typename _Base::size_type              size_type;
67      typedef typename _Base::difference_type        difference_type;
68      typedef typename _Base::pointer                pointer;
69      typedef typename _Base::const_pointer          const_pointer;
70      typedef std::reverse_iterator<iterator>        reverse_iterator;
71      typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
72
73      // 23.3.3.1 construct/copy/destroy:
74      explicit multiset(const _Compare& __comp = _Compare(),
75			const _Allocator& __a = _Allocator())
76      : _Base(__comp, __a) { }
77
78      template<typename _InputIterator>
79        multiset(_InputIterator __first, _InputIterator __last,
80		 const _Compare& __comp = _Compare(),
81		 const _Allocator& __a = _Allocator())
82	: _Base(__gnu_debug::__check_valid_range(__first, __last), __last,
83		__comp, __a) { }
84
85      multiset(const multiset& __x)
86      : _Base(__x), _Safe_base() { }
87
88      multiset(const _Base& __x)
89      : _Base(__x), _Safe_base() { }
90
91#ifdef __GXX_EXPERIMENTAL_CXX0X__
92      multiset(multiset&& __x)
93      : _Base(std::forward<multiset>(__x)), _Safe_base()
94      { this->_M_swap(__x); }
95
96      multiset(initializer_list<value_type> __l,
97	       const _Compare& __comp = _Compare(),
98	       const allocator_type& __a = allocator_type())
99      : _Base(__l, __comp, __a), _Safe_base() { }
100#endif
101
102      ~multiset() { }
103
104      multiset&
105      operator=(const multiset& __x)
106      {
107	*static_cast<_Base*>(this) = __x;
108	this->_M_invalidate_all();
109	return *this;
110      }
111
112#ifdef __GXX_EXPERIMENTAL_CXX0X__
113      multiset&
114      operator=(multiset&& __x)
115      {
116	// NB: DR 1204.
117	// NB: DR 675.
118	clear();
119	swap(__x);
120	return *this;
121      }
122
123      multiset&
124      operator=(initializer_list<value_type> __l)
125      {
126	this->clear();
127	this->insert(__l);
128	return *this;
129      }
130#endif
131
132      using _Base::get_allocator;
133
134      // iterators:
135      iterator
136      begin()
137      { return iterator(_Base::begin(), this); }
138
139      const_iterator
140      begin() const
141      { return const_iterator(_Base::begin(), this); }
142
143      iterator
144      end()
145      { return iterator(_Base::end(), this); }
146
147      const_iterator
148      end() const
149      { return const_iterator(_Base::end(), this); }
150
151      reverse_iterator
152      rbegin()
153      { return reverse_iterator(end()); }
154
155      const_reverse_iterator
156      rbegin() const
157      { return const_reverse_iterator(end()); }
158
159      reverse_iterator
160      rend()
161      { return reverse_iterator(begin()); }
162
163      const_reverse_iterator
164      rend() const
165      { return const_reverse_iterator(begin()); }
166
167#ifdef __GXX_EXPERIMENTAL_CXX0X__
168      const_iterator
169      cbegin() const
170      { return const_iterator(_Base::begin(), this); }
171
172      const_iterator
173      cend() const
174      { return const_iterator(_Base::end(), this); }
175
176      const_reverse_iterator
177      crbegin() const
178      { return const_reverse_iterator(end()); }
179
180      const_reverse_iterator
181      crend() const
182      { return const_reverse_iterator(begin()); }
183#endif
184
185      // capacity:
186      using _Base::empty;
187      using _Base::size;
188      using _Base::max_size;
189
190      // modifiers:
191      iterator
192      insert(const value_type& __x)
193      { return iterator(_Base::insert(__x), this); }
194
195      iterator
196      insert(iterator __position, const value_type& __x)
197      {
198	__glibcxx_check_insert(__position);
199	return iterator(_Base::insert(__position.base(), __x), this);
200      }
201
202      template<typename _InputIterator>
203      void
204      insert(_InputIterator __first, _InputIterator __last)
205      {
206	__glibcxx_check_valid_range(__first, __last);
207	_Base::insert(__first, __last);
208      }
209
210#ifdef __GXX_EXPERIMENTAL_CXX0X__
211      void
212      insert(initializer_list<value_type> __l)
213      { _Base::insert(__l); }
214#endif
215
216#ifdef __GXX_EXPERIMENTAL_CXX0X__
217      iterator
218      erase(iterator __position)
219      {
220	__glibcxx_check_erase(__position);
221	__position._M_invalidate();
222	return iterator(_Base::erase(__position.base()), this);
223      }
224#else
225      void
226      erase(iterator __position)
227      {
228	__glibcxx_check_erase(__position);
229	__position._M_invalidate();
230	_Base::erase(__position.base());
231      }
232#endif
233
234      size_type
235      erase(const key_type& __x)
236      {
237	std::pair<iterator, iterator> __victims = this->equal_range(__x);
238	size_type __count = 0;
239	while (__victims.first != __victims.second)
240	{
241	  iterator __victim = __victims.first++;
242	  __victim._M_invalidate();
243	  _Base::erase(__victim.base());
244	  ++__count;
245	}
246	return __count;
247      }
248
249#ifdef __GXX_EXPERIMENTAL_CXX0X__
250      iterator
251      erase(iterator __first, iterator __last)
252      {
253	// _GLIBCXX_RESOLVE_LIB_DEFECTS
254	// 151. can't currently clear() empty container
255	__glibcxx_check_erase_range(__first, __last);
256	while (__first != __last)
257	  this->erase(__first++);
258	return __last;
259      }
260#else
261      void
262      erase(iterator __first, iterator __last)
263      {
264	// _GLIBCXX_RESOLVE_LIB_DEFECTS
265	// 151. can't currently clear() empty container
266	__glibcxx_check_erase_range(__first, __last);
267	while (__first != __last)
268	  this->erase(__first++);
269      }
270#endif
271
272      void
273      swap(multiset& __x)
274      {
275	_Base::swap(__x);
276	this->_M_swap(__x);
277      }
278
279      void
280      clear()
281      { this->erase(begin(), end()); }
282
283      // observers:
284      using _Base::key_comp;
285      using _Base::value_comp;
286
287      // multiset operations:
288      iterator
289      find(const key_type& __x)
290      { return iterator(_Base::find(__x), this); }
291
292      // _GLIBCXX_RESOLVE_LIB_DEFECTS
293      // 214. set::find() missing const overload
294      const_iterator
295      find(const key_type& __x) const
296      { return const_iterator(_Base::find(__x), this); }
297
298      using _Base::count;
299
300      iterator
301      lower_bound(const key_type& __x)
302      { return iterator(_Base::lower_bound(__x), this); }
303
304      // _GLIBCXX_RESOLVE_LIB_DEFECTS
305      // 214. set::find() missing const overload
306      const_iterator
307      lower_bound(const key_type& __x) const
308      { return const_iterator(_Base::lower_bound(__x), this); }
309
310      iterator
311      upper_bound(const key_type& __x)
312      { return iterator(_Base::upper_bound(__x), this); }
313
314      // _GLIBCXX_RESOLVE_LIB_DEFECTS
315      // 214. set::find() missing const overload
316      const_iterator
317      upper_bound(const key_type& __x) const
318      { return const_iterator(_Base::upper_bound(__x), this); }
319
320      std::pair<iterator,iterator>
321      equal_range(const key_type& __x)
322      {
323	typedef typename _Base::iterator _Base_iterator;
324	std::pair<_Base_iterator, _Base_iterator> __res =
325        _Base::equal_range(__x);
326	return std::make_pair(iterator(__res.first, this),
327			      iterator(__res.second, this));
328      }
329
330      // _GLIBCXX_RESOLVE_LIB_DEFECTS
331      // 214. set::find() missing const overload
332      std::pair<const_iterator,const_iterator>
333      equal_range(const key_type& __x) const
334      {
335	typedef typename _Base::const_iterator _Base_iterator;
336	std::pair<_Base_iterator, _Base_iterator> __res =
337        _Base::equal_range(__x);
338	return std::make_pair(const_iterator(__res.first, this),
339			      const_iterator(__res.second, this));
340      }
341
342      _Base&
343      _M_base() { return *this; }
344
345      const _Base&
346      _M_base() const { return *this; }
347
348    private:
349      void
350      _M_invalidate_all()
351      {
352	typedef typename _Base::const_iterator _Base_const_iterator;
353	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
354	this->_M_invalidate_if(_Not_equal(_M_base().end()));
355      }
356    };
357
358  template<typename _Key, typename _Compare, typename _Allocator>
359    inline bool
360    operator==(const multiset<_Key, _Compare, _Allocator>& __lhs,
361	       const multiset<_Key, _Compare, _Allocator>& __rhs)
362    { return __lhs._M_base() == __rhs._M_base(); }
363
364  template<typename _Key, typename _Compare, typename _Allocator>
365    inline bool
366    operator!=(const multiset<_Key, _Compare, _Allocator>& __lhs,
367	       const multiset<_Key, _Compare, _Allocator>& __rhs)
368    { return __lhs._M_base() != __rhs._M_base(); }
369
370  template<typename _Key, typename _Compare, typename _Allocator>
371    inline bool
372    operator<(const multiset<_Key, _Compare, _Allocator>& __lhs,
373	      const multiset<_Key, _Compare, _Allocator>& __rhs)
374    { return __lhs._M_base() < __rhs._M_base(); }
375
376  template<typename _Key, typename _Compare, typename _Allocator>
377    inline bool
378    operator<=(const multiset<_Key, _Compare, _Allocator>& __lhs,
379	       const multiset<_Key, _Compare, _Allocator>& __rhs)
380    { return __lhs._M_base() <= __rhs._M_base(); }
381
382  template<typename _Key, typename _Compare, typename _Allocator>
383    inline bool
384    operator>=(const multiset<_Key, _Compare, _Allocator>& __lhs,
385	       const multiset<_Key, _Compare, _Allocator>& __rhs)
386    { return __lhs._M_base() >= __rhs._M_base(); }
387
388  template<typename _Key, typename _Compare, typename _Allocator>
389    inline bool
390    operator>(const multiset<_Key, _Compare, _Allocator>& __lhs,
391	      const multiset<_Key, _Compare, _Allocator>& __rhs)
392    { return __lhs._M_base() > __rhs._M_base(); }
393
394  template<typename _Key, typename _Compare, typename _Allocator>
395    void
396    swap(multiset<_Key, _Compare, _Allocator>& __x,
397	 multiset<_Key, _Compare, _Allocator>& __y)
398    { return __x.swap(__y); }
399
400} // namespace __debug
401} // namespace std
402
403#endif
404