Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygen_set.h
Go to the documentation of this file.
00001 /* 00002 * Copyright (c) 2005 00003 * Francois Dumont 00004 * 00005 * This material is provided "as is", with absolutely no warranty expressed 00006 * or implied. Any use is at your own risk. 00007 * 00008 * Permission to use or copy this software for any purpose is hereby granted 00009 * without fee, provided the above notices are retained on all copies. 00010 * Permission to modify the code and to distribute modified code is granted, 00011 * provided the above notices are retained, and a notice that the code was 00012 * modified is included with the above copyright notice. 00013 */ 00014 00015 /* NOTE: This is an internal header file, included by other STL headers. 00016 * You should not attempt to use it directly. 00017 */ 00018 00019 #ifndef _STLP_PTR_SPECIALIZED_SET_H 00020 #define _STLP_PTR_SPECIALIZED_SET_H 00021 00022 #ifndef _STLP_POINTERS_SPEC_TOOLS_H 00023 # include <stl/pointers/_tools.h> 00024 #endif 00025 00026 _STLP_BEGIN_NAMESPACE 00027 00028 #if defined (__BORLANDC__) || defined (__DMC__) 00029 # define typename 00030 #endif 00031 00032 //Specific iterator traits creation 00033 _STLP_CREATE_ITERATOR_TRAITS(SetTraitsT, Const_traits) 00034 00035 #if defined (_STLP_USE_TEMPLATE_EXPORT) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) 00036 _STLP_EXPORT template struct _STLP_CLASS_DECLSPEC less<void*>; 00037 00038 _STLP_MOVE_TO_PRIV_NAMESPACE 00039 00040 typedef _Rb_tree_node<void*> _Node; 00041 _STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<_Rb_tree_node_base, _Node, allocator<_Node> >; 00042 _STLP_EXPORT_TEMPLATE_CLASS _Rb_tree_base<void*, allocator<void*> >; 00043 # if defined (_STLP_DEBUG) 00044 _STLP_EXPORT_TEMPLATE_CLASS _DbgCompare<void*, less<void*> >; 00045 # define _Rb_tree _STLP_NON_DBG_NAME(Rb_tree) 00046 _STLP_EXPORT_TEMPLATE_CLASS _Rb_tree<void*, _DbgCompare<void*, less<void*> >, void*, _Identity<void*>, 00047 _SetTraitsT<void*>, allocator<void*> >; 00048 # undef _Rb_tree 00049 # endif 00050 _STLP_EXPORT_TEMPLATE_CLASS _Rb_tree<void*, less<void*>, void*, _Identity<void*>, 00051 _SetTraitsT<void*>, allocator<void*> >; 00052 _STLP_MOVE_TO_STD_NAMESPACE 00053 #endif 00054 00055 template <class _Key, _STLP_DFL_TMPL_PARAM(_Compare, less<_Key>), 00056 _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Key>) > 00057 class set 00058 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 00059 : public __stlport_class<set<_Key, _Compare, _Alloc> > 00060 #endif 00061 { 00062 #if !defined (__BORLANDC__) 00063 typedef _STLP_PRIV _AssocStorageTypes<_Key, _Compare> _AssocStorageTypes; 00064 typedef typename _AssocStorageTypes::_KeyStorageType _KeyStorageType; 00065 typedef typename _AssocStorageTypes::_CompareStorageType _CompareStorageType; 00066 #else 00067 typedef _STLP_PRIV _AssocStorageTypes<_Key, _Compare>::_KeyStorageType _KeyStorageType; 00068 typedef _STLP_PRIV _AssocStorageTypes<_Key, _Compare>::_CompareStorageType _CompareStorageType; 00069 #endif 00070 typedef typename _Alloc_traits<_KeyStorageType, _Alloc>::allocator_type _StorageTypeAlloc; 00071 typedef _STLP_PRIV _CastTraits<_KeyStorageType, _Key> cast_traits; 00072 00073 typedef set<_Key, _Compare, _Alloc> _Self; 00074 public: 00075 typedef _Key key_type; 00076 typedef _Key value_type; 00077 typedef _Compare key_compare; 00078 typedef _Compare value_compare; 00079 00080 protected: 00081 //Specific iterator traits creation 00082 typedef _STLP_PRIV _SetTraitsT<value_type> _SetTraits; 00083 typedef _STLP_PRIV _Rb_tree<key_type, key_compare, 00084 value_type, _STLP_PRIV _Identity<value_type>, 00085 _SetTraits, _Alloc> _Priv_Rep_type; 00086 00087 typedef _STLP_PRIV _SetTraitsT<_KeyStorageType> _SetStorageTraits; 00088 00089 public: 00090 //dums: need the following public for the __move_traits framework 00091 typedef _STLP_PRIV _Rb_tree<_KeyStorageType, _CompareStorageType, 00092 _KeyStorageType, _STLP_PRIV _Identity<_KeyStorageType>, 00093 _SetStorageTraits, _StorageTypeAlloc> _Rep_type; 00094 00095 private: 00096 typedef typename _Rep_type::iterator base_iterator; 00097 typedef typename _Rep_type::const_iterator const_base_iterator; 00098 00099 public: 00100 typedef typename _Priv_Rep_type::pointer pointer; 00101 typedef typename _Priv_Rep_type::const_pointer const_pointer; 00102 typedef typename _Priv_Rep_type::reference reference; 00103 typedef typename _Priv_Rep_type::const_reference const_reference; 00104 typedef typename _Priv_Rep_type::iterator iterator; 00105 typedef typename _Priv_Rep_type::const_iterator const_iterator; 00106 typedef typename _Priv_Rep_type::reverse_iterator reverse_iterator; 00107 typedef typename _Priv_Rep_type::const_reverse_iterator const_reverse_iterator; 00108 typedef typename _Priv_Rep_type::size_type size_type; 00109 typedef typename _Priv_Rep_type::difference_type difference_type; 00110 typedef typename _Priv_Rep_type::allocator_type allocator_type; 00111 00112 private: 00113 _Rep_type _M_t; // red-black tree representing set 00114 _STLP_KEY_TYPE_FOR_CONT_EXT(key_type) 00115 00116 #if defined (_STLP_DEBUG) 00117 static iterator _S_to_value_ite(const_base_iterator __ite) 00118 { return iterator(__ite._Owner(), __ite._M_iterator._M_node); } 00119 static base_iterator _S_to_storage_ite(const_iterator __ite) 00120 { return base_iterator(__ite._Owner(), __ite._M_iterator._M_node); } 00121 #else 00122 static iterator _S_to_value_ite(const_base_iterator __ite) 00123 { return iterator(__ite._M_node); } 00124 static base_iterator _S_to_storage_ite(const_iterator __ite) 00125 { return base_iterator(__ite._M_node); } 00126 #endif 00127 00128 public: 00129 set() : _M_t(_CompareStorageType(), _StorageTypeAlloc()) {} 00130 explicit set(const _Compare& __comp, 00131 const allocator_type& __a = allocator_type()) 00132 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) {} 00133 00134 #if defined (_STLP_MEMBER_TEMPLATES) 00135 template <class _InputIterator> 00136 set(_InputIterator __first, _InputIterator __last) 00137 : _M_t(_Compare(), _StorageTypeAlloc()) { 00138 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00139 _M_t.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00140 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00141 # else 00142 _M_t.insert_unique(__first, __last); 00143 # endif 00144 } 00145 00146 # if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS) 00147 template <class _InputIterator> 00148 set(_InputIterator __first, _InputIterator __last, const _Compare& __comp) 00149 : _M_t(__comp, _StorageTypeAlloc()) { 00150 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00151 _M_t.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00152 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00153 # else 00154 _M_t.insert_unique(__first, __last); 00155 # endif 00156 } 00157 # endif 00158 template <class _InputIterator> 00159 set(_InputIterator __first, _InputIterator __last, const _Compare& __comp, 00160 const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) 00161 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) { 00162 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00163 _M_t.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00164 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00165 # else 00166 _M_t.insert_unique(__first, __last); 00167 # endif 00168 } 00169 #else 00170 set(const value_type* __first, const value_type* __last) 00171 : _M_t(_Compare(), _StorageTypeAlloc()) { 00172 _M_t.insert_unique(cast_traits::to_storage_type_cptr(__first), 00173 cast_traits::to_storage_type_cptr(__last)); 00174 } 00175 00176 set(const value_type* __first, const value_type* __last, 00177 const _Compare& __comp, const allocator_type& __a = allocator_type()) 00178 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) { 00179 _M_t.insert_unique(cast_traits::to_storage_type_cptr(__first), 00180 cast_traits::to_storage_type_cptr(__last)); 00181 } 00182 00183 set(const_iterator __first, const_iterator __last) 00184 : _M_t(_Compare(), _StorageTypeAlloc()) 00185 { _M_t.insert_unique(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00186 00187 set(const_iterator __first, const_iterator __last, 00188 const _Compare& __comp, const allocator_type& __a = allocator_type()) 00189 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) 00190 { _M_t.insert_unique(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00191 #endif /* _STLP_MEMBER_TEMPLATES */ 00192 00193 set(const _Self& __x) : _M_t(__x._M_t) {} 00194 00195 #if !defined (_STLP_NO_MOVE_SEMANTIC) 00196 set(__move_source<_Self> src) 00197 : _M_t(__move_source<_Rep_type>(src.get()._M_t)) {} 00198 #endif 00199 00200 _Self& operator=(const _Self& __x) { 00201 _M_t = __x._M_t; 00202 return *this; 00203 } 00204 00205 // accessors: 00206 key_compare key_comp() const { return _M_t.key_comp(); } 00207 value_compare value_comp() const { return _M_t.key_comp(); } 00208 allocator_type get_allocator() const 00209 { return _STLP_CONVERT_ALLOCATOR(_M_t.get_allocator(), value_type); } 00210 00211 iterator begin() { return _S_to_value_ite(_M_t.begin()); } 00212 iterator end() { return _S_to_value_ite(_M_t.end()); } 00213 const_iterator begin() const { return _S_to_value_ite(_M_t.begin()); } 00214 const_iterator end() const { return _S_to_value_ite(_M_t.end()); } 00215 reverse_iterator rbegin() { return reverse_iterator(end()); } 00216 reverse_iterator rend() { return reverse_iterator(begin()); } 00217 const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } 00218 const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } 00219 bool empty() const { return _M_t.empty(); } 00220 size_type size() const { return _M_t.size(); } 00221 size_type max_size() const { return _M_t.max_size(); } 00222 void swap(_Self& __x) { _M_t.swap(__x._M_t); } 00223 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 00224 void _M_swap_workaround(_Self& __x) { swap(__x); } 00225 #endif 00226 00227 // insert/erase 00228 pair<iterator,bool> insert(const value_type& __x) { 00229 pair<base_iterator, bool> ret = _M_t.insert_unique(cast_traits::to_storage_type_cref(__x)); 00230 return pair<iterator, bool>(_S_to_value_ite(ret.first), ret.second); 00231 } 00232 iterator insert(iterator __pos, const value_type& __x) 00233 { return _S_to_value_ite(_M_t.insert_unique(_S_to_storage_ite(__pos), cast_traits::to_storage_type_cref(__x))); } 00234 00235 #if defined (_STLP_MEMBER_TEMPLATES) 00236 template <class _InputIterator> 00237 void insert(_InputIterator __first, _InputIterator __last) { 00238 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00239 _M_t.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00240 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00241 # else 00242 _M_t.insert_unique(__first, __last); 00243 # endif 00244 } 00245 #else 00246 void insert(const_iterator __first, const_iterator __last) 00247 { _M_t.insert_unique(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00248 void insert(const value_type* __first, const value_type* __last) { 00249 _M_t.insert_unique(cast_traits::to_storage_type_cptr(__first), 00250 cast_traits::to_storage_type_cptr(__last)); 00251 } 00252 #endif 00253 void erase(iterator __pos) 00254 { _M_t.erase(_S_to_storage_ite(__pos)); } 00255 size_type erase(const key_type& __x) 00256 { return _M_t.erase_unique(cast_traits::to_storage_type_cref(__x)); } 00257 void erase(iterator __first, iterator __last) 00258 { _M_t.erase(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00259 void clear() { _M_t.clear(); } 00260 00261 // set operations: 00262 _STLP_TEMPLATE_FOR_CONT_EXT 00263 const_iterator find(const _KT& __x) const 00264 { return _S_to_value_ite(_M_t.find(cast_traits::to_storage_type_crefT(__x))); } 00265 _STLP_TEMPLATE_FOR_CONT_EXT 00266 iterator find(const _KT& __x) 00267 { return _S_to_value_ite(_M_t.find(cast_traits::to_storage_type_crefT(__x))); } 00268 _STLP_TEMPLATE_FOR_CONT_EXT 00269 size_type count(const _KT& __x) const 00270 { return _M_t.find(cast_traits::to_storage_type_crefT(__x)) == _M_t.end() ? 0 : 1; } 00271 _STLP_TEMPLATE_FOR_CONT_EXT 00272 iterator lower_bound(const _KT& __x) 00273 { return _S_to_value_ite(_M_t.lower_bound(cast_traits::to_storage_type_crefT(__x))); } 00274 _STLP_TEMPLATE_FOR_CONT_EXT 00275 const_iterator lower_bound(const _KT& __x) const 00276 { return _S_to_value_ite(_M_t.lower_bound(cast_traits::to_storage_type_crefT(__x))); } 00277 _STLP_TEMPLATE_FOR_CONT_EXT 00278 iterator upper_bound(const _KT& __x) 00279 { return _S_to_value_ite(_M_t.upper_bound(cast_traits::to_storage_type_crefT(__x))); } 00280 _STLP_TEMPLATE_FOR_CONT_EXT 00281 const_iterator upper_bound(const _KT& __x) const 00282 { return _S_to_value_ite(_M_t.upper_bound(cast_traits::to_storage_type_crefT(__x))); } 00283 _STLP_TEMPLATE_FOR_CONT_EXT 00284 pair<iterator, iterator> equal_range(const _KT& __x) { 00285 pair<base_iterator, base_iterator> __ret; 00286 __ret = _M_t.equal_range(cast_traits::to_storage_type_crefT(__x)); 00287 return pair<iterator, iterator>(_S_to_value_ite(__ret.first), 00288 _S_to_value_ite(__ret.second)); 00289 } 00290 _STLP_TEMPLATE_FOR_CONT_EXT 00291 pair<const_iterator, const_iterator> equal_range(const _KT& __x) const { 00292 pair<const_base_iterator, const_base_iterator> __ret; 00293 __ret = _M_t.equal_range_unique(cast_traits::to_storage_type_crefT(__x)); 00294 return pair<const_iterator, const_iterator>(_S_to_value_ite(__ret.first), 00295 _S_to_value_ite(__ret.second)); 00296 } 00297 }; 00298 00299 //Specific iterator traits creation 00300 _STLP_CREATE_ITERATOR_TRAITS(MultisetTraitsT, Const_traits) 00301 00302 template <class _Key, _STLP_DFL_TMPL_PARAM(_Compare, less<_Key>), 00303 _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Key>) > 00304 class multiset 00305 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 00306 : public __stlport_class<multiset<_Key, _Compare, _Alloc> > 00307 #endif 00308 { 00309 #if !defined (__BORLANDC__) 00310 typedef _STLP_PRIV _AssocStorageTypes<_Key, _Compare> _AssocStorageTypes; 00311 typedef typename _AssocStorageTypes::_KeyStorageType _KeyStorageType; 00312 typedef typename _AssocStorageTypes::_CompareStorageType _CompareStorageType; 00313 #else 00314 typedef _STLP_PRIV _AssocStorageTypes<_Key, _Compare>::_KeyStorageType _KeyStorageType; 00315 typedef _STLP_PRIV _AssocStorageTypes<_Key, _Compare>::_CompareStorageType _CompareStorageType; 00316 #endif 00317 typedef typename _Alloc_traits<_KeyStorageType, _Alloc>::allocator_type _StorageTypeAlloc; 00318 typedef _STLP_PRIV _CastTraits<_KeyStorageType, _Key> cast_traits; 00319 00320 typedef multiset<_Key, _Compare, _Alloc> _Self; 00321 public: 00322 // typedefs: 00323 typedef _Key key_type; 00324 typedef _Key value_type; 00325 typedef _Compare key_compare; 00326 typedef _Compare value_compare; 00327 00328 protected: 00329 //Specific iterator traits creation 00330 typedef _STLP_PRIV _MultisetTraitsT<value_type> _MultisetTraits; 00331 typedef _STLP_PRIV _Rb_tree<key_type, key_compare, 00332 value_type, _STLP_PRIV _Identity<value_type>, 00333 _MultisetTraits, _Alloc> _Priv_Rep_type; 00334 00335 typedef _STLP_PRIV _MultisetTraitsT<_KeyStorageType> _MultisetStorageTraits; 00336 public: 00337 //dums: need the following public for the __move_traits framework 00338 typedef _STLP_PRIV _Rb_tree<_KeyStorageType, _CompareStorageType, 00339 _KeyStorageType, _STLP_PRIV _Identity<_KeyStorageType>, 00340 _MultisetStorageTraits, _StorageTypeAlloc> _Rep_type; 00341 00342 private: 00343 typedef typename _Rep_type::iterator base_iterator; 00344 typedef typename _Rep_type::const_iterator const_base_iterator; 00345 00346 public: 00347 typedef typename _Priv_Rep_type::pointer pointer; 00348 typedef typename _Priv_Rep_type::const_pointer const_pointer; 00349 typedef typename _Priv_Rep_type::reference reference; 00350 typedef typename _Priv_Rep_type::const_reference const_reference; 00351 typedef typename _Priv_Rep_type::iterator iterator; 00352 typedef typename _Priv_Rep_type::const_iterator const_iterator; 00353 typedef typename _Priv_Rep_type::reverse_iterator reverse_iterator; 00354 typedef typename _Priv_Rep_type::const_reverse_iterator const_reverse_iterator; 00355 typedef typename _Priv_Rep_type::size_type size_type; 00356 typedef typename _Priv_Rep_type::difference_type difference_type; 00357 typedef typename _Priv_Rep_type::allocator_type allocator_type; 00358 00359 private: 00360 _Rep_type _M_t; // red-black tree representing multiset 00361 _STLP_KEY_TYPE_FOR_CONT_EXT(key_type) 00362 00363 #if defined (_STLP_DEBUG) 00364 static iterator _S_to_value_ite(const_base_iterator __ite) 00365 { return iterator(__ite._Owner(), __ite._M_iterator._M_node); } 00366 static base_iterator _S_to_storage_ite(const_iterator __ite) 00367 { return base_iterator(__ite._Owner(), __ite._M_iterator._M_node); } 00368 #else 00369 static iterator _S_to_value_ite(const_base_iterator __ite) 00370 { return iterator(__ite._M_node); } 00371 static base_iterator _S_to_storage_ite(const_iterator __ite) 00372 { return base_iterator(__ite._M_node); } 00373 #endif 00374 00375 public: 00376 multiset() : _M_t(_Compare(), _StorageTypeAlloc()) {} 00377 explicit multiset(const _Compare& __comp, 00378 const allocator_type& __a = allocator_type()) 00379 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) {} 00380 00381 #if defined (_STLP_MEMBER_TEMPLATES) 00382 template <class _InputIterator> 00383 multiset(_InputIterator __first, _InputIterator __last) 00384 : _M_t(_Compare(), _StorageTypeAlloc()) { 00385 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00386 _M_t.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00387 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00388 # else 00389 _M_t.insert_equal(__first, __last); 00390 # endif 00391 } 00392 00393 # if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS) 00394 template <class _InputIterator> 00395 multiset(_InputIterator __first, _InputIterator __last, 00396 const _Compare& __comp) 00397 : _M_t(__comp, _StorageTypeAlloc()) { 00398 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00399 _M_t.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00400 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00401 # else 00402 _M_t.insert_equal(__first, __last); 00403 # endif 00404 } 00405 # endif 00406 template <class _InputIterator> 00407 multiset(_InputIterator __first, _InputIterator __last, 00408 const _Compare& __comp, 00409 const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) 00410 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) { 00411 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00412 _M_t.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00413 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00414 # else 00415 _M_t.insert_equal(__first, __last); 00416 # endif 00417 } 00418 00419 #else 00420 multiset(const value_type* __first, const value_type* __last) 00421 : _M_t(_Compare(), _StorageTypeAlloc()) { 00422 _M_t.insert_equal(cast_traits::to_storage_type_cptr(__first), 00423 cast_traits::to_storage_type_cptr(__last)); 00424 } 00425 00426 multiset(const value_type* __first, const value_type* __last, 00427 const _Compare& __comp, 00428 const allocator_type& __a = allocator_type()) 00429 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) { 00430 _M_t.insert_equal(cast_traits::to_storage_type_cptr(__first), 00431 cast_traits::to_storage_type_cptr(__last)); 00432 } 00433 00434 multiset(const_iterator __first, const_iterator __last) 00435 : _M_t(_Compare(), _StorageTypeAlloc()) 00436 { _M_t.insert_equal(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00437 00438 multiset(const_iterator __first, const_iterator __last, 00439 const _Compare& __comp, 00440 const allocator_type& __a = allocator_type()) 00441 : _M_t(__comp, _STLP_CONVERT_ALLOCATOR(__a, _KeyStorageType)) 00442 { _M_t.insert_equal(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00443 #endif /* _STLP_MEMBER_TEMPLATES */ 00444 00445 multiset(const _Self& __x) 00446 : _M_t(__x._M_t) {} 00447 00448 _Self& operator=(const _Self& __x) { 00449 _M_t = __x._M_t; 00450 return *this; 00451 } 00452 00453 #if !defined (_STLP_NO_MOVE_SEMANTIC) 00454 multiset(__move_source<_Self> src) 00455 : _M_t(__move_source<_Rep_type>(src.get()._M_t)) {} 00456 #endif 00457 00458 // accessors: 00459 key_compare key_comp() const { return _M_t.key_comp(); } 00460 value_compare value_comp() const { return _M_t.key_comp(); } 00461 allocator_type get_allocator() const 00462 { return _STLP_CONVERT_ALLOCATOR(_M_t.get_allocator(), value_type); } 00463 00464 iterator begin() { return _S_to_value_ite(_M_t.begin()); } 00465 iterator end() { return _S_to_value_ite(_M_t.end()); } 00466 const_iterator begin() const { return _S_to_value_ite(_M_t.begin()); } 00467 const_iterator end() const { return _S_to_value_ite(_M_t.end()); } 00468 reverse_iterator rbegin() { return reverse_iterator(end()); } 00469 reverse_iterator rend() { return reverse_iterator(begin()); } 00470 const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } 00471 const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } 00472 bool empty() const { return _M_t.empty(); } 00473 size_type size() const { return _M_t.size(); } 00474 size_type max_size() const { return _M_t.max_size(); } 00475 void swap(_Self& __x) { _M_t.swap(__x._M_t); } 00476 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 00477 void _M_swap_workaround(_Self& __x) { swap(__x); } 00478 #endif 00479 00480 // insert/erase 00481 iterator insert(const value_type& __x) 00482 { return _S_to_value_ite(_M_t.insert_equal(cast_traits::to_storage_type_cref(__x))); } 00483 iterator insert(iterator __pos, const value_type& __x) { 00484 return _S_to_value_ite(_M_t.insert_equal(_S_to_storage_ite(__pos), 00485 cast_traits::to_storage_type_cref(__x))); 00486 } 00487 00488 #if defined (_STLP_MEMBER_TEMPLATES) 00489 template <class _InputIterator> 00490 void insert(_InputIterator __first, _InputIterator __last) { 00491 # if defined (_STLP_USE_ITERATOR_WRAPPER) 00492 _M_t.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__first), 00493 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_KeyStorageType, _Key, _InputIterator>::_Ite(__last)); 00494 # else 00495 _M_t.insert_equal(__first, __last); 00496 # endif 00497 } 00498 #else 00499 void insert(const value_type* __first, const value_type* __last) { 00500 _M_t.insert_equal(cast_traits::to_storage_type_cptr(__first), 00501 cast_traits::to_storage_type_cptr(__last)); 00502 } 00503 void insert(const_iterator __first, const_iterator __last) 00504 { _M_t.insert_equal(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00505 #endif /* _STLP_MEMBER_TEMPLATES */ 00506 00507 void erase(iterator __pos) 00508 { _M_t.erase(_S_to_storage_ite(__pos)); } 00509 size_type erase(const key_type& __x) 00510 { return _M_t.erase(cast_traits::to_storage_type_cref(__x)); } 00511 void erase(iterator __first, iterator __last) 00512 { _M_t.erase(_S_to_storage_ite(__first), _S_to_storage_ite(__last)); } 00513 void clear() { _M_t.clear(); } 00514 00515 // multiset operations: 00516 00517 _STLP_TEMPLATE_FOR_CONT_EXT 00518 iterator find(const _KT& __x) 00519 { return _S_to_value_ite(_M_t.find(cast_traits::to_storage_type_crefT(__x))); } 00520 _STLP_TEMPLATE_FOR_CONT_EXT 00521 const_iterator find(const _KT& __x) const 00522 { return _S_to_value_ite(_M_t.find(cast_traits::to_storage_type_crefT(__x))); } 00523 _STLP_TEMPLATE_FOR_CONT_EXT 00524 size_type count(const _KT& __x) const 00525 { return _M_t.count(cast_traits::to_storage_type_crefT(__x)); } 00526 _STLP_TEMPLATE_FOR_CONT_EXT 00527 iterator lower_bound(const _KT& __x) 00528 { return _S_to_value_ite(_M_t.lower_bound(cast_traits::to_storage_type_crefT(__x))); } 00529 _STLP_TEMPLATE_FOR_CONT_EXT 00530 const_iterator lower_bound(const _KT& __x) const 00531 { return _S_to_value_ite(_M_t.lower_bound(cast_traits::to_storage_type_crefT(__x))); } 00532 _STLP_TEMPLATE_FOR_CONT_EXT 00533 iterator upper_bound(const _KT& __x) 00534 { return _S_to_value_ite(_M_t.upper_bound(cast_traits::to_storage_type_crefT(__x))); } 00535 _STLP_TEMPLATE_FOR_CONT_EXT 00536 const_iterator upper_bound(const _KT& __x) const 00537 { return _S_to_value_ite(_M_t.upper_bound(cast_traits::to_storage_type_crefT(__x))); } 00538 _STLP_TEMPLATE_FOR_CONT_EXT 00539 pair<iterator, iterator> equal_range(const _KT& __x) { 00540 pair<base_iterator, base_iterator> __ret; 00541 __ret = _M_t.equal_range(cast_traits::to_storage_type_crefT(__x)); 00542 return pair<iterator, iterator>(_S_to_value_ite(__ret.first), 00543 _S_to_value_ite(__ret.second)); 00544 } 00545 _STLP_TEMPLATE_FOR_CONT_EXT 00546 pair<const_iterator, const_iterator> equal_range(const _KT& __x) const { 00547 pair<const_base_iterator, const_base_iterator> __ret; 00548 __ret = _M_t.equal_range(cast_traits::to_storage_type_crefT(__x)); 00549 return pair<const_iterator, const_iterator>(_S_to_value_ite(__ret.first), 00550 _S_to_value_ite(__ret.second)); 00551 } 00552 }; 00553 00554 #if defined (__BORLANDC__) || defined (__DMC__) 00555 # undef typename 00556 #endif 00557 00558 _STLP_END_NAMESPACE 00559 00560 #endif /* _STLP_PTR_SPECIALIZED_SET_H */ 00561 00562 // Local Variables: 00563 // mode:C++ 00564 // End: Generated on Sun May 27 2012 04:29:27 for ReactOS by
1.7.6.1
|