ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

_tree.h
Go to the documentation of this file.
00001 /*
00002  *
00003  * Copyright (c) 1994
00004  * Hewlett-Packard Company
00005  *
00006  * Copyright (c) 1996,1997
00007  * Silicon Graphics Computer Systems, Inc.
00008  *
00009  * Copyright (c) 1997
00010  * Moscow Center for SPARC Technology
00011  *
00012  * Copyright (c) 1999
00013  * Boris Fomitchev
00014  *
00015  * This material is provided "as is", with absolutely no warranty expressed
00016  * or implied. Any use is at your own risk.
00017  *
00018  * Permission to use or copy this software for any purpose is hereby granted
00019  * without fee, provided the above notices are retained on all copies.
00020  * Permission to modify the code and to distribute modified code is granted,
00021  * provided the above notices are retained, and a notice that the code was
00022  * modified is included with the above copyright notice.
00023  *
00024  */
00025 
00026 /* NOTE: This is an internal header file, included by other STL headers.
00027  *   You should not attempt to use it directly.
00028  */
00029 
00030 #ifndef _STLP_INTERNAL_DBG_TREE_H
00031 #define _STLP_INTERNAL_DBG_TREE_H
00032 
00033 #ifndef _STLP_DBG_ITERATOR_H
00034 #  include <stl/debug/_iterator.h>
00035 #endif
00036 
00037 #ifndef _STLP_INTERNAL_FUNCTION_BASE_H
00038 #  include <stl/_function_base.h>
00039 #endif
00040 
00041 #ifndef _STLP_INTERNAL_ALLOC_H
00042 #  include <stl/_alloc.h>
00043 #endif
00044 
00045 _STLP_BEGIN_NAMESPACE
00046 
00047 _STLP_MOVE_TO_PRIV_NAMESPACE
00048 
00049 template <class _Key, class _Compare>
00050 class _DbgCompare {
00051 public:
00052   _DbgCompare() {}
00053   _DbgCompare(const _Compare& __cmp) : _M_non_dbg_cmp(__cmp) {}
00054   _DbgCompare(const _DbgCompare& __cmp) : _M_non_dbg_cmp(__cmp._M_non_dbg_cmp) {}
00055 
00056 #if !defined (_STLP_USE_CONTAINERS_EXTENSION)
00057   bool operator () (const _Key& __lhs, const _Key& __rhs) const {
00058 #else
00059   template <class _Kp1, class _Kp2>
00060   bool operator () (const _Kp1& __lhs, const _Kp2& __rhs) const {
00061 #endif
00062     if (_M_non_dbg_cmp(__lhs, __rhs)) {
00063       return true;
00064     }
00065     return false;
00066   }
00067 
00068   _Compare non_dbg_key_comp() const { return _M_non_dbg_cmp; }
00069 private:
00070   _Compare _M_non_dbg_cmp;
00071 };
00072 
00073 #define _STLP_NON_DBG_TREE _STLP_PRIV _STLP_NON_DBG_NAME(Rb_tree) <_Key, _STLP_PRIV _DbgCompare<_Key, _Compare>, _Value, _KeyOfValue, _Traits, _Alloc>
00074 
00075 #if defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
00076 _STLP_MOVE_TO_STD_NAMESPACE
00077 template <class _Key, class _Compare,
00078           class _Value, class _KeyOfValue, class _Traits, class _Alloc >
00079 inline _Value*
00080 value_type(const _STLP_PRIV _DBG_iter_base< _STLP_NON_DBG_TREE >&)
00081 { return (_Value*)0; }
00082 template <class _Key, class _Compare,
00083           class _Value, class _KeyOfValue, class _Traits, class _Alloc >
00084 inline bidirectional_iterator_tag
00085 iterator_category(const _STLP_PRIV _DBG_iter_base< _STLP_NON_DBG_TREE >&)
00086 { return bidirectional_iterator_tag(); }
00087 _STLP_MOVE_TO_PRIV_NAMESPACE
00088 #endif
00089 
00090 template <class _Key, class _Compare,
00091           class _Value, class _KeyOfValue, class _Traits,
00092           _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Value>) >
00093 class _Rb_tree {
00094   typedef _STLP_NON_DBG_TREE _Base;
00095   typedef _Rb_tree<_Key, _Compare, _Value, _KeyOfValue, _Traits, _Alloc> _Self;
00096   _Base _M_non_dbg_impl;
00097   _STLP_PRIV __owned_list _M_iter_list;
00098 
00099 public:
00100   __IMPORT_CONTAINER_TYPEDEFS(_Base)
00101   typedef typename _Base::key_type key_type;
00102 
00103   typedef typename _Traits::_NonConstTraits _NonConstIteTraits;
00104   typedef typename _Traits::_ConstTraits    _ConstIteTraits;
00105   typedef _STLP_PRIV _DBG_iter<_Base, _STLP_PRIV _DbgTraits<_NonConstIteTraits> > iterator;
00106   typedef _STLP_PRIV _DBG_iter<_Base, _STLP_PRIV _DbgTraits<_ConstIteTraits> >    const_iterator;
00107 
00108   _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
00109 
00110 private:
00111   _STLP_KEY_TYPE_FOR_CONT_EXT(key_type)
00112   void _Invalidate_iterator(const iterator& __it)
00113   { _STLP_PRIV __invalidate_iterator(&_M_iter_list,__it); }
00114   void _Invalidate_iterators(const iterator& __first, const iterator& __last)
00115   { _STLP_PRIV __invalidate_range(&_M_iter_list, __first, __last); }
00116 
00117   typedef typename _Base::iterator _Base_iterator;
00118   typedef typename _Base::const_iterator _Base_const_iterator;
00119 
00120 public:
00121   _Rb_tree()
00122     : _M_non_dbg_impl(), _M_iter_list(&_M_non_dbg_impl) {}
00123   _Rb_tree(const _Compare& __comp)
00124     : _M_non_dbg_impl(__comp), _M_iter_list(&_M_non_dbg_impl) {}
00125   _Rb_tree(const _Compare& __comp, const allocator_type& __a)
00126     : _M_non_dbg_impl(__comp, __a), _M_iter_list(&_M_non_dbg_impl) {}
00127   _Rb_tree(const _Self& __x)
00128     : _M_non_dbg_impl(__x._M_non_dbg_impl), _M_iter_list(&_M_non_dbg_impl) {}
00129 
00130 #if !defined (_STLP_NO_MOVE_SEMANTIC)
00131   _Rb_tree(__move_source<_Self> src):
00132     _M_non_dbg_impl(__move_source<_Base>(src.get()._M_non_dbg_impl)),
00133     _M_iter_list(&_M_non_dbg_impl) {
00134 #  if defined (_STLP_NO_EXTENSIONS) || (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
00135     src.get()._M_iter_list._Invalidate_all();
00136 #  else
00137     src.get()._M_iter_list._Set_owner(_M_iter_list);
00138 #  endif
00139   }
00140 #endif
00141 
00142   ~_Rb_tree() {}
00143 
00144   _Self& operator=(const _Self& __x) {
00145     if (this != &__x) {
00146       //Should not invalidate end iterator:
00147       _Invalidate_iterators(begin(), end());
00148       _M_non_dbg_impl = __x._M_non_dbg_impl;
00149     }
00150     return *this;
00151   }
00152 
00153   allocator_type get_allocator() const { return _M_non_dbg_impl.get_allocator(); }
00154   _Compare key_comp() const { return _M_non_dbg_impl.key_comp().non_dbg_key_comp(); }
00155 
00156   iterator begin() { return iterator(&_M_iter_list, _M_non_dbg_impl.begin()); }
00157   const_iterator begin() const { return const_iterator(&_M_iter_list, _M_non_dbg_impl.begin()); }
00158   iterator end() { return iterator(&_M_iter_list, _M_non_dbg_impl.end()); }
00159   const_iterator end() const { return const_iterator(&_M_iter_list, _M_non_dbg_impl.end()); }
00160 
00161   reverse_iterator rbegin() { return reverse_iterator(end()); }
00162   const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
00163   reverse_iterator rend() { return reverse_iterator(begin()); }
00164   const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
00165 
00166   bool empty() const { return _M_non_dbg_impl.empty(); }
00167   size_type size() const { return _M_non_dbg_impl.size(); }
00168   size_type max_size() const { return _M_non_dbg_impl.max_size(); }
00169   _STLP_TEMPLATE_FOR_CONT_EXT
00170   size_type count(const _KT& __x) const { return _M_non_dbg_impl.count(__x); }
00171 
00172   void swap(_Self& __t) {
00173     _M_non_dbg_impl.swap(__t._M_non_dbg_impl);
00174     _M_iter_list._Swap_owners(__t._M_iter_list);
00175   }
00176 
00177   _STLP_TEMPLATE_FOR_CONT_EXT
00178   iterator find(const _KT& __k)
00179   { return iterator(&_M_iter_list, _M_non_dbg_impl.find(__k)); }
00180   _STLP_TEMPLATE_FOR_CONT_EXT
00181   const_iterator find(const _KT& __k) const
00182   { return const_iterator(&_M_iter_list, _M_non_dbg_impl.find(__k)); }
00183 
00184   _STLP_TEMPLATE_FOR_CONT_EXT
00185   iterator lower_bound(const _KT& __x)
00186   { return iterator(&_M_iter_list, _M_non_dbg_impl.lower_bound(__x)); }
00187   _STLP_TEMPLATE_FOR_CONT_EXT
00188   const_iterator lower_bound(const _KT& __x) const
00189   { return const_iterator(&_M_iter_list, _M_non_dbg_impl.lower_bound(__x)); }
00190 
00191   _STLP_TEMPLATE_FOR_CONT_EXT
00192   iterator upper_bound(const _KT& __x)
00193   { return iterator(&_M_iter_list, _M_non_dbg_impl.upper_bound(__x)); }
00194   _STLP_TEMPLATE_FOR_CONT_EXT
00195   const_iterator upper_bound(const _KT& __x) const
00196   { return const_iterator(&_M_iter_list, _M_non_dbg_impl.upper_bound(__x)); }
00197 
00198   _STLP_TEMPLATE_FOR_CONT_EXT
00199   pair<iterator,iterator> equal_range(const _KT& __x) {
00200     return pair<iterator, iterator>(iterator(&_M_iter_list, _M_non_dbg_impl.lower_bound(__x)),
00201                                     iterator(&_M_iter_list, _M_non_dbg_impl.upper_bound(__x)));
00202   }
00203   _STLP_TEMPLATE_FOR_CONT_EXT
00204   pair<const_iterator, const_iterator> equal_range(const _KT& __x) const {
00205     return pair<const_iterator,const_iterator>(const_iterator(&_M_iter_list, _M_non_dbg_impl.lower_bound(__x)),
00206                                                const_iterator(&_M_iter_list, _M_non_dbg_impl.upper_bound(__x)));
00207   }
00208 
00209   _STLP_TEMPLATE_FOR_CONT_EXT
00210   pair<iterator,iterator> equal_range_unique(const _KT& __x) {
00211     _STLP_STD::pair<_Base_iterator, _Base_iterator> __p;
00212     __p = _M_non_dbg_impl.equal_range_unique(__x);
00213     return pair<iterator, iterator>(iterator(&_M_iter_list, __p.first), iterator(&_M_iter_list, __p.second));
00214   }
00215   _STLP_TEMPLATE_FOR_CONT_EXT
00216   pair<const_iterator, const_iterator> equal_range_unique(const _KT& __x) const {
00217     _STLP_STD::pair<_Base_const_iterator, _Base_const_iterator> __p;
00218     __p = _M_non_dbg_impl.equal_range_unique(__x);
00219     return pair<const_iterator, const_iterator>(const_iterator(&_M_iter_list, __p.first),
00220                                                 const_iterator(&_M_iter_list, __p.second));
00221   }
00222 
00223   pair<iterator,bool> insert_unique(const value_type& __x) {
00224     _STLP_STD::pair<_Base_iterator, bool> __res = _M_non_dbg_impl.insert_unique(__x);
00225     return pair<iterator, bool>(iterator(&_M_iter_list, __res.first), __res.second);
00226   }
00227   iterator insert_equal(const value_type& __x)
00228   { return iterator(&_M_iter_list, _M_non_dbg_impl.insert_equal(__x)); }
00229 
00230   iterator insert_unique(iterator __pos, const value_type& __x) {
00231     _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
00232     return iterator(&_M_iter_list, _M_non_dbg_impl.insert_unique(__pos._M_iterator, __x));
00233   }
00234   iterator insert_equal(iterator __pos, const value_type& __x) {
00235     _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __pos))
00236     return iterator(&_M_iter_list, _M_non_dbg_impl.insert_equal(__pos._M_iterator, __x));
00237   }
00238 
00239 #if defined (_STLP_MEMBER_TEMPLATES)
00240   template<class _InputIterator>
00241   void insert_equal(_InputIterator __first, _InputIterator __last) {
00242     _STLP_DEBUG_CHECK(__check_range(__first,__last))
00243     _M_non_dbg_impl.insert_equal(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
00244   }
00245   template<class _InputIterator>
00246   void insert_unique(_InputIterator __first, _InputIterator __last) {
00247     _STLP_DEBUG_CHECK(__check_range(__first,__last))
00248     _M_non_dbg_impl.insert_unique(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
00249   }
00250 #else
00251   void insert_unique(const_iterator __first, const_iterator __last) {
00252     _STLP_DEBUG_CHECK(__check_range(__first,__last))
00253     _M_non_dbg_impl.insert_unique(__first._M_iterator, __last._M_iterator);
00254   }
00255   void insert_unique(const value_type* __first, const value_type* __last) {
00256     _STLP_DEBUG_CHECK(__check_ptr_range(__first,__last))
00257     _M_non_dbg_impl.insert_unique(__first, __last);
00258   }
00259   void insert_equal(const_iterator __first, const_iterator __last) {
00260     _STLP_DEBUG_CHECK(__check_range(__first,__last))
00261     _M_non_dbg_impl.insert_equal(__first._M_iterator, __last._M_iterator);
00262   }
00263   void insert_equal(const value_type* __first, const value_type* __last) {
00264     _STLP_DEBUG_CHECK(__check_ptr_range(__first,__last))
00265     _M_non_dbg_impl.insert_equal(__first, __last);
00266   }
00267 #endif
00268 
00269   void erase(iterator __pos) {
00270     _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
00271     _STLP_DEBUG_CHECK(_Dereferenceable(__pos))
00272     _Invalidate_iterator(__pos);
00273     _M_non_dbg_impl.erase(__pos._M_iterator);
00274   }
00275   size_type erase(const key_type& __x) {
00276     pair<iterator, iterator> __p = equal_range(__x);
00277     size_type __n = _STLP_STD::distance(__p.first._M_iterator, __p.second._M_iterator);
00278     _Invalidate_iterators(__p.first, __p.second);
00279     _M_non_dbg_impl.erase(__p.first._M_iterator, __p.second._M_iterator);
00280     return __n;
00281   }
00282   size_type erase_unique(const key_type& __x) {
00283     _Base_iterator __i = _M_non_dbg_impl.find(__x);
00284     if (__i != _M_non_dbg_impl.end()) {
00285       _Invalidate_iterator(iterator(&_M_iter_list, __i));
00286       _M_non_dbg_impl.erase(__i);
00287       return 1;
00288     }
00289     return 0;
00290   }
00291 
00292   void erase(iterator __first, iterator __last) {
00293     _STLP_DEBUG_CHECK(__check_range(__first, __last, begin(), end()))
00294     _Invalidate_iterators(__first, __last);
00295     _M_non_dbg_impl.erase(__first._M_iterator, __last._M_iterator);
00296   }
00297   void erase(const key_type* __first, const key_type* __last) {
00298     while (__first != __last) erase(*__first++);
00299   }
00300 
00301   void clear() {
00302     //should not invalidate end:
00303     _Invalidate_iterators(begin(), end());
00304     _M_non_dbg_impl.clear();
00305   }
00306 };
00307 
00308 _STLP_MOVE_TO_STD_NAMESPACE
00309 _STLP_END_NAMESPACE
00310 
00311 #undef _STLP_NON_DBG_TREE
00312 
00313 #endif /* _STLP_INTERNAL_DBG_TREE_H */
00314 
00315 // Local Variables:
00316 // mode:C++
00317 // End:

Generated on Sun May 27 2012 04:29:41 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.