1/* 2 * 3 * Copyright (c) 1994 4 * Hewlett-Packard Company 5 * 6 * Copyright (c) 1996,1997 7 * Silicon Graphics Computer Systems, Inc. 8 * 9 * Copyright (c) 1997 10 * Moscow Center for SPARC Technology 11 * 12 * Copyright (c) 1999 13 * Boris Fomitchev 14 * 15 * This material is provided "as is", with absolutely no warranty expressed 16 * or implied. Any use is at your own risk. 17 * 18 * Permission to use or copy this software for any purpose is hereby granted 19 * without fee, provided the above notices are retained on all copies. 20 * Permission to modify the code and to distribute modified code is granted, 21 * provided the above notices are retained, and a notice that the code was 22 * modified is included with the above copyright notice. 23 * 24 */ 25 26/* NOTE: This is an internal header file, included by other STL headers. 27 * You should not attempt to use it directly. 28 */ 29 30#ifndef _STLP_INTERNAL_MAP_H 31#define _STLP_INTERNAL_MAP_H 32 33#ifndef _STLP_INTERNAL_TREE_H 34# include <stl/_tree.h> 35#endif 36 37_STLP_BEGIN_NAMESPACE 38 39//Specific iterator traits creation 40_STLP_CREATE_ITERATOR_TRAITS(MapTraitsT, traits) 41 42template <class _Key, class _Tp, _STLP_DFL_TMPL_PARAM(_Compare, less<_Key> ), 43 _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_STLP_CONST _Key, _Tp) > 44class map 45#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 46 : public __stlport_class<map<_Key, _Tp, _Compare, _Alloc> > 47#endif 48{ 49 typedef map<_Key, _Tp, _Compare, _Alloc> _Self; 50public: 51 52// typedefs: 53 54 typedef _Key key_type; 55 typedef _Tp data_type; 56 typedef _Tp mapped_type; 57 typedef pair<_STLP_CONST _Key, _Tp> value_type; 58 typedef _Compare key_compare; 59 60 class value_compare 61 : public binary_function<value_type, value_type, bool> { 62 friend class map<_Key,_Tp,_Compare,_Alloc>; 63 protected : 64 //c is a Standard name (23.3.1), do no make it STLport naming convention compliant. 65 _Compare comp; 66 value_compare(_Compare __c) : comp(__c) {} 67 public: 68 bool operator()(const value_type& __x, const value_type& __y) const 69 { return comp(__x.first, __y.first); } 70 }; 71 72protected: 73 typedef _STLP_PRIV _MapTraitsT<value_type> _MapTraits; 74 75public: 76 //Following typedef have to be public for __move_traits specialization. 77 typedef _STLP_PRIV _Rb_tree<key_type, key_compare, 78 value_type, _STLP_SELECT1ST(value_type, _Key), 79 _MapTraits, _Alloc> _Rep_type; 80 81 typedef typename _Rep_type::pointer pointer; 82 typedef typename _Rep_type::const_pointer const_pointer; 83 typedef typename _Rep_type::reference reference; 84 typedef typename _Rep_type::const_reference const_reference; 85 typedef typename _Rep_type::iterator iterator; 86 typedef typename _Rep_type::const_iterator const_iterator; 87 typedef typename _Rep_type::reverse_iterator reverse_iterator; 88 typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; 89 typedef typename _Rep_type::size_type size_type; 90 typedef typename _Rep_type::difference_type difference_type; 91 typedef typename _Rep_type::allocator_type allocator_type; 92 93private: 94 _Rep_type _M_t; // red-black tree representing map 95 _STLP_KEY_TYPE_FOR_CONT_EXT(key_type) 96 97public: 98 // allocation/deallocation 99 map() : _M_t(_Compare(), allocator_type()) {} 100#if !defined (_STLP_DONT_SUP_DFLT_PARAM) 101 explicit map(const _Compare& __comp, 102 const allocator_type& __a = allocator_type()) 103#else 104 explicit map(const _Compare& __comp) 105 : _M_t(__comp, allocator_type()) {} 106 explicit map(const _Compare& __comp, const allocator_type& __a) 107#endif 108 : _M_t(__comp, __a) {} 109 110#if defined (_STLP_MEMBER_TEMPLATES) 111 template <class _InputIterator> 112 map(_InputIterator __first, _InputIterator __last) 113 : _M_t(_Compare(), allocator_type()) 114 { _M_t.insert_unique(__first, __last); } 115 116 template <class _InputIterator> 117 map(_InputIterator __first, _InputIterator __last, const _Compare& __comp, 118 const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) 119 : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } 120 121# if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS) 122 template <class _InputIterator> 123 map(_InputIterator __first, _InputIterator __last, const _Compare& __comp) 124 : _M_t(__comp, allocator_type()) { _M_t.insert_unique(__first, __last); } 125# endif 126 127#else 128 map(const value_type* __first, const value_type* __last) 129 : _M_t(_Compare(), allocator_type()) 130 { _M_t.insert_unique(__first, __last); } 131 132 map(const value_type* __first, 133 const value_type* __last, const _Compare& __comp, 134 const allocator_type& __a = allocator_type()) 135 : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } 136 137 map(const_iterator __first, const_iterator __last) 138 : _M_t(_Compare(), allocator_type()) 139 { _M_t.insert_unique(__first, __last); } 140 141 map(const_iterator __first, const_iterator __last, const _Compare& __comp, 142 const allocator_type& __a = allocator_type()) 143 : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); } 144#endif /* _STLP_MEMBER_TEMPLATES */ 145 146 map(const _Self& __x) : _M_t(__x._M_t) {} 147 148#if !defined (_STLP_NO_MOVE_SEMANTIC) 149 map(__move_source<_Self> src) 150 : _M_t(__move_source<_Rep_type>(src.get()._M_t)) {} 151#endif 152 153 _Self& operator=(const _Self& __x) { 154 _M_t = __x._M_t; 155 return *this; 156 } 157 158 // accessors: 159 key_compare key_comp() const { return _M_t.key_comp(); } 160 value_compare value_comp() const { return value_compare(_M_t.key_comp()); } 161 allocator_type get_allocator() const { return _M_t.get_allocator(); } 162 163 iterator begin() { return _M_t.begin(); } 164 const_iterator begin() const { return _M_t.begin(); } 165 iterator end() { return _M_t.end(); } 166 const_iterator end() const { return _M_t.end(); } 167 reverse_iterator rbegin() { return _M_t.rbegin(); } 168 const_reverse_iterator rbegin() const { return _M_t.rbegin(); } 169 reverse_iterator rend() { return _M_t.rend(); } 170 const_reverse_iterator rend() const { return _M_t.rend(); } 171 bool empty() const { return _M_t.empty(); } 172 size_type size() const { return _M_t.size(); } 173 size_type max_size() const { return _M_t.max_size(); } 174 _STLP_TEMPLATE_FOR_CONT_EXT 175 _Tp& operator[](const _KT& __k) { 176 iterator __i = lower_bound(__k); 177 // __i->first is greater than or equivalent to __k. 178 if (__i == end() || key_comp()(__k, (*__i).first)) 179 __i = insert(__i, value_type(__k, _STLP_DEFAULT_CONSTRUCTED(_Tp))); 180 return (*__i).second; 181 } 182 void swap(_Self& __x) { _M_t.swap(__x._M_t); } 183#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 184 void _M_swap_workaround(_Self& __x) { swap(__x); } 185#endif 186 187 // insert/erase 188 pair<iterator,bool> insert(const value_type& __x) 189 { return _M_t.insert_unique(__x); } 190 iterator insert(iterator __pos, const value_type& __x) 191 { return _M_t.insert_unique(__pos, __x); } 192#ifdef _STLP_MEMBER_TEMPLATES 193 template <class _InputIterator> 194 void insert(_InputIterator __first, _InputIterator __last) 195 { _M_t.insert_unique(__first, __last); } 196#else 197 void insert(const value_type* __first, const value_type* __last) 198 { _M_t.insert_unique(__first, __last); } 199 void insert(const_iterator __first, const_iterator __last) 200 { _M_t.insert_unique(__first, __last); } 201#endif /* _STLP_MEMBER_TEMPLATES */ 202 203 void erase(iterator __pos) { _M_t.erase(__pos); } 204 size_type erase(const key_type& __x) { return _M_t.erase_unique(__x); } 205 void erase(iterator __first, iterator __last) { _M_t.erase(__first, __last); } 206 void clear() { _M_t.clear(); } 207 208 // map operations: 209 _STLP_TEMPLATE_FOR_CONT_EXT 210 iterator find(const _KT& __x) { return _M_t.find(__x); } 211 _STLP_TEMPLATE_FOR_CONT_EXT 212 const_iterator find(const _KT& __x) const { return _M_t.find(__x); } 213 _STLP_TEMPLATE_FOR_CONT_EXT 214 size_type count(const _KT& __x) const { return _M_t.find(__x) == _M_t.end() ? 0 : 1; } 215 _STLP_TEMPLATE_FOR_CONT_EXT 216 iterator lower_bound(const _KT& __x) { return _M_t.lower_bound(__x); } 217 _STLP_TEMPLATE_FOR_CONT_EXT 218 const_iterator lower_bound(const _KT& __x) const { return _M_t.lower_bound(__x); } 219 _STLP_TEMPLATE_FOR_CONT_EXT 220 iterator upper_bound(const _KT& __x) { return _M_t.upper_bound(__x); } 221 _STLP_TEMPLATE_FOR_CONT_EXT 222 const_iterator upper_bound(const _KT& __x) const { return _M_t.upper_bound(__x); } 223 224 _STLP_TEMPLATE_FOR_CONT_EXT 225 pair<iterator,iterator> equal_range(const _KT& __x) 226 { return _M_t.equal_range_unique(__x); } 227 _STLP_TEMPLATE_FOR_CONT_EXT 228 pair<const_iterator,const_iterator> equal_range(const _KT& __x) const 229 { return _M_t.equal_range_unique(__x); } 230}; 231 232//Specific iterator traits creation 233_STLP_CREATE_ITERATOR_TRAITS(MultimapTraitsT, traits) 234 235template <class _Key, class _Tp, _STLP_DFL_TMPL_PARAM(_Compare, less<_Key> ), 236 _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_STLP_CONST _Key, _Tp) > 237class multimap 238#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 239 : public __stlport_class<multimap<_Key, _Tp, _Compare, _Alloc> > 240#endif 241{ 242 typedef multimap<_Key, _Tp, _Compare, _Alloc> _Self; 243public: 244 245// typedefs: 246 247 typedef _Key key_type; 248 typedef _Tp data_type; 249 typedef _Tp mapped_type; 250 typedef pair<_STLP_CONST _Key, _Tp> value_type; 251 typedef _Compare key_compare; 252 253 class value_compare : public binary_function<value_type, value_type, bool> { 254 friend class multimap<_Key,_Tp,_Compare,_Alloc>; 255 protected: 256 //comp is a Standard name (23.3.2), do no make it STLport naming convention compliant. 257 _Compare comp; 258 value_compare(_Compare __c) : comp(__c) {} 259 public: 260 bool operator()(const value_type& __x, const value_type& __y) const 261 { return comp(__x.first, __y.first); } 262 }; 263 264protected: 265 //Specific iterator traits creation 266 typedef _STLP_PRIV _MultimapTraitsT<value_type> _MultimapTraits; 267 268public: 269 //Following typedef have to be public for __move_traits specialization. 270 typedef _STLP_PRIV _Rb_tree<key_type, key_compare, 271 value_type, _STLP_SELECT1ST(value_type, _Key), 272 _MultimapTraits, _Alloc> _Rep_type; 273 274 typedef typename _Rep_type::pointer pointer; 275 typedef typename _Rep_type::const_pointer const_pointer; 276 typedef typename _Rep_type::reference reference; 277 typedef typename _Rep_type::const_reference const_reference; 278 typedef typename _Rep_type::iterator iterator; 279 typedef typename _Rep_type::const_iterator const_iterator; 280 typedef typename _Rep_type::reverse_iterator reverse_iterator; 281 typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; 282 typedef typename _Rep_type::size_type size_type; 283 typedef typename _Rep_type::difference_type difference_type; 284 typedef typename _Rep_type::allocator_type allocator_type; 285 286private: 287 _Rep_type _M_t; // red-black tree representing multimap 288 _STLP_KEY_TYPE_FOR_CONT_EXT(key_type) 289 290public: 291 // allocation/deallocation 292 multimap() : _M_t(_Compare(), allocator_type()) { } 293 explicit multimap(const _Compare& __comp, 294 const allocator_type& __a = allocator_type()) 295 : _M_t(__comp, __a) { } 296 297#ifdef _STLP_MEMBER_TEMPLATES 298 template <class _InputIterator> 299 multimap(_InputIterator __first, _InputIterator __last) 300 : _M_t(_Compare(), allocator_type()) 301 { _M_t.insert_equal(__first, __last); } 302# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS 303 template <class _InputIterator> 304 multimap(_InputIterator __first, _InputIterator __last, 305 const _Compare& __comp) 306 : _M_t(__comp, allocator_type()) { _M_t.insert_equal(__first, __last); } 307# endif 308 template <class _InputIterator> 309 multimap(_InputIterator __first, _InputIterator __last, 310 const _Compare& __comp, 311 const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) 312 : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } 313#else 314 multimap(const value_type* __first, const value_type* __last) 315 : _M_t(_Compare(), allocator_type()) 316 { _M_t.insert_equal(__first, __last); } 317 multimap(const value_type* __first, const value_type* __last, 318 const _Compare& __comp, 319 const allocator_type& __a = allocator_type()) 320 : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } 321 322 multimap(const_iterator __first, const_iterator __last) 323 : _M_t(_Compare(), allocator_type()) 324 { _M_t.insert_equal(__first, __last); } 325 multimap(const_iterator __first, const_iterator __last, 326 const _Compare& __comp, 327 const allocator_type& __a = allocator_type()) 328 : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); } 329#endif /* _STLP_MEMBER_TEMPLATES */ 330 331 multimap(const _Self& __x) : _M_t(__x._M_t) {} 332 333#if !defined (_STLP_NO_MOVE_SEMANTIC) 334 multimap(__move_source<_Self> src) 335 : _M_t(__move_source<_Rep_type>(src.get()._M_t)) {} 336#endif 337 338 _Self& operator=(const _Self& __x) { 339 _M_t = __x._M_t; 340 return *this; 341 } 342 343 // accessors: 344 345 key_compare key_comp() const { return _M_t.key_comp(); } 346 value_compare value_comp() const { return value_compare(_M_t.key_comp()); } 347 allocator_type get_allocator() const { return _M_t.get_allocator(); } 348 349 iterator begin() { return _M_t.begin(); } 350 const_iterator begin() const { return _M_t.begin(); } 351 iterator end() { return _M_t.end(); } 352 const_iterator end() const { return _M_t.end(); } 353 reverse_iterator rbegin() { return _M_t.rbegin(); } 354 const_reverse_iterator rbegin() const { return _M_t.rbegin(); } 355 reverse_iterator rend() { return _M_t.rend(); } 356 const_reverse_iterator rend() const { return _M_t.rend(); } 357 bool empty() const { return _M_t.empty(); } 358 size_type size() const { return _M_t.size(); } 359 size_type max_size() const { return _M_t.max_size(); } 360 void swap(_Self& __x) { _M_t.swap(__x._M_t); } 361#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 362 void _M_swap_workaround(_Self& __x) { swap(__x); } 363#endif 364 365 // insert/erase 366 iterator insert(const value_type& __x) { return _M_t.insert_equal(__x); } 367 iterator insert(iterator __pos, const value_type& __x) { return _M_t.insert_equal(__pos, __x); } 368#if defined (_STLP_MEMBER_TEMPLATES) 369 template <class _InputIterator> 370 void insert(_InputIterator __first, _InputIterator __last) 371 { _M_t.insert_equal(__first, __last); } 372#else 373 void insert(const value_type* __first, const value_type* __last) 374 { _M_t.insert_equal(__first, __last); } 375 void insert(const_iterator __first, const_iterator __last) 376 { _M_t.insert_equal(__first, __last); } 377#endif /* _STLP_MEMBER_TEMPLATES */ 378 void erase(iterator __pos) { _M_t.erase(__pos); } 379 size_type erase(const key_type& __x) { return _M_t.erase(__x); } 380 void erase(iterator __first, iterator __last) { _M_t.erase(__first, __last); } 381 void clear() { _M_t.clear(); } 382 383 // multimap operations: 384 385 _STLP_TEMPLATE_FOR_CONT_EXT 386 iterator find(const _KT& __x) { return _M_t.find(__x); } 387 _STLP_TEMPLATE_FOR_CONT_EXT 388 const_iterator find(const _KT& __x) const { return _M_t.find(__x); } 389 _STLP_TEMPLATE_FOR_CONT_EXT 390 size_type count(const _KT& __x) const { return _M_t.count(__x); } 391 _STLP_TEMPLATE_FOR_CONT_EXT 392 iterator lower_bound(const _KT& __x) { return _M_t.lower_bound(__x); } 393 _STLP_TEMPLATE_FOR_CONT_EXT 394 const_iterator lower_bound(const _KT& __x) const { return _M_t.lower_bound(__x); } 395 _STLP_TEMPLATE_FOR_CONT_EXT 396 iterator upper_bound(const _KT& __x) { return _M_t.upper_bound(__x); } 397 _STLP_TEMPLATE_FOR_CONT_EXT 398 const_iterator upper_bound(const _KT& __x) const { return _M_t.upper_bound(__x); } 399 _STLP_TEMPLATE_FOR_CONT_EXT 400 pair<iterator,iterator> equal_range(const _KT& __x) 401 { return _M_t.equal_range(__x); } 402 _STLP_TEMPLATE_FOR_CONT_EXT 403 pair<const_iterator,const_iterator> equal_range(const _KT& __x) const 404 { return _M_t.equal_range(__x); } 405}; 406 407#define _STLP_TEMPLATE_HEADER template <class _Key, class _Tp, class _Compare, class _Alloc> 408#define _STLP_TEMPLATE_CONTAINER map<_Key,_Tp,_Compare,_Alloc> 409#include <stl/_relops_cont.h> 410#undef _STLP_TEMPLATE_CONTAINER 411#define _STLP_TEMPLATE_CONTAINER multimap<_Key,_Tp,_Compare,_Alloc> 412#include <stl/_relops_cont.h> 413#undef _STLP_TEMPLATE_CONTAINER 414#undef _STLP_TEMPLATE_HEADER 415 416#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC) 417template <class _Key, class _Tp, class _Compare, class _Alloc> 418struct __move_traits<map<_Key,_Tp,_Compare,_Alloc> > : 419 _STLP_PRIV __move_traits_aux<typename map<_Key,_Tp,_Compare,_Alloc>::_Rep_type> 420{}; 421 422template <class _Key, class _Tp, class _Compare, class _Alloc> 423struct __move_traits<multimap<_Key,_Tp,_Compare,_Alloc> > : 424 _STLP_PRIV __move_traits_aux<typename multimap<_Key,_Tp,_Compare,_Alloc>::_Rep_type> 425{}; 426#endif 427 428_STLP_END_NAMESPACE 429 430#endif /* _STLP_INTERNAL_MAP_H */ 431 432// Local Variables: 433// mode:C++ 434// End: 435 436