williamr@2: /* williamr@2: * williamr@2: * Copyright (c) 1994 williamr@2: * Hewlett-Packard Company williamr@2: * williamr@2: * Copyright (c) 1996,1997 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1997 williamr@2: * Moscow Center for SPARC Technology williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: /* NOTE: This is an internal header file, included by other STL headers. williamr@2: * You should not attempt to use it directly. williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_INTERNAL_SET_H williamr@2: #define _STLP_INTERNAL_SET_H williamr@2: williamr@2: #ifndef _STLP_INTERNAL_TREE_H williamr@2: #include williamr@2: #endif williamr@2: williamr@2: #define set __WORKAROUND_RENAME(set) williamr@2: #define multiset __WORKAROUND_RENAME(multiset) williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: template ), williamr@2: _STLP_DEFAULT_ALLOCATOR_SELECT(_Key) > williamr@2: class set williamr@2: { williamr@2: public: williamr@2: // typedefs: williamr@2: typedef _Key key_type; williamr@2: typedef _Key value_type; williamr@2: typedef _Compare key_compare; williamr@2: typedef _Compare value_compare; williamr@2: private: williamr@2: typedef _Rb_tree, key_compare, _Alloc> _Rep_type; williamr@2: public: williamr@2: typedef typename _Rep_type::pointer pointer; williamr@2: typedef typename _Rep_type::const_pointer const_pointer; williamr@2: typedef typename _Rep_type::reference reference; williamr@2: typedef typename _Rep_type::const_reference const_reference; williamr@2: typedef typename _Rep_type::const_iterator const_iterator; williamr@2: typedef const_iterator iterator; williamr@2: typedef typename _Rep_type::const_reverse_iterator reverse_iterator; williamr@2: typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; williamr@2: typedef typename _Rep_type::size_type size_type; williamr@2: typedef typename _Rep_type::difference_type difference_type; williamr@2: typedef typename _Rep_type::allocator_type allocator_type; williamr@2: typedef set<_Key,_Compare,_Alloc> _Self; williamr@2: williamr@2: private: williamr@2: _Rep_type _M_t; // red-black tree representing set williamr@2: public: williamr@2: williamr@2: // allocation/deallocation williamr@2: williamr@2: set() : _M_t(_Compare(), allocator_type()) { williamr@2: _STLP_POP_IF_CHECK williamr@2: } williamr@2: williamr@2: # ifdef _STLP_USE_TRAP_LEAVE williamr@2: set(const set<_Key,_Compare,_Alloc>& __x) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t =__x._M_t; williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: # else williamr@2: set(const set<_Key,_Compare,_Alloc>& __o) williamr@2: : _M_t(__o._M_t) { williamr@2: } williamr@2: # endif williamr@2: williamr@2: explicit set(const _Compare& __comp, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_POP_IF_CHECK williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: set(_InputIterator __first, _InputIterator __last) williamr@2: : _M_t(_Compare(), allocator_type()) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS williamr@2: template williamr@2: set(_InputIterator __first, _InputIterator __last, const _Compare& __comp) williamr@2: : _M_t(__comp, allocator_type()) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: # endif williamr@2: template williamr@2: set(_InputIterator __first, _InputIterator __last, const _Compare& __comp, williamr@2: const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: #else williamr@2: set(const value_type* __first, const value_type* __last) williamr@2: : _M_t(_Compare(), allocator_type()) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: set(const value_type* __first, williamr@2: const value_type* __last, const _Compare& __comp, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: set(const_iterator __first, const_iterator __last) williamr@2: : _M_t(_Compare(), allocator_type()) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: set(const_iterator __first, const_iterator __last, const _Compare& __comp, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_unique(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: williamr@2: set<_Key,_Compare,_Alloc>& operator=(const set<_Key, _Compare, _Alloc>& __x) williamr@2: { williamr@2: _M_t = __x._M_t; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_USE_TRAP_LEAVE williamr@2: public: williamr@2: static void* operator new (size_t __n, TLeave) { return _STLP_StackHelper::_NewLC(__n); } williamr@2: static void* operator new (size_t __n) { return _STLP_StackHelper::_NewLC(__n); } williamr@2: #endif williamr@2: williamr@2: williamr@2: // accessors: williamr@2: williamr@2: key_compare key_comp() const { return _M_t.key_comp(); } williamr@2: value_compare value_comp() const { return _M_t.key_comp(); } williamr@2: allocator_type get_allocator() const { return _M_t.get_allocator(); } williamr@2: williamr@2: iterator begin() const { return _M_t.begin(); } williamr@2: iterator end() const { return _M_t.end(); } williamr@2: reverse_iterator rbegin() const { return _M_t.rbegin(); } williamr@2: reverse_iterator rend() const { return _M_t.rend(); } williamr@2: bool empty() const { return _M_t.empty(); } williamr@2: size_type size() const { return _M_t.size(); } williamr@2: size_type max_size() const { return _M_t.max_size(); } williamr@2: void swap(set<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); } williamr@2: williamr@2: // insert/erase williamr@2: pair insert(const value_type& __x) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: pair<_Rep_iterator, bool> __p = _M_t.insert_unique(__x); williamr@2: return pair(__REINTERPRET_CAST(const iterator&,__p.first), __p.second); williamr@2: } williamr@2: iterator insert(iterator __position, const value_type& __x) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: return _M_t.insert_unique((_Rep_iterator&)__position, __x); williamr@2: } williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: void insert(_InputIterator __first, _InputIterator __last) { williamr@2: _M_t.insert_unique(__first, __last); williamr@2: } williamr@2: #else williamr@2: void insert(const_iterator __first, const_iterator __last) { williamr@2: _M_t.insert_unique(__first, __last); williamr@2: } williamr@2: void insert(const value_type* __first, const value_type* __last) { williamr@2: _M_t.insert_unique(__first, __last); williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: void erase(iterator __position) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: _M_t.erase((_Rep_iterator&)__position); williamr@2: } williamr@2: size_type erase(const key_type& __x) { williamr@2: return _M_t.erase(__x); williamr@2: } williamr@2: void erase(iterator __first, iterator __last) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last); williamr@2: } williamr@2: void clear() { _M_t.clear(); } williamr@2: williamr@2: // set operations: williamr@2: # if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) williamr@2: template williamr@2: iterator find(const _KT& __x) const { return _M_t.find(__x); } williamr@2: # else williamr@2: iterator find(const key_type& __x) const { return _M_t.find(__x); } williamr@2: # endif williamr@2: size_type count(const key_type& __x) const { williamr@2: return _M_t.find(__x) == _M_t.end() ? 0 : 1 ; williamr@2: } williamr@2: iterator lower_bound(const key_type& __x) const { williamr@2: return _M_t.lower_bound(__x); williamr@2: } williamr@2: iterator upper_bound(const key_type& __x) const { williamr@2: return _M_t.upper_bound(__x); williamr@2: } williamr@2: pair equal_range(const key_type& __x) const { williamr@2: return _M_t.equal_range(__x); williamr@2: } williamr@2: }; williamr@2: williamr@2: template ), williamr@2: _STLP_DEFAULT_ALLOCATOR_SELECT(_Key) > williamr@2: class multiset williamr@2: { williamr@2: public: williamr@2: // typedefs: williamr@2: williamr@2: typedef _Key key_type; williamr@2: typedef _Key value_type; williamr@2: typedef _Compare key_compare; williamr@2: typedef _Compare value_compare; williamr@2: private: williamr@2: typedef _Rb_tree, key_compare, _Alloc> _Rep_type; williamr@2: public: williamr@2: typedef typename _Rep_type::pointer pointer; williamr@2: typedef typename _Rep_type::const_pointer const_pointer; williamr@2: typedef typename _Rep_type::reference reference; williamr@2: typedef typename _Rep_type::const_reference const_reference; williamr@2: typedef typename _Rep_type::const_iterator const_iterator; williamr@2: typedef const_iterator iterator; williamr@2: typedef typename _Rep_type::const_reverse_iterator reverse_iterator; williamr@2: typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; williamr@2: typedef typename _Rep_type::size_type size_type; williamr@2: typedef typename _Rep_type::difference_type difference_type; williamr@2: typedef typename _Rep_type::allocator_type allocator_type; williamr@2: williamr@2: typedef multiset<_Key,_Compare,_Alloc> _Self; williamr@2: williamr@2: private: williamr@2: _Rep_type _M_t; // red-black tree representing multiset williamr@2: public: williamr@2: // allocation/deallocation williamr@2: williamr@2: multiset() : _M_t(_Compare(), allocator_type()) { williamr@2: _STLP_POP_IF_CHECK williamr@2: } williamr@2: williamr@2: # ifdef _STLP_USE_TRAP_LEAVE williamr@2: multiset(const multiset<_Key,_Compare,_Alloc>& __x) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t =__x._M_t; williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: # else williamr@2: multiset(const multiset<_Key,_Compare,_Alloc>& __o) williamr@2: : _M_t(__o._M_t) { williamr@2: } williamr@2: # endif williamr@2: williamr@2: explicit multiset(const _Compare& __comp, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_POP_IF_CHECK williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: williamr@2: template williamr@2: multiset(_InputIterator __first, _InputIterator __last) williamr@2: : _M_t(_Compare(), allocator_type()) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS williamr@2: template williamr@2: multiset(_InputIterator __first, _InputIterator __last, williamr@2: const _Compare& __comp) williamr@2: : _M_t(__comp, allocator_type()) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: # endif williamr@2: template williamr@2: multiset(_InputIterator __first, _InputIterator __last, williamr@2: const _Compare& __comp, williamr@2: const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: #else williamr@2: williamr@2: multiset(const value_type* __first, const value_type* __last) williamr@2: : _M_t(_Compare(), allocator_type()) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: multiset(const value_type* __first, const value_type* __last, williamr@2: const _Compare& __comp, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: multiset(const_iterator __first, const_iterator __last) williamr@2: : _M_t(_Compare(), allocator_type()) williamr@2: { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: multiset(const_iterator __first, const_iterator __last, williamr@2: const _Compare& __comp, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _M_t(__comp, __a) { williamr@2: _STLP_PUSH_CLEANUP_ITEM(_Self, this) williamr@2: _M_t.insert_equal(__first, __last); williamr@2: _STLP_POP_CLEANUP_ITEM williamr@2: } williamr@2: williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: multiset<_Key,_Compare,_Alloc>& williamr@2: operator=(const multiset<_Key,_Compare,_Alloc>& __x) { williamr@2: _M_t = __x._M_t; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_USE_TRAP_LEAVE williamr@2: public: williamr@2: static void* operator new (size_t __n, TLeave) { return _STLP_StackHelper::_NewLC(__n); } williamr@2: static void* operator new (size_t __n) { return _STLP_StackHelper::_NewLC(__n); } williamr@2: #endif williamr@2: williamr@2: // accessors: williamr@2: williamr@2: key_compare key_comp() const { return _M_t.key_comp(); } williamr@2: value_compare value_comp() const { return _M_t.key_comp(); } williamr@2: allocator_type get_allocator() const { return _M_t.get_allocator(); } williamr@2: williamr@2: iterator begin() const { return _M_t.begin(); } williamr@2: iterator end() const { return _M_t.end(); } williamr@2: reverse_iterator rbegin() const { return _M_t.rbegin(); } williamr@2: reverse_iterator rend() const { return _M_t.rend(); } williamr@2: bool empty() const { return _M_t.empty(); } williamr@2: size_type size() const { return _M_t.size(); } williamr@2: size_type max_size() const { return _M_t.max_size(); } williamr@2: void swap(multiset<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); } williamr@2: williamr@2: // insert/erase williamr@2: iterator insert(const value_type& __x) { williamr@2: return _M_t.insert_equal(__x); williamr@2: } williamr@2: iterator insert(iterator __position, const value_type& __x) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: return _M_t.insert_equal((_Rep_iterator&)__position, __x); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: void insert(_InputIterator __first, _InputIterator __last) { williamr@2: _M_t.insert_equal(__first, __last); williamr@2: } williamr@2: #else williamr@2: void insert(const value_type* __first, const value_type* __last) { williamr@2: _M_t.insert_equal(__first, __last); williamr@2: } williamr@2: void insert(const_iterator __first, const_iterator __last) { williamr@2: _M_t.insert_equal(__first, __last); williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: void erase(iterator __position) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: _M_t.erase((_Rep_iterator&)__position); williamr@2: } williamr@2: size_type erase(const key_type& __x) { williamr@2: return _M_t.erase(__x); williamr@2: } williamr@2: void erase(iterator __first, iterator __last) { williamr@2: typedef typename _Rep_type::iterator _Rep_iterator; williamr@2: _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last); williamr@2: } williamr@2: void clear() { _M_t.clear(); } williamr@2: williamr@2: // multiset operations: williamr@2: williamr@2: # if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) williamr@2: template williamr@2: iterator find(const _KT& __x) const { return _M_t.find(__x); } williamr@2: # else williamr@2: iterator find(const key_type& __x) const { return _M_t.find(__x); } williamr@2: # endif williamr@2: size_type count(const key_type& __x) const { return _M_t.count(__x); } williamr@2: iterator lower_bound(const key_type& __x) const { williamr@2: return _M_t.lower_bound(__x); williamr@2: } williamr@2: iterator upper_bound(const key_type& __x) const { williamr@2: return _M_t.upper_bound(__x); williamr@2: } williamr@2: pair equal_range(const key_type& __x) const { williamr@2: return _M_t.equal_range(__x); williamr@2: } williamr@2: }; williamr@2: williamr@2: # define _STLP_TEMPLATE_HEADER template williamr@2: # define _STLP_TEMPLATE_CONTAINER set<_Key,_Compare,_Alloc> williamr@2: # include williamr@2: # undef _STLP_TEMPLATE_CONTAINER williamr@2: # define _STLP_TEMPLATE_CONTAINER multiset<_Key,_Compare,_Alloc> williamr@2: # include williamr@2: # undef _STLP_TEMPLATE_CONTAINER williamr@2: # undef _STLP_TEMPLATE_HEADER williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: // do a cleanup williamr@2: # undef set williamr@2: # undef multiset williamr@2: // provide a way to access full funclionality williamr@2: # define __set__ __FULL_NAME(set) williamr@2: # define __multiset__ __FULL_NAME(multiset) williamr@2: williamr@2: # ifdef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM williamr@2: # include williamr@2: # endif williamr@2: williamr@2: #endif /* _STLP_INTERNAL_SET_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: