40
40
#include < __utility/forward.h>
41
41
#include < __utility/move.h>
42
42
#include < __utility/pair.h>
43
+ #include < __utility/pointer_int_pair.h>
43
44
#include < __utility/swap.h>
44
45
#include < limits>
45
46
@@ -61,7 +62,7 @@ class __tree_const_iterator;
61
62
62
63
template <class _Pointer >
63
64
class __tree_end_node ;
64
- template <class _VoidPtr >
65
+ template <class _VoidPtr , class = void >
65
66
class __tree_node_base ;
66
67
template <class _Tp , class _VoidPtr >
67
68
class __tree_node ;
@@ -626,7 +627,7 @@ public:
626
627
_LIBCPP_HIDE_FROM_ABI __tree_end_node () _NOEXCEPT : __left_() {}
627
628
};
628
629
629
- template <class _VoidPtr >
630
+ template <class _VoidPtr , class >
630
631
class _LIBCPP_STANDALONE_DEBUG __tree_node_base : public __tree_node_base_types<_VoidPtr>::__end_node_type {
631
632
typedef __tree_node_base_types<_VoidPtr> _NodeBaseTypes;
632
633
@@ -654,6 +655,48 @@ public:
654
655
__tree_node_base& operator =(__tree_node_base const &) = delete ;
655
656
};
656
657
658
+ #ifdef _LIBCPP_ABI_TREE_POINTER_INT_PAIR
659
+ template <class _VoidPtr >
660
+ class __tree_node_base <
661
+ _VoidPtr,
662
+ __enable_if_t <is_pointer<typename __tree_node_base_types<_VoidPtr>::__node_base_pointer>::value> >
663
+ : public __tree_node_base_types<_VoidPtr>::__end_node_type {
664
+ using _NodeBaseTypes = __tree_node_base_types<_VoidPtr>;
665
+
666
+ public:
667
+ using pointer = typename _NodeBaseTypes::__node_base_pointer;
668
+ using __parent_pointer = typename _NodeBaseTypes::__parent_pointer;
669
+
670
+ pointer __right_;
671
+
672
+ private:
673
+ using __pair_t = __pointer_int_pair<__parent_pointer, bool , __integer_width(1 )>;
674
+
675
+ __pair_t __parent_and_color_;
676
+
677
+ public:
678
+ _LIBCPP_HIDE_FROM_ABI pointer __parent_unsafe () const {
679
+ return static_cast <pointer>(__parent_and_color_.__get_ptr ());
680
+ }
681
+
682
+ _LIBCPP_HIDE_FROM_ABI void __set_parent (pointer __ptr) { __set_parent (static_cast <__parent_pointer>(__ptr)); }
683
+
684
+ _LIBCPP_HIDE_FROM_ABI void __set_parent (__parent_pointer __ptr) {
685
+ __parent_and_color_ = __pair_t (__ptr, __parent_and_color_.__get_value ());
686
+ }
687
+
688
+ _LIBCPP_HIDE_FROM_ABI __parent_pointer __get_parent () const { return __parent_and_color_.__get_ptr (); }
689
+ _LIBCPP_HIDE_FROM_ABI __tree_color __get_color () const {
690
+ return static_cast <__tree_color>(__parent_and_color_.__get_value ());
691
+ }
692
+ _LIBCPP_HIDE_FROM_ABI void __set_color (__tree_color __color) {
693
+ __parent_and_color_ = __pair_t (__parent_and_color_.__get_ptr (), __color == __tree_color::__black);
694
+ }
695
+ };
696
+ #endif // _LIBCPP_ABI_TREE_POINTER_INT_PAIR
697
+
698
+ static_assert (sizeof (__tree_node_base<void *>) == 24);
699
+
657
700
template <class _Tp , class _VoidPtr >
658
701
class _LIBCPP_STANDALONE_DEBUG __tree_node : public __tree_node_base<_VoidPtr> {
659
702
public:
0 commit comments