|
|
|
@ -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: |
|
|
|
|