36 #ifndef BOOST_MULTI_INDEX_DETAIL_ORD_INDEX_NODE_HPP
37 #define BOOST_MULTI_INDEX_DETAIL_ORD_INDEX_NODE_HPP
48 #if !defined(BOOST_MULTI_INDEX_DISABLE_COMPRESSED_ORDERED_INDEX_NODES)
58 namespace multi_index{
67 template<
typename AugmentPolicy,
typename Allocator>
70 template<
typename AugmentPolicy,
typename Allocator>
102 #if !defined(BOOST_MULTI_INDEX_DISABLE_COMPRESSED_ORDERED_INDEX_NODES)
109 #if defined(BOOST_MSVC)
116 #pragma warning(push)
117 #pragma warning(disable:4312 4311)
120 template<
typename AugmentPolicy,
typename Allocator>
204 #if defined(BOOST_MSVC)
209 template<
typename AugmentPolicy,
typename Allocator>
212 #if !defined(BOOST_MULTI_INDEX_DISABLE_COMPRESSED_ORDERED_INDEX_NODES)
213 AugmentPolicy::template augmented_node<
215 !(has_uintptr_type::value)||
217 ordered_index_node_compressed_base<AugmentPolicy,Allocator>
220 typename boost::detail::allocator::rebind_to<
222 ordered_index_node_impl<AugmentPolicy,Allocator>
224 ordered_index_node_impl<AugmentPolicy,Allocator>*>::value),
225 ordered_index_node_std_base<AugmentPolicy,Allocator>,
226 ordered_index_node_compressed_base<AugmentPolicy,Allocator>
230 AugmentPolicy::template augmented_node<
231 ordered_index_node_std_base<AugmentPolicy,Allocator>
237 template<
typename AugmentPolicy,
typename Allocator>
256 while(x->left()!=
pointer(0))x=x->left();
260 while(x==y->right()){
264 if(x->right()!=y)x=y;
270 if(x->color()==
red&&x->parent()->parent()==x){
273 else if(x->left()!=
pointer(0)){
275 while(y->right()!=
pointer(0))y=y->right();
292 x->right()=y->left();
293 if(y->left()!=
pointer(0))y->left()->parent()=x;
294 y->parent()=x->parent();
297 else if(x==x->parent()->left())x->parent()->left()=y;
298 else x->parent()->right()=y;
301 AugmentPolicy::rotate_left(x,y);
306 while(x->left()!=
pointer(0))x=x->left();
312 while(x->right()!=
pointer(0))x=x->right();
319 x->left()=y->right();
320 if(y->right()!=
pointer(0))y->right()->parent()=x;
321 y->parent()=x->parent();
324 else if(x==x->parent()->right())x->parent()->right()=y;
325 else x->parent()->left()=y;
328 AugmentPolicy::rotate_right(x,y);
334 while(x!=root&&x->parent()->color()==
red){
335 if(x->parent()==x->parent()->parent()->left()){
336 pointer y=x->parent()->parent()->right();
338 x->parent()->color()=
black;
340 x->parent()->parent()->color()=
red;
341 x=x->parent()->parent();
344 if(x==x->parent()->right()){
348 x->parent()->color()=
black;
349 x->parent()->parent()->color()=
red;
354 pointer y=x->parent()->parent()->left();
356 x->parent()->color()=
black;
358 x->parent()->parent()->color()=
red;
359 x=x->parent()->parent();
362 if(x==x->parent()->left()){
366 x->parent()->color()=
black;
367 x->parent()->parent()->color()=
red;
384 else if(position==
header->left()){
390 if(position==
header->right()){
394 x->parent()=position;
416 while(y->left()!=
pointer(0))y=y->left();
420 AugmentPolicy::remove(y,
pointer(root));
422 AugmentPolicy::copy(z,y);
423 z->left()->parent()=y;
426 x_parent=y->parent();
427 if(x!=
pointer(0))x->parent()=y->parent();
428 y->parent()->left()=x;
429 y->right()=z->right();
430 z->right()->parent()=y;
437 else if(z->parent()->left()==z)z->parent()->left()=y;
438 else z->parent()->right()=y;
439 y->parent()=z->parent();
441 y->color()=z->color();
446 x_parent=y->parent();
447 if(x!=
pointer(0))x->parent()=y->parent();
452 if(z->parent()->left()==z)z->parent()->left()=x;
453 else z->parent()->right()=x;
457 leftmost=z->parent();
465 rightmost=z->parent();
474 if(x==x_parent->left()){
478 x_parent->color()=
red;
482 if((w->left()==
pointer(0)||w->left()->color()==
black) &&
486 x_parent=x_parent->parent();
490 || w->right()->color()==
black){
496 w->color()=x_parent->color();
497 x_parent->color()=
black;
507 x_parent->color()=
red;
511 if((w->right()==
pointer(0)||w->right()->color()==
black) &&
515 x_parent=x_parent->parent();
524 w->color()=x_parent->color();
525 x_parent->color()=
black;
548 #if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
556 if(node->color()==
black)++sum;
565 template<
typename AugmentPolicy,
typename Super>
569 typename boost::detail::allocator::rebind_to<
570 typename Super::allocator_type,
578 typename Super::allocator_type,
584 template<
typename AugmentPolicy,
typename Super>
624 raw_ptr<impl_type*>(x)));
632 raw_ptr<const impl_type*>(x)));