176template <
typename KeyType,
typename Comparer>
182 Node* pNode = m_pRoot;
184 while (pNode->m_pLink[0] != &m_NilNode)
185 pNode = pNode->m_pLink[0];
190template <
typename KeyType,
typename Comparer>
196 Node* pNode = m_pRoot;
198 while (pNode->m_pLink[1] != &m_NilNode)
199 pNode = pNode->m_pLink[1];
204template <
typename KeyType,
typename Comparer>
205template <
typename CompatibleKeyType>
208 Node* pNode = m_pRoot;
210 while (pNode != &m_NilNode)
212 const plInt32 dir = (plInt32)m_Comparer.Less(pNode->m_Key, key);
213 const plInt32 dir2 = (plInt32)m_Comparer.Less(key, pNode->m_Key);
218 pNode = pNode->m_pLink[dir];
221 if (pNode == &m_NilNode)
227template <
typename KeyType,
typename Comparer>
228template <
typename CompatibleKeyType>
231 return Iterator(Internal_Find(key));
234template <
typename KeyType,
typename Comparer>
235template <
typename CompatibleKeyType>
238 return Internal_Find(key) !=
nullptr;
241template <
typename KeyType,
typename Comparer>
244 for (
const KeyType& key : operand)
253template <
typename KeyType,
typename Comparer>
254template <
typename CompatibleKeyType>
257 Node* pNode = m_pRoot;
258 Node* pNodeSmaller =
nullptr;
260 while (pNode != &m_NilNode)
262 const plInt32 dir = (plInt32)m_Comparer.Less(pNode->m_Key, key);
263 const plInt32 dir2 = (plInt32)m_Comparer.Less(key, pNode->m_Key);
269 pNodeSmaller = pNode;
271 pNode = pNode->m_pLink[dir];
277template <
typename KeyType,
typename Comparer>
278template <
typename CompatibleKeyType>
281 return Iterator(Internal_LowerBound(key));
284template <
typename KeyType,
typename Comparer>
285template <
typename CompatibleKeyType>
288 Node* pNode = m_pRoot;
289 Node* pNodeSmaller =
nullptr;
291 while (pNode != &m_NilNode)
293 const plInt32 dir = (plInt32)m_Comparer.Less(pNode->m_Key, key);
294 const plInt32 dir2 = (plInt32)m_Comparer.Less(key, pNode->m_Key);
300 return it.m_pElement;
304 pNodeSmaller = pNode;
306 pNode = pNode->m_pLink[dir];
312template <
typename KeyType,
typename Comparer>
313template <
typename CompatibleKeyType>
316 return Iterator(Internal_UpperBound(key));
319template <
typename KeyType,
typename Comparer>
322 for (
const auto& key : operand)
328template <
typename KeyType,
typename Comparer>
331 for (
const auto& key : operand)
337template <
typename KeyType,
typename Comparer>
340 for (
auto it = GetIterator(); it.IsValid();)
349template <
typename KeyType,
typename Comparer>
350template <
typename CompatibleKeyType>
353 Node* pInsertedNode =
nullptr;
355 m_pRoot = Insert(m_pRoot, std::forward<CompatibleKeyType>(key), pInsertedNode);
356 m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
357 m_NilNode.m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
362template <
typename KeyType,
typename Comparer>
363template <
typename CompatibleKeyType>
366 bool bRemoved =
true;
367 m_pRoot = Remove(m_pRoot, key, bRemoved);
368 m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
369 m_NilNode.m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
374template <
typename KeyType,
typename Comparer>
375template <
typename CompatibleKeyType>
380 if (m_pFreeElementStack ==
nullptr)
382 m_Elements.PushBack();
383 pNode = &m_Elements.PeekBack();
387 pNode = m_pFreeElementStack;
388 m_pFreeElementStack = m_pFreeElementStack->m_pParent;
393 pNode->m_pParent = pParent;
394 pNode->m_Key = std::forward<CompatibleKeyType>(key);
395 pNode->m_uiLevel = uiLevel;
396 pNode->m_pLink[0] =
reinterpret_cast<Node*
>(&m_NilNode);
397 pNode->m_pLink[1] =
reinterpret_cast<Node*
>(&m_NilNode);
404template <
typename KeyType,
typename Comparer>
407 PL_ASSERT_DEBUG(pNode !=
nullptr,
"pNode is invalid.");
412 if (pNode == &m_Elements.PeekBack())
414 m_Elements.PopBack();
416 else if (pNode == &m_Elements.PeekFront())
418 m_Elements.PopFront();
422 pNode->m_pParent = m_pFreeElementStack;
423 m_pFreeElementStack = pNode;
429template <
typename KeyType,
typename Comparer>
432 if ((root->m_pLink[0]->m_uiLevel == root->m_uiLevel) && (root->m_uiLevel != 0))
434 Node* save = root->m_pLink[0];
435 root->m_pLink[0] = save->m_pLink[1];
436 root->m_pLink[0]->m_pParent = root;
437 save->m_pLink[1] = root;
438 save->m_pLink[1]->m_pParent = save;
445template <
typename KeyType,
typename Comparer>
448 if ((root->m_pLink[1]->m_pLink[1]->m_uiLevel == root->m_uiLevel) && (root->m_uiLevel != 0))
450 Node* save = root->m_pLink[1];
451 root->m_pLink[1] = save->m_pLink[0];
452 root->m_pLink[1]->m_pParent = root;
453 save->m_pLink[0] = root;
454 save->m_pLink[0]->m_pParent = save;
462template <
typename KeyType,
typename Comparer>
463template <
typename CompatibleKeyType>
466 if (root == &m_NilNode)
468 pInsertedNode = AcquireNode(std::forward<CompatibleKeyType>(key), 1,
reinterpret_cast<Node*
>(&m_NilNode));
469 root = pInsertedNode;
474 Node* up[STACK_SIZE];
481 PL_ASSERT_DEBUG(top < STACK_SIZE,
"plSetBase's internal stack is not large enough to be able to sort {0} elements.", GetCount());
483 dir = m_Comparer.Less(it->m_Key, key) ? 1 : 0;
486 if ((plInt32)m_Comparer.Less(key, it->m_Key) == dir)
492 if (it->m_pLink[dir] == &m_NilNode)
495 it = it->m_pLink[dir];
498 pInsertedNode = AcquireNode(std::forward<CompatibleKeyType>(key), 1, it);
499 it->m_pLink[dir] = pInsertedNode;
504 dir = up[top - 1]->m_pLink[1] == up[top];
506 up[top] = SkewNode(up[top]);
507 up[top] = SplitNode(up[top]);
511 up[top - 1]->m_pLink[dir] = up[top];
512 up[top - 1]->m_pLink[dir]->m_pParent = up[top - 1];
522template <
typename KeyType,
typename Comparer>
523template <
typename CompatibleKeyType>
528 Node* ToErase =
reinterpret_cast<Node*
>(&m_NilNode);
529 Node* ToOverride =
reinterpret_cast<Node*
>(&m_NilNode);
531 if (root != &m_NilNode)
534 Node* up[STACK_SIZE];
540 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
543 if (it == &m_NilNode)
546 plInt32 newdir = (plInt32)(m_Comparer.Less(it->m_Key, key));
548 if (newdir == (plInt32)(m_Comparer.Less(key, it->m_Key)))
553 it = it->m_pLink[dir];
558 if ((it->m_pLink[0] == &m_NilNode) || (it->m_pLink[1] == &m_NilNode))
560 plInt32 dir2 = it->m_pLink[0] == &m_NilNode;
564 PL_ASSERT_DEBUG(top >= 1 && top < STACK_SIZE,
"Implementation error");
565 up[top - 1]->m_pLink[dir] = it->m_pLink[dir2];
566 up[top - 1]->m_pLink[dir]->m_pParent = up[top - 1];
569 root = it->m_pLink[1];
573 Node* heir = it->m_pLink[1];
576 while (heir->m_pLink[0] != &m_NilNode)
578 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
579 up[top++] = prev = heir;
581 heir = heir->m_pLink[0];
587 prev->m_pLink[prev == it] = heir->m_pLink[1];
588 prev->m_pLink[prev == it]->m_pParent = prev;
595 PL_ASSERT_DEBUG(top >= 1 && top < STACK_SIZE,
"Implementation error");
596 dir = up[top - 1]->m_pLink[1] == up[top];
599 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
601 if ((up[top]->m_pLink[0]->m_uiLevel < up[top]->m_uiLevel - 1) || (up[top]->m_pLink[1]->m_uiLevel < up[top]->m_uiLevel - 1))
603 if (up[top]->m_pLink[1]->m_uiLevel > --up[top]->m_uiLevel)
604 up[top]->m_pLink[1]->m_uiLevel = up[top]->m_uiLevel;
606 up[top] = SkewNode(up[top]);
607 up[top]->m_pLink[1] = SkewNode(up[top]->m_pLink[1]);
608 up[top]->m_pLink[1]->m_pParent = up[top];
610 up[top]->m_pLink[1]->m_pLink[1] = SkewNode(up[top]->m_pLink[1]->m_pLink[1]);
611 up[top] = SplitNode(up[top]);
612 up[top]->m_pLink[1] = SplitNode(up[top]->m_pLink[1]);
613 up[top]->m_pLink[1]->m_pParent = up[top];
618 PL_ASSERT_DEBUG(top >= 1 && top < STACK_SIZE,
"Implementation error");
620 up[top - 1]->m_pLink[dir] = up[top];
621 up[top - 1]->m_pLink[dir]->m_pParent = up[top - 1];
625 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
631 root->m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
635 if (ToErase != &m_NilNode)
637 Node* parent = ToOverride->m_pParent;
639 if (parent != &m_NilNode)
641 if (parent->m_pLink[0] == ToOverride)
643 parent->m_pLink[0] = ToErase;
644 parent->m_pLink[0]->m_pParent = parent;
646 if (parent->m_pLink[1] == ToOverride)
648 parent->m_pLink[1] = ToErase;
649 parent->m_pLink[1]->m_pParent = parent;
655 ToErase->m_uiLevel = ToOverride->m_uiLevel;
656 ToErase->m_pLink[0] = ToOverride->m_pLink[0];
657 ToErase->m_pLink[0]->m_pParent = ToErase;
658 ToErase->m_pLink[1] = ToOverride->m_pLink[1];
659 ToErase->m_pLink[1]->m_pParent = ToErase;
663 if (ToOverride != &m_NilNode)
666 ReleaseNode(ToOverride);
672template <
typename KeyType,
typename Comparer>
675 PL_ASSERT_DEBUG(pos.m_pElement !=
nullptr,
"The Iterator(pos) is invalid.");
683template <
typename KeyType,
typename Comparer>
689 auto itLhs = GetIterator();
692 while (itLhs.IsValid())
694 if (!m_Comparer.Equal(itLhs.Key(), itRhs.Key()))
706template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
708 :
plSetBase<KeyType, Comparer>(Comparer(), AllocatorWrapper::GetAllocator())
712template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
714 :
plSetBase<KeyType, Comparer>(Comparer(), pAllocator)
718template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
720 :
plSetBase<KeyType, Comparer>(comparer, pAllocator)
724template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
726 :
plSetBase<KeyType, Comparer>(other, AllocatorWrapper::GetAllocator())
730template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
732 :
plSetBase<KeyType, Comparer>(other, AllocatorWrapper::GetAllocator())
736template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
742template <
typename KeyType,
typename Comparer,
typename AllocatorWrapper>
748template <
typename KeyType,
typename Comparer>
751 SwapNilNode(this->m_pRoot, &this->m_NilNode, &other.m_NilNode);
752 SwapNilNode(other.m_pRoot, &other.m_NilNode, &this->m_NilNode);
756 plMath::Swap(this->m_pFreeElementStack, other.m_pFreeElementStack);
760 this->m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&this->m_NilNode);
761 other.m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&other.m_NilNode);
764 m_Elements.Swap(other.m_Elements);