348template <
typename CompatibleKeyType>
351 return Iterator(Internal_Find<CompatibleKeyType>(key));
354template <
typename KeyType,
typename ValueType,
typename Comparer>
355template <
typename CompatibleKeyType>
358 return ConstIterator(Internal_Find<CompatibleKeyType>(key));
361template <
typename KeyType,
typename ValueType,
typename Comparer>
362template <
typename CompatibleKeyType>
365 return Internal_Find(key) !=
nullptr;
368template <
typename KeyType,
typename ValueType,
typename Comparer>
369template <
typename CompatibleKeyType>
372 Node* pNode = m_pRoot;
373 Node* pNodeSmaller =
nullptr;
375 while ((
const void*)pNode != (
const void*)&m_NilNode)
377 const plInt32 dir = (plInt32)m_Comparer.Less(pNode->m_Key, key);
378 const plInt32 dir2 = (plInt32)m_Comparer.Less(key, pNode->m_Key);
384 pNodeSmaller = pNode;
386 pNode = pNode->m_pLink[dir];
392template <
typename KeyType,
typename ValueType,
typename Comparer>
393template <
typename CompatibleKeyType>
396 return Iterator(Internal_LowerBound(key));
399template <
typename KeyType,
typename ValueType,
typename Comparer>
400template <
typename CompatibleKeyType>
403 return ConstIterator(Internal_LowerBound(key));
406template <
typename KeyType,
typename ValueType,
typename Comparer>
407template <
typename CompatibleKeyType>
410 Node* pNode = m_pRoot;
411 Node* pNodeSmaller =
nullptr;
413 while ((
const void*)pNode != (
const void*)&m_NilNode)
415 const plInt32 dir = (plInt32)m_Comparer.Less(pNode->m_Key, key);
416 const plInt32 dir2 = (plInt32)m_Comparer.Less(key, pNode->m_Key);
420 ConstIterator it(pNode);
422 return it.m_pElement;
426 pNodeSmaller = pNode;
428 pNode = pNode->m_pLink[dir];
434template <
typename KeyType,
typename ValueType,
typename Comparer>
435template <
typename CompatibleKeyType>
438 return Iterator(Internal_UpperBound(key));
441template <
typename KeyType,
typename ValueType,
typename Comparer>
442template <
typename CompatibleKeyType>
445 return ConstIterator(Internal_UpperBound(key));
448template <
typename KeyType,
typename ValueType,
typename Comparer>
449template <
typename CompatibleKeyType>
452 return FindOrAdd(key).Value();
455template <
typename KeyType,
typename ValueType,
typename Comparer>
456template <
typename CompatibleKeyType>
459 Node* pNilNode =
reinterpret_cast<Node*
>(&m_NilNode);
460 Node* pInsertedNode =
nullptr;
463 Node* root = m_pRoot;
465 if (m_pRoot != pNilNode)
468 Node* up[STACK_SIZE];
475 if (m_Comparer.Equal(it->m_Key, key))
478 *out_pExisted =
true;
483 dir = m_Comparer.Less(it->m_Key, key) ? 1 : 0;
485 PL_ASSERT_DEBUG(top < STACK_SIZE,
"plMapBase's internal stack is not large enough to be able to sort {0} elements.", GetCount());
488 if (it->m_pLink[dir] == pNilNode)
491 it = it->m_pLink[dir];
494 pInsertedNode = AcquireNode(std::forward<CompatibleKeyType>(key), ValueType(), 1, it);
495 it->m_pLink[dir] = pInsertedNode;
500 dir = (up[top - 1]->m_pLink[1] == up[top]) ? 1 : 0;
502 up[top] = SkewNode(up[top]);
503 up[top] = SplitNode(up[top]);
507 up[top - 1]->m_pLink[dir] = up[top];
508 up[top - 1]->m_pLink[dir]->m_pParent = up[top - 1];
516 pInsertedNode = AcquireNode(std::forward<CompatibleKeyType>(key), ValueType(), 1, pNilNode);
517 root = pInsertedNode;
521 m_pRoot->m_pParent = pNilNode;
522 m_NilNode.m_pParent = pNilNode;
525 PL_ASSERT_DEBUG(pInsertedNode !=
nullptr,
"Implementation Error.");
528 *out_pExisted =
false;
533template <
typename KeyType,
typename ValueType,
typename Comparer>
534template <
typename CompatibleKeyType,
typename CompatibleValueType>
537 auto it = FindOrAdd(std::forward<CompatibleKeyType>(key));
538 it.Value() = std::forward<CompatibleValueType>(value);
543template <
typename KeyType,
typename ValueType,
typename Comparer>
544template <
typename CompatibleKeyType>
547 bool bRemoved =
true;
548 m_pRoot = Remove(m_pRoot, key, bRemoved);
549 m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
550 m_NilNode.m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
555template <
typename KeyType,
typename ValueType,
typename Comparer>
556template <
typename CompatibleKeyType>
561 if (m_pFreeElementStack ==
nullptr)
563 m_Elements.PushBack();
564 pNode = &m_Elements.PeekBack();
568 pNode = m_pFreeElementStack;
569 m_pFreeElementStack = m_pFreeElementStack->m_pParent;
574 pNode->m_pParent = pParent;
575 pNode->m_Key = std::forward<CompatibleKeyType>(key);
576 pNode->m_Value = std::move(value);
577 pNode->m_uiLevel = uiLevel;
578 pNode->m_pLink[0] =
reinterpret_cast<Node*
>(&m_NilNode);
579 pNode->m_pLink[1] =
reinterpret_cast<Node*
>(&m_NilNode);
586template <
typename KeyType,
typename ValueType,
typename Comparer>
589 PL_ASSERT_DEBUG(pNode !=
nullptr && pNode != &m_NilNode,
"pNode is invalid.");
594 if (pNode == &m_Elements.PeekBack())
596 m_Elements.PopBack();
598 else if (pNode == &m_Elements.PeekFront())
600 m_Elements.PopFront();
604 pNode->m_pParent = m_pFreeElementStack;
605 m_pFreeElementStack = pNode;
611template <
typename KeyType,
typename ValueType,
typename Comparer>
614 if ((root->m_pLink[0]->m_uiLevel == root->m_uiLevel) && (root->m_uiLevel != 0))
616 Node* save = root->m_pLink[0];
617 root->m_pLink[0] = save->m_pLink[1];
618 root->m_pLink[0]->m_pParent = root;
619 save->m_pLink[1] = root;
620 save->m_pLink[1]->m_pParent = save;
627template <
typename KeyType,
typename ValueType,
typename Comparer>
630 if ((root->m_pLink[1]->m_pLink[1]->m_uiLevel == root->m_uiLevel) && (root->m_uiLevel != 0))
632 Node* save = root->m_pLink[1];
633 root->m_pLink[1] = save->m_pLink[0];
634 root->m_pLink[1]->m_pParent = root;
635 save->m_pLink[0] = root;
636 save->m_pLink[0]->m_pParent = save;
644template <
typename KeyType,
typename ValueType,
typename Comparer>
645template <
typename CompatibleKeyType>
650 Node* ToErase =
reinterpret_cast<Node*
>(&m_NilNode);
651 Node* ToOverride =
reinterpret_cast<Node*
>(&m_NilNode);
653 if (root != &m_NilNode)
656 Node* up[STACK_SIZE];
662 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
665 if (it == &m_NilNode)
668 if (m_Comparer.Equal(it->m_Key, key))
671 dir = m_Comparer.Less(it->m_Key, key) ? 1 : 0;
673 it = it->m_pLink[dir];
678 if ((it->m_pLink[0] == &m_NilNode) || (it->m_pLink[1] == &m_NilNode))
680 plInt32 dir2 = it->m_pLink[0] == &m_NilNode;
684 PL_ASSERT_DEBUG(top >= 1 && top < STACK_SIZE,
"Implementation error");
685 up[top - 1]->m_pLink[dir] = it->m_pLink[dir2];
686 up[top - 1]->m_pLink[dir]->m_pParent = up[top - 1];
689 root = it->m_pLink[1];
693 Node* heir = it->m_pLink[1];
696 while (heir->m_pLink[0] != &m_NilNode)
698 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
699 up[top++] = prev = heir;
701 heir = heir->m_pLink[0];
707 prev->m_pLink[prev == it] = heir->m_pLink[1];
708 prev->m_pLink[prev == it]->m_pParent = prev;
715 PL_ASSERT_DEBUG(top >= 1 && top < STACK_SIZE,
"Implementation error");
716 dir = up[top - 1]->m_pLink[1] == up[top];
719 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
721 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))
723 if (up[top]->m_pLink[1]->m_uiLevel > --up[top]->m_uiLevel)
724 up[top]->m_pLink[1]->m_uiLevel = up[top]->m_uiLevel;
726 up[top] = SkewNode(up[top]);
727 up[top]->m_pLink[1] = SkewNode(up[top]->m_pLink[1]);
728 up[top]->m_pLink[1]->m_pParent = up[top];
730 up[top]->m_pLink[1]->m_pLink[1] = SkewNode(up[top]->m_pLink[1]->m_pLink[1]);
731 up[top] = SplitNode(up[top]);
732 up[top]->m_pLink[1] = SplitNode(up[top]->m_pLink[1]);
733 up[top]->m_pLink[1]->m_pParent = up[top];
738 PL_ASSERT_DEBUG(top >= 1 && top < STACK_SIZE,
"Implementation error");
740 up[top - 1]->m_pLink[dir] = up[top];
741 up[top - 1]->m_pLink[dir]->m_pParent = up[top - 1];
745 PL_ASSERT_DEBUG(top >= 0 && top < STACK_SIZE,
"Implementation error");
751 root->m_pParent =
reinterpret_cast<Node*
>(&m_NilNode);
755 if (ToErase != &m_NilNode)
757 Node* parent = ToOverride->m_pParent;
759 if (parent != &m_NilNode)
761 if (parent->m_pLink[0] == ToOverride)
763 parent->m_pLink[0] = ToErase;
764 parent->m_pLink[0]->m_pParent = parent;
766 if (parent->m_pLink[1] == ToOverride)
768 parent->m_pLink[1] = ToErase;
769 parent->m_pLink[1]->m_pParent = parent;
775 ToErase->m_uiLevel = ToOverride->m_uiLevel;
776 ToErase->m_pLink[0] = ToOverride->m_pLink[0];
777 ToErase->m_pLink[0]->m_pParent = ToErase;
778 ToErase->m_pLink[1] = ToOverride->m_pLink[1];
779 ToErase->m_pLink[1]->m_pParent = ToErase;
783 if (ToOverride != &m_NilNode)
786 ReleaseNode(ToOverride);
792template <
typename KeyType,
typename ValueType,
typename Comparer>
795 PL_ASSERT_DEBUG(pos.m_pElement !=
nullptr,
"The Iterator(pos) is invalid.");
803template <
typename KeyType,
typename ValueType,
typename Comparer>
809 auto itLhs = GetIterator();
812 while (itLhs.IsValid())
814 if (!m_Comparer.Equal(itLhs.Key(), itRhs.Key()))
817 if (itLhs.Value() != itRhs.Value())
830template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
832 :
plMapBase<KeyType, ValueType, Comparer>(Comparer(), AllocatorWrapper::GetAllocator())
836template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
838 :
plMapBase<KeyType, ValueType, Comparer>(Comparer(), pAllocator)
842template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
844 :
plMapBase<KeyType, ValueType, Comparer>(comparer, pAllocator)
848template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
850 :
plMapBase<KeyType, ValueType, Comparer>(other, AllocatorWrapper::GetAllocator())
854template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
856 :
plMapBase<KeyType, ValueType, Comparer>(other, AllocatorWrapper::GetAllocator())
860template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
866template <
typename KeyType,
typename ValueType,
typename Comparer,
typename AllocatorWrapper>
872template <
typename KeyType,
typename ValueType,
typename Comparer>
875 SwapNilNode(this->m_pRoot, &this->m_NilNode, &other.m_NilNode);
876 SwapNilNode(other.m_pRoot, &other.m_NilNode, &this->m_NilNode);
880 plMath::Swap(this->m_pFreeElementStack, other.m_pFreeElementStack);
884 this->m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&this->m_NilNode);
885 other.m_pRoot->m_pParent =
reinterpret_cast<Node*
>(&other.m_NilNode);
888 m_Elements.Swap(other.m_Elements);