@ -16,17 +16,30 @@ class IntrusiveRedBlackTreeImpl;
}
struct IntrusiveRedBlackTreeNode {
public :
using EntryType = RBEntry < IntrusiveRedBlackTreeNode > ;
constexpr IntrusiveRedBlackTreeNode ( ) = default ;
void SetEntry ( const EntryType & new_entry ) {
entry = new_entry ;
}
[[nodiscard]] EntryType & GetEntry ( ) {
return entry ;
}
[[nodiscard]] const EntryType & GetEntry ( ) const {
return entry ;
}
private :
RB_ENTRY ( IntrusiveRedBlackTreeNode ) entry { } ;
EntryType entry { } ;
friend class impl : : IntrusiveRedBlackTreeImpl ;
template < class , class , class >
friend class IntrusiveRedBlackTree ;
public :
constexpr IntrusiveRedBlackTreeNode ( ) = default ;
} ;
template < class T , class Traits , class Comparator >
@ -35,17 +48,12 @@ class IntrusiveRedBlackTree;
namespace impl {
class IntrusiveRedBlackTreeImpl {
private :
template < class , class , class >
friend class : : Common : : IntrusiveRedBlackTree ;
private :
RB_HEAD ( IntrusiveRedBlackTreeRoot , IntrusiveRedBlackTreeNode ) ;
using RootType = IntrusiveRedBlackTreeRoot ;
private :
IntrusiveRedBlackTreeRoot root ;
using RootType = RBHead < IntrusiveRedBlackTreeNode > ;
RootType root ;
public :
template < bool Const >
@ -121,57 +129,45 @@ public:
}
} ;
protected :
// Generate static implementations for non-comparison operations for IntrusiveRedBlackTreeRoot.
RB_GENERATE_WITHOUT_COMPARE_STATIC ( IntrusiveRedBlackTreeRoot , IntrusiveRedBlackTreeNode , entry ) ;
private :
// Define accessors using RB_* functions.
constexpr void InitializeImpl ( ) {
RB_INIT ( & this - > root ) ;
}
bool EmptyImpl ( ) const {
return RB_EMPTY ( & this - > root ) ;
return root . IsEmpty ( ) ;
}
IntrusiveRedBlackTreeNode * GetMinImpl ( ) const {
return RB_MIN ( IntrusiveRedBlackTreeRoot ,
const_cast < IntrusiveRedBlackTreeRoot * > ( & this - > root ) ) ;
return RB_MIN ( const_cast < RootType * > ( & root ) ) ;
}
IntrusiveRedBlackTreeNode * GetMaxImpl ( ) const {
return RB_MAX ( IntrusiveRedBlackTreeRoot ,
const_cast < IntrusiveRedBlackTreeRoot * > ( & this - > root ) ) ;
return RB_MAX ( const_cast < RootType * > ( & root ) ) ;
}
IntrusiveRedBlackTreeNode * RemoveImpl ( IntrusiveRedBlackTreeNode * node ) {
return RB_REMOVE ( IntrusiveRedBlackTreeRoot , & this - > root , node ) ;
return RB_REMOVE ( & root , node ) ;
}
public :
static IntrusiveRedBlackTreeNode * GetNext ( IntrusiveRedBlackTreeNode * node ) {
return RB_NEXT ( IntrusiveRedBlackTreeRoot, nullptr , node) ;
return RB_NEXT ( node) ;
}
static IntrusiveRedBlackTreeNode * GetPrev ( IntrusiveRedBlackTreeNode * node ) {
return RB_PREV ( IntrusiveRedBlackTreeRoot, nullptr , node) ;
return RB_PREV ( node) ;
}
static IntrusiveRedBlackTreeNode const * GetNext ( const IntrusiveRedBlackTreeNode * node ) {
static const IntrusiveRedBlackTreeNode * GetNext ( const IntrusiveRedBlackTreeNode * node ) {
return static_cast < const IntrusiveRedBlackTreeNode * > (
GetNext ( const_cast < IntrusiveRedBlackTreeNode * > ( node ) ) ) ;
}
static IntrusiveRedBlackTreeNode const * GetPrev ( const IntrusiveRedBlackTreeNode * node ) {
static const IntrusiveRedBlackTreeNode * GetPrev ( const IntrusiveRedBlackTreeNode * node ) {
return static_cast < const IntrusiveRedBlackTreeNode * > (
GetPrev ( const_cast < IntrusiveRedBlackTreeNode * > ( node ) ) ) ;
}
public :
constexpr IntrusiveRedBlackTreeImpl ( ) : root ( ) {
this - > InitializeImpl ( ) ;
}
constexpr IntrusiveRedBlackTreeImpl ( ) { }
// Iterator accessors.
iterator begin ( ) {
@ -269,8 +265,6 @@ private:
ImplType impl { } ;
public :
struct IntrusiveRedBlackTreeRootWithCompare : ImplType : : IntrusiveRedBlackTreeRoot { } ;
template < bool Const >
class Iterator ;
@ -362,11 +356,6 @@ public:
}
} ;
private :
// Generate static implementations for comparison operations for IntrusiveRedBlackTreeRoot.
RB_GENERATE_WITH_COMPARE_STATIC ( IntrusiveRedBlackTreeRootWithCompare , IntrusiveRedBlackTreeNode ,
entry , CompareImpl , LightCompareImpl ) ;
private :
static int CompareImpl ( const IntrusiveRedBlackTreeNode * lhs ,
const IntrusiveRedBlackTreeNode * rhs ) {
@ -379,41 +368,27 @@ private:
// Define accessors using RB_* functions.
IntrusiveRedBlackTreeNode * InsertImpl ( IntrusiveRedBlackTreeNode * node ) {
return RB_INSERT ( IntrusiveRedBlackTreeRootWithCompare ,
static_cast < IntrusiveRedBlackTreeRootWithCompare * > ( & this - > impl . root ) ,
node ) ;
return RB_INSERT ( & impl . root , node , CompareImpl ) ;
}
IntrusiveRedBlackTreeNode * FindImpl ( const IntrusiveRedBlackTreeNode * node ) const {
return RB_FIND (
IntrusiveRedBlackTreeRootWithCompare ,
const_cast < IntrusiveRedBlackTreeRootWithCompare * > (
static_cast < const IntrusiveRedBlackTreeRootWithCompare * > ( & this - > impl . root ) ) ,
const_cast < IntrusiveRedBlackTreeNode * > ( node ) ) ;
return RB_FIND ( const_cast < ImplType : : RootType * > ( & impl . root ) ,
const_cast < IntrusiveRedBlackTreeNode * > ( node ) , CompareImpl ) ;
}
IntrusiveRedBlackTreeNode * NFindImpl ( const IntrusiveRedBlackTreeNode * node ) const {
return RB_NFIND (
IntrusiveRedBlackTreeRootWithCompare ,
const_cast < IntrusiveRedBlackTreeRootWithCompare * > (
static_cast < const IntrusiveRedBlackTreeRootWithCompare * > ( & this - > impl . root ) ) ,
const_cast < IntrusiveRedBlackTreeNode * > ( node ) ) ;
return RB_NFIND ( const_cast < ImplType : : RootType * > ( & impl . root ) ,
const_cast < IntrusiveRedBlackTreeNode * > ( node ) , CompareImpl ) ;
}
IntrusiveRedBlackTreeNode * FindLightImpl ( const_light_pointer lelm ) const {
return RB_FIND_LIGHT (
IntrusiveRedBlackTreeRootWithCompare ,
const_cast < IntrusiveRedBlackTreeRootWithCompare * > (
static_cast < const IntrusiveRedBlackTreeRootWithCompare * > ( & this - > impl . root ) ) ,
static_cast < const void * > ( lelm ) ) ;
return RB_FIND_LIGHT ( const_cast < ImplType : : RootType * > ( & impl . root ) ,
static_cast < const void * > ( lelm ) , LightCompareImpl ) ;
}
IntrusiveRedBlackTreeNode * NFindLightImpl ( const_light_pointer lelm ) const {
return RB_NFIND_LIGHT (
IntrusiveRedBlackTreeRootWithCompare ,
const_cast < IntrusiveRedBlackTreeRootWithCompare * > (
static_cast < const IntrusiveRedBlackTreeRootWithCompare * > ( & this - > impl . root ) ) ,
static_cast < const void * > ( lelm ) ) ;
return RB_NFIND_LIGHT ( const_cast < ImplType : : RootType * > ( & impl . root ) ,
static_cast < const void * > ( lelm ) , LightCompareImpl ) ;
}
public :