64#ifndef _RWSTD_RW_TREE_H_INCLUDED
65#define _RWSTD_RW_TREE_H_INCLUDED
67#ifndef _RWSTD_RW_ALGOBASE_H_INCLUDED
71#ifndef _RWSTD_RW_ITERATOR_H_INCLUDED
79template <
class _Alloc,
class _Val,
class _Key,
class _KeyOf>
80struct __rw_rb_tree_node
82 enum _C_color_t { _C_red, _C_black };
84 typedef _Val& reference;
85 typedef _Alloc allocator_type;
87 typedef _RWSTD_REBIND (allocator_type, __rw_rb_tree_node) _C_node_alloc_t;
90 typedef typename _C_node_alloc_t::pointer _C_link_t;
91 typedef typename _C_key_alloc_t::const_reference _C_const_key_ref;
95 _C_link_t _C_child [2];
98 static _C_link_t _C_minmax (_C_link_t __lnk,
bool __do_max) {
100 while (_C_link_t () != __lnk->_C_child [__do_max])
101 __lnk = __lnk->_C_child [__do_max];
105 static _C_link_t _C_min (_C_link_t __lnk) {
106 return _C_minmax (__lnk,
false);
109 static _C_link_t _C_max (_C_link_t __lnk) {
110 return _C_minmax (__lnk,
true);
113 _C_const_key_ref _C_key ()
const {
114 return _KeyOf ()(_C_value);
121template <
class _TypeT,
class _DiffT,
122 class _Pointer,
class _Reference,
class _Node>
124 :
public _STD::iterator <_STD::bidirectional_iterator_tag,
125 _TypeT, _DiffT, _Pointer, _Reference>
127 typedef _STD::iterator <_STD::bidirectional_iterator_tag,
128 _TypeT, _DiffT, _Pointer, _Reference> _C_iter_base;
131 typedef typename _C_iter_base::value_type value_type;
132 typedef typename _C_iter_base::difference_type difference_type;
133 typedef typename _C_iter_base::pointer pointer;
134 typedef typename _C_iter_base::reference reference;
135 typedef typename _C_iter_base::iterator_category iterator_category;
136 typedef _Node _C_node_t;
137 typedef typename _C_node_t::allocator_type allocator_type;
138 typedef typename _C_node_t::_C_link_t _C_link_t;
140 typedef const value_type* const_pointer;
141 typedef const value_type& const_reference;
143 typedef __rw_tree_iter<_TypeT, _DiffT, value_type*, value_type&, _C_node_t>
148 __rw_tree_iter () { }
152 __rw_tree_iter (
const _C_iterator &__rhs)
153 : _C_node (__rhs._C_node) { }
155 template <
class _Ptr,
class _Ref>
156 __rw_tree_iter (
const __rw_tree_iter<_TypeT, _DiffT, _Ptr, _Ref, _Node>&
158 : _C_node (__rhs._C_node) { }
160 __rw_tree_iter (_C_link_t __lnk)
164 difference_type
operator- (
const __rw_tree_iter&)
const {
169 __rw_tree_iter& operator++ () {
170 if (_C_link_t () != _C_node->_C_child [1]) {
171 _C_node = _C_node_t::_C_min (_C_node->_C_child [1]);
174 _C_link_t __tmp = _C_node->_C_parent;
176 while (_C_node == __tmp->_C_child [1]) {
178 __tmp = __tmp->_C_parent;
181 if (_C_node->_C_child [1] != __tmp)
187 __rw_tree_iter& operator-- () {
188 if ( _C_node->_C_color == _C_node_t::_C_red
189 && _C_node->_C_parent->_C_parent == _C_node)
193 _C_node = _C_node->_C_child [1];
194 else if (_C_link_t () != _C_node->_C_child [0]) {
195 _C_node = _C_node_t::_C_max (_C_node->_C_child [0]);
198 _C_link_t __tmp = _C_node->_C_parent;
200 while (_C_node == __tmp->_C_child [0]) {
202 __tmp = __tmp->_C_parent;
209 __rw_tree_iter operator++ (
int) {
210 __rw_tree_iter __tmp (*
this);
211 return ++*
this, __tmp;
214 __rw_tree_iter operator-- (
int) {
215 __rw_tree_iter __tmp (*
this);
216 return --*
this, __tmp;
220 return _C_node->_C_value;
227#define _RWSTD_TREE_ITER(n) \
228 __rw_tree_iter <_TypeT, _DiffT, _Ptr##n, _Ref##n, _Node>
230template <
class _TypeT,
class _DiffT,
231 class _Ptr1,
class _Ref1,
class _Ptr2,
class _Ref2,
class _Node>
236 return __lhs._C_node == __rhs._C_node;
239template <
class _TypeT,
class _DiffT,
240 class _Ptr1,
class _Ref1,
class _Ptr2,
class _Ref2,
class _Node>
245 return !(__lhs == __rhs);
249#undef _RWSTD_TREE_ITER
253#define _ITER_NODE(it) (_ITER_BASE (it)._C_node)
257template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
258class __rb_tree :
private _Alloc
262 typedef __rw_rb_tree_node<_Alloc,_Val,_Key,_KeyOf> _C_node_t;
266 typedef typename _C_node_alloc_t::pointer _C_link_t;
270 typedef _Key key_type;
271 typedef _Val value_type;
272 typedef _Comp key_compare;
273 typedef _Alloc allocator_type;
275 typedef typename _C_val_alloc_t::pointer pointer;
276 typedef typename _C_val_alloc_t::const_pointer const_pointer;
277 typedef typename allocator_type::size_type size_type;
278 typedef typename allocator_type::difference_type difference_type;
279 typedef typename _C_val_alloc_t::reference reference;
280 typedef typename _C_val_alloc_t::const_reference const_reference;
284 typedef __rw_tree_iter<value_type, difference_type, pointer,
285 reference, _C_node_t> _C_tree_iter;
287 typedef __rw_tree_iter<value_type, difference_type, const_pointer,
288 const_reference, _C_node_t> _C_tree_citer;
292#ifndef _RWSTD_NO_DEBUG_ITER
294 typedef __rw_debug_iter <__rb_tree, _C_tree_iter, _C_tree_iter>
297 typedef __rw_debug_iter <__rb_tree, _C_tree_citer, _C_tree_iter>
300 iterator _C_make_iter (_C_link_t __node) {
301 return iterator (*
this, _C_tree_iter (__node));
304 const_iterator _C_make_iter (_C_link_t __node)
const {
305 return const_iterator (*
this, _C_tree_citer (__node));
310 typedef _C_tree_iter iterator;
311 typedef _C_tree_citer const_iterator;
313 iterator _C_make_iter (_C_link_t __node) {
314 return iterator (__node);
317 const_iterator _C_make_iter (_C_link_t __node)
const {
318 return const_iterator (__node);
325#ifdef _RWSTD_NO_NESTED_CLASS_ACCESS
330 friend struct _C_node_buf;
335 typedef _RWSTD_REBIND (allocator_type, _C_node_buf) _C_buf_alloc_t;
336 typedef typename _C_buf_alloc_t::pointer _C_buf_ptr_t;
338 _C_buf_ptr_t _C_next_buffer;
343 typedef typename _C_node_buf::_C_buf_alloc_t _C_buf_alloc_t;
344 typedef typename _C_node_buf::_C_buf_ptr_t _C_buf_ptr_t;
346 _C_buf_ptr_t _C_buf_list;
347 _C_link_t _C_free_list;
348 _C_link_t _C_next_avail;
351 void _C_add_new_buffer ();
353 void _C_deallocate_buffers ();
358 _C_link_t _C_get_link () {
359 _C_link_t __tmp = _C_free_list;
360 _C_link_t __tmp2 = (
void*)_C_free_list ?
362 : (_C_next_avail == _C_last ? (_C_add_new_buffer (), _C_next_avail++)
364 __tmp2->_C_parent = 0;
365 __tmp2->_C_child [0] = 0;
366 __tmp2->_C_child [1] = 0;
367 __tmp2->_C_color = _C_node_t::_C_red;
376 _C_link_t _C_get_node (const_reference __v) {
377 _C_link_t __tmp2 = _C_get_link ();
382 address (__tmp2->_C_value)),
386 _C_put_node (__tmp2,
false);
392 _C_link_t _C_get_node () {
393 return _C_get_link ();
399 void _C_put_node (_C_link_t __p,
bool __destroy =
true) {
400 __p->_C_child [1] = _C_free_list;
404 address (__p->_C_value))));
426#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
428 typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
429 typedef _STD::reverse_iterator<iterator> reverse_iterator;
433 typedef std::reverse_iterator<const_iterator,
434 _STD::bidirectional_iterator_tag, value_type,
435 const_reference, const_pointer, difference_type>
436 const_reverse_iterator;
438 typedef std::reverse_iterator<iterator,
439 _STD::bidirectional_iterator_tag, value_type,
440 reference, pointer, difference_type>
447 iterator _C_insert (_C_link_t, _C_link_t,
const value_type&);
449 _C_link_t _C_copy (_C_link_t, _C_link_t);
451 void _C_erase (_C_link_t);
453 void _C_erase_leaf (_C_link_t);
460 _C_end = _C_get_node ();
461 _C_end->_C_parent = 0;
462 _C_end->_C_child [0] =
463 _C_end->_C_child [1] = _C_end;
468 __rb_tree (
const key_compare& = key_compare (),
469 const allocator_type& = allocator_type ());
471 template<
class _InputIter>
472 __rb_tree (_InputIter __first, _InputIter __last,
473 const key_compare &__cmp,
474 const allocator_type &__alloc,
bool __dup)
475 : allocator_type (__alloc), _C_buf_list (0),
476 _C_end (0), _C_size (0),
482 insert (__first, __last, __dup);
485 _C_deallocate_buffers ();
490 __rb_tree (
const __rb_tree&);
494 __rb_tree& operator= (
const __rb_tree&);
496 key_compare key_comp ()
const {
500 _C_val_alloc_t get_allocator ()
const {
501 return _C_val_alloc_t (*
this);
505 return _C_make_iter (_C_end->_C_child [0]);
508 const_iterator begin ()
const {
509 return _C_make_iter (_C_end->_C_child [0]);
513 return _C_make_iter (_C_end);
516 const_iterator
end ()
const {
517 return _C_make_iter (_C_end);
520 reverse_iterator rbegin () {
521 return reverse_iterator (
end ());
524 reverse_iterator rend () {
525 return reverse_iterator (begin ());
528 const_reverse_iterator rbegin ()
const {
529 return const_reverse_iterator (
end ());
532 const_reverse_iterator rend ()
const {
533 return const_reverse_iterator (begin ());
536 bool empty ()
const {
540 size_type
size ()
const {
544 size_type max_size ()
const {
545 return _C_node_alloc_t (*this).max_size ();
548 void swap (__rb_tree &__rhs) {
549 if (get_allocator () == __rhs.get_allocator ()) {
550 _STD::swap (_C_buf_list, __rhs._C_buf_list);
551 _STD::swap (_C_free_list, __rhs._C_free_list);
552 _STD::swap (_C_next_avail, __rhs._C_next_avail);
553 _STD::swap (_C_last, __rhs._C_last);
554 _STD::swap (_C_end, __rhs._C_end);
555 _STD::swap (_C_size, __rhs._C_size);
556 _STD::swap (_C_cmp, __rhs._C_cmp);
559 __rb_tree __tmp = *
this;
565 void _C_insert (
const value_type&, _STD::pair<iterator, bool>&,
bool);
567 _STD::pair<iterator, bool>
568 insert (
const value_type &__val,
bool __dup) {
569 _STD::pair<iterator, bool> __ret;
570 return _C_insert (__val, __ret, __dup), __ret;
573 iterator insert (iterator,
const value_type&,
bool);
575 template<
class _Iterator>
576 void insert (_Iterator __first, _Iterator __last,
bool __dup) {
577 for (; __first != __last; ++__first)
578 insert (*__first, __dup);
581 iterator erase (iterator);
583 size_type erase (
const key_type&);
585 iterator erase (iterator, iterator);
588#if !defined (_MSC_VER) || _MSC_VER > 1300
591 iterator insert (const_iterator __it,
const value_type &__x,
bool __dup) {
592 return insert (_C_make_iter (
_ITER_NODE (__it)), __x, __dup);
596 iterator erase (const_iterator __it) {
597 return erase (_C_make_iter (
_ITER_NODE (__it)));
601 iterator erase (const_iterator __first, const_iterator __last) {
602 return erase (_C_make_iter (
_ITER_NODE (__first)),
608 void erase (
const key_type*,
const key_type*);
611 erase (begin (),
end ());
614 iterator find (
const key_type&);
616 const_iterator find (
const key_type& __key)
const {
620 size_type
count (
const key_type&)
const;
622 iterator lower_bound (
const key_type&);
624 const_iterator lower_bound (
const key_type& __key)
const {
628 iterator upper_bound (
const key_type&);
630 const_iterator upper_bound (
const key_type& __key)
const {
634 _STD::pair<iterator, iterator> equal_range (
const key_type&);
636 _STD::pair<const_iterator, const_iterator>
637 equal_range (
const key_type& __key)
const {
638 _STD::pair<iterator, iterator> __tmp =
640 return _STD::pair<const_iterator, const_iterator>
641 (__tmp.first, __tmp.second);
644#ifndef _RWSTD_NO_OPTIMIZE_SPEED
646 void _C_rol (_C_link_t);
647 void _C_ror (_C_link_t);
651 void _C_rotate (_C_link_t,
bool);
655 size_type _C_level (const_iterator)
const;
658 size_type _C_depth (const_iterator, size_type* = 0)
const;
660 size_type _C_depth ()
const {
661 return _C_depth (_C_make_iter (_C_end->_C_parent));
666template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
668operator== (
const __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>& __lhs,
669 const __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>& __rhs)
671 return __lhs.size () == __rhs.size ()
672 && _STD::equal (__lhs.begin (), __lhs.end (), __rhs.begin ());
676template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
678operator< (
const __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>& __lhs,
679 const __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>& __rhs)
681 return _STD::lexicographical_compare (__lhs.begin (), __lhs.end (),
682 __rhs.begin (), __rhs.end ());
686template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
688__rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
689_C_erase_leaf (_C_link_t __lnk)
692 const _C_link_t __parent = __lnk->_C_parent;
694 if (__parent == _C_end) {
695 _C_end->_C_parent = 0;
696 _C_end->_C_child [0] =
697 _C_end->_C_child [1] = __parent;
700#ifndef _RWSTD_NO_OPTIMIZE_SPEED
702 else if (__parent->_C_child [0] == __lnk) {
703 __parent->_C_child [0] = 0;
704 if (_C_end->_C_child [0] == __lnk)
705 _C_end->_C_child [0] = __parent;
708 __parent->_C_child [1] = 0;
709 if (_C_end->_C_child [1] == __lnk)
710 _C_end->_C_child [1] = __parent;
716 const bool __right = __parent->_C_child [0] != __lnk;
717 __parent->_C_child [__right] = 0;
718 if (_C_end->_C_child [__right] == __lnk)
719 _C_end->_C_child [__right] = __parent;
726#ifndef _RWSTD_NO_OPTIMIZE_SPEED
728template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
730__rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
731_C_rol (_C_link_t __lnk)
735 _C_link_t __tmp = __lnk->_C_child [1];
736 __lnk->_C_child [1] = __tmp->_C_child [0];
738 if (_C_link_t () != __tmp->_C_child [0])
739 __tmp->_C_child [0]->_C_parent = __lnk;
741 __tmp->_C_parent = __lnk->_C_parent;
743 if (__lnk == _C_end->_C_parent)
744 _C_end->_C_parent = __tmp;
745 else if (__lnk == __lnk->_C_parent->_C_child [0])
746 __lnk->_C_parent->_C_child [0] = __tmp;
748 __lnk->_C_parent->_C_child [1] = __tmp;
750 __tmp->_C_child [0] = __lnk;
751 __lnk->_C_parent = __tmp;
755template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
757__rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
758_C_ror (_C_link_t __lnk)
762 _C_link_t __tmp = __lnk->_C_child [0];
763 __lnk->_C_child [0] = __tmp->_C_child [1];
765 if (_C_link_t () != __tmp->_C_child [1])
766 __tmp->_C_child [1]->_C_parent = __lnk;
768 __tmp->_C_parent = __lnk->_C_parent;
770 if (__lnk == _C_end->_C_parent)
771 _C_end->_C_parent = __tmp;
772 else if (__lnk == __lnk->_C_parent->_C_child [1])
773 __lnk->_C_parent->_C_child [1] = __tmp;
775 __lnk->_C_parent->_C_child [0] = __tmp;
777 __tmp->_C_child [1] = __lnk;
778 __lnk->_C_parent = __tmp;
783template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
785__rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
786_C_rotate (_C_link_t __lnk,
bool __right)
790 _C_link_t __tmp = __lnk->_C_child [!__right];
791 __lnk->_C_child [!__right] = __tmp->_C_child [__right];
793 if (_C_link_t () != __tmp->_C_child [__right])
794 __tmp->_C_child [__right]->_C_parent = __lnk;
796 __tmp->_C_parent = __lnk->_C_parent;
798 if (__lnk == _C_end->_C_parent)
799 _C_end->_C_parent = __tmp;
801 const bool __rt = __lnk == __lnk->_C_parent->_C_child [1];
802 __lnk->_C_parent->_C_child [__rt] = __tmp;
805 __tmp->_C_child [__right] = __lnk;
806 __lnk->_C_parent = __tmp;
812template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
813inline void __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
814erase (
const _Key* __first,
const _Key* __last)
816 for (; __first != __last; ++__first)
821template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
822inline typename __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::size_type
823__rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
824count (
const _Key& __k)
const
826 _STD::pair<const_iterator, const_iterator> __p = equal_range (__k);
827 size_type __n =
_DISTANCE (__p.first, __p.second, size_type);
832#define _RWSTD_RB_TREE_ITER \
833 typename __rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::iterator
835template <
class _Key,
class _Val,
class _KeyOf,
class _Comp,
class _Alloc>
836inline _STD::pair<_RWSTD_RB_TREE_ITER , _RWSTD_RB_TREE_ITER >
837__rb_tree<_Key, _Val, _KeyOf, _Comp, _Alloc>::
838equal_range (
const _Key& __k)
840 return _STD::pair<iterator, iterator>(lower_bound (__k), upper_bound(__k));
844#undef _RWSTD_RB_TREE_ITER
850#ifdef _RWSTD_NO_IMPLICIT_INCLUSION
void count(T, T, const U &,...)
const minus< T > & operator-(const minus< T > &lhs, const minus< T > &rhs)
const plus_asgn< T > & operator*(const plus_asgn< T > &lhs, const plus_asgn< T > &rhs)
#define _RWSTD_VALUE_ALLOC(ignore, object, call)
#define _RWSTD_ALLOC_TYPE(Allocator, ignore)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_REBIND(from, to)
#define _RWSTD_ASSERT(ignore)
#define _DISTANCE(first, last, ignore)
#define _RWSTD_CONST_CAST(T, x)
#define _RWSTD_OPERATOR_ARROW(signature)
#define _RWSTD_TREE_ITER(n)
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept