OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libstdc++-v3/] [include/] [debug/] [map.h] - Blame information for rev 17

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 17 jlechner
// Debugging map implementation -*- C++ -*-
2
 
3
// Copyright (C) 2003, 2004, 2005
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 2, 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
// You should have received a copy of the GNU General Public License along
18
// with this library; see the file COPYING.  If not, write to the Free
19
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20
// USA.
21
 
22
// As a special exception, you may use this file as part of a free software
23
// library without restriction.  Specifically, if other files instantiate
24
// templates or use macros or inline functions from this file, or you compile
25
// this file and link it with other files to produce an executable, this
26
// file does not by itself cause the resulting executable to be covered by
27
// the GNU General Public License.  This exception does not however
28
// invalidate any other reasons why the executable file might be covered by
29
// the GNU General Public License.
30
 
31
#ifndef _GLIBCXX_DEBUG_MAP_H
32
#define _GLIBCXX_DEBUG_MAP_H 1
33
 
34
#include <debug/safe_sequence.h>
35
#include <debug/safe_iterator.h>
36
#include <utility>
37
 
38
namespace __gnu_debug_def
39
{
40
  template<typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
41
           typename _Allocator = std::allocator<std::pair<const _Key, _Tp> > >
42
    class map
43
    : public _GLIBCXX_STD::map<_Key, _Tp, _Compare, _Allocator>,
44
      public __gnu_debug::_Safe_sequence<map<_Key, _Tp, _Compare, _Allocator> >
45
    {
46
      typedef _GLIBCXX_STD::map<_Key, _Tp, _Compare, _Allocator> _Base;
47
      typedef __gnu_debug::_Safe_sequence<map> _Safe_base;
48
 
49
    public:
50
      // types:
51
      typedef _Key                                  key_type;
52
      typedef _Tp                                   mapped_type;
53
      typedef std::pair<const _Key, _Tp>            value_type;
54
      typedef _Compare                              key_compare;
55
      typedef _Allocator                            allocator_type;
56
      typedef typename _Base::reference             reference;
57
      typedef typename _Base::const_reference       const_reference;
58
 
59
      typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, map>
60
                                                    iterator;
61
      typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator, map>
62
                                                    const_iterator;
63
 
64
      typedef typename _Base::size_type             size_type;
65
      typedef typename _Base::difference_type       difference_type;
66
      typedef typename _Base::pointer               pointer;
67
      typedef typename _Base::const_pointer         const_pointer;
68
      typedef std::reverse_iterator<iterator>       reverse_iterator;
69
      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
70
 
71
      using _Base::value_compare;
72
 
73
      // 23.3.1.1 construct/copy/destroy:
74
      explicit map(const _Compare& __comp = _Compare(),
75
                   const _Allocator& __a = _Allocator())
76
      : _Base(__comp, __a) { }
77
 
78
      template<typename _InputIterator>
79
        map(_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), _Safe_base() { }
84
 
85
      map(const map<_Key,_Tp,_Compare,_Allocator>& __x)
86
      : _Base(__x), _Safe_base() { }
87
 
88
      map(const _Base& __x) : _Base(__x), _Safe_base() { }
89
 
90
      ~map() { }
91
 
92
      map<_Key,_Tp,_Compare,_Allocator>&
93
      operator=(const map<_Key,_Tp,_Compare,_Allocator>& __x)
94
      {
95
        *static_cast<_Base*>(this) = __x;
96
        this->_M_invalidate_all();
97
        return *this;
98
      }
99
 
100
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
101
      // 133. map missing get_allocator()
102
      using _Base::get_allocator;
103
 
104
      // iterators:
105
      iterator
106
      begin()
107
      { return iterator(_Base::begin(), this); }
108
 
109
      const_iterator
110
      begin() const
111
      { return const_iterator(_Base::begin(), this); }
112
 
113
      iterator
114
      end()
115
      { return iterator(_Base::end(), this); }
116
 
117
      const_iterator
118
      end() const
119
      { return const_iterator(_Base::end(), this); }
120
 
121
      reverse_iterator
122
      rbegin()
123
      { return reverse_iterator(end()); }
124
 
125
      const_reverse_iterator
126
      rbegin() const
127
      { return const_reverse_iterator(end()); }
128
 
129
      reverse_iterator
130
      rend()
131
      { return reverse_iterator(begin()); }
132
 
133
      const_reverse_iterator
134
      rend() const
135
      { return const_reverse_iterator(begin()); }
136
 
137
      // capacity:
138
      using _Base::empty;
139
      using _Base::size;
140
      using _Base::max_size;
141
 
142
      // 23.3.1.2 element access:
143
      using _Base::operator[];
144
 
145
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
146
      // DR 464. Suggestion for new member functions in standard containers.
147
      using _Base::at;
148
 
149
      // modifiers:
150
      std::pair<iterator, bool>
151
      insert(const value_type& __x)
152
      {
153
        typedef typename _Base::iterator _Base_iterator;
154
        std::pair<_Base_iterator, bool> __res = _Base::insert(__x);
155
        return std::pair<iterator, bool>(iterator(__res.first, this),
156
                                         __res.second);
157
      }
158
 
159
      iterator
160
      insert(iterator __position, const value_type& __x)
161
      {
162
        __glibcxx_check_insert(__position);
163
        return iterator(_Base::insert(__position.base(), __x), this);
164
      }
165
 
166
      template<typename _InputIterator>
167
        void
168
        insert(_InputIterator __first, _InputIterator __last)
169
        {
170
          __glibcxx_check_valid_range(__first, __last);
171
          _Base::insert(__first, __last);
172
        }
173
 
174
      void
175
      erase(iterator __position)
176
      {
177
        __glibcxx_check_erase(__position);
178
        __position._M_invalidate();
179
        _Base::erase(__position.base());
180
      }
181
 
182
      size_type
183
      erase(const key_type& __x)
184
      {
185
        iterator __victim = find(__x);
186
        if (__victim == end())
187
          return 0;
188
        else
189
        {
190
          __victim._M_invalidate();
191
          _Base::erase(__victim.base());
192
          return 1;
193
        }
194
      }
195
 
196
      void
197
      erase(iterator __first, iterator __last)
198
      {
199
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
200
        // 151. can't currently clear() empty container
201
        __glibcxx_check_erase_range(__first, __last);
202
        while (__first != __last)
203
          this->erase(__first++);
204
      }
205
 
206
      void
207
      swap(map<_Key,_Tp,_Compare,_Allocator>& __x)
208
      {
209
        _Base::swap(__x);
210
        this->_M_swap(__x);
211
      }
212
 
213
      void
214
      clear()
215
      { this->erase(begin(), end()); }
216
 
217
      // observers:
218
      using _Base::key_comp;
219
      using _Base::value_comp;
220
 
221
      // 23.3.1.3 map operations:
222
      iterator
223
      find(const key_type& __x)
224
      { return iterator(_Base::find(__x), this); }
225
 
226
      const_iterator
227
      find(const key_type& __x) const
228
      { return const_iterator(_Base::find(__x), this); }
229
 
230
      using _Base::count;
231
 
232
      iterator
233
      lower_bound(const key_type& __x)
234
      { return iterator(_Base::lower_bound(__x), this); }
235
 
236
      const_iterator
237
      lower_bound(const key_type& __x) const
238
      { return const_iterator(_Base::lower_bound(__x), this); }
239
 
240
      iterator
241
      upper_bound(const key_type& __x)
242
      { return iterator(_Base::upper_bound(__x), this); }
243
 
244
      const_iterator
245
      upper_bound(const key_type& __x) const
246
      { return const_iterator(_Base::upper_bound(__x), this); }
247
 
248
      std::pair<iterator,iterator>
249
      equal_range(const key_type& __x)
250
      {
251
        typedef typename _Base::iterator _Base_iterator;
252
        std::pair<_Base_iterator, _Base_iterator> __res =
253
        _Base::equal_range(__x);
254
        return std::make_pair(iterator(__res.first, this),
255
                              iterator(__res.second, this));
256
      }
257
 
258
      std::pair<const_iterator,const_iterator>
259
      equal_range(const key_type& __x) const
260
      {
261
        typedef typename _Base::const_iterator _Base_const_iterator;
262
        std::pair<_Base_const_iterator, _Base_const_iterator> __res =
263
        _Base::equal_range(__x);
264
        return std::make_pair(const_iterator(__res.first, this),
265
                              const_iterator(__res.second, this));
266
      }
267
 
268
      _Base&
269
      _M_base() { return *this; }
270
 
271
      const _Base&
272
      _M_base() const { return *this; }
273
 
274
    private:
275
      void
276
      _M_invalidate_all()
277
      {
278
        typedef typename _Base::const_iterator _Base_const_iterator;
279
        typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
280
        this->_M_invalidate_if(_Not_equal(_M_base().end()));
281
      }
282
    };
283
 
284
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
285
    inline bool
286
    operator==(const map<_Key,_Tp,_Compare,_Allocator>& __lhs,
287
               const map<_Key,_Tp,_Compare,_Allocator>& __rhs)
288
    { return __lhs._M_base() == __rhs._M_base(); }
289
 
290
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
291
    inline bool
292
    operator!=(const map<_Key,_Tp,_Compare,_Allocator>& __lhs,
293
               const map<_Key,_Tp,_Compare,_Allocator>& __rhs)
294
    { return __lhs._M_base() != __rhs._M_base(); }
295
 
296
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
297
    inline bool
298
    operator<(const map<_Key,_Tp,_Compare,_Allocator>& __lhs,
299
              const map<_Key,_Tp,_Compare,_Allocator>& __rhs)
300
    { return __lhs._M_base() < __rhs._M_base(); }
301
 
302
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
303
    inline bool
304
    operator<=(const map<_Key,_Tp,_Compare,_Allocator>& __lhs,
305
               const map<_Key,_Tp,_Compare,_Allocator>& __rhs)
306
    { return __lhs._M_base() <= __rhs._M_base(); }
307
 
308
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
309
    inline bool
310
    operator>=(const map<_Key,_Tp,_Compare,_Allocator>& __lhs,
311
               const map<_Key,_Tp,_Compare,_Allocator>& __rhs)
312
    { return __lhs._M_base() >= __rhs._M_base(); }
313
 
314
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
315
    inline bool
316
    operator>(const map<_Key,_Tp,_Compare,_Allocator>& __lhs,
317
              const map<_Key,_Tp,_Compare,_Allocator>& __rhs)
318
    { return __lhs._M_base() > __rhs._M_base(); }
319
 
320
  template<typename _Key,typename _Tp,typename _Compare,typename _Allocator>
321
    inline void
322
    swap(map<_Key,_Tp,_Compare,_Allocator>& __lhs,
323
         map<_Key,_Tp,_Compare,_Allocator>& __rhs)
324
    { __lhs.swap(__rhs); }
325
} // namespace __gnu_debug_def
326
 
327
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.