// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once #include "btreenode.h" #include "btreenodeallocator.h" #include "btreerootbase.h" #include "btreeaggregator.h" #include "noaggrcalc.h" #include "minmaxaggrcalc.h" #include "btreeiterator.h" namespace vespalib::btree { template class BTreeRemoverBase { public: using NodeAllocatorType = BTreeNodeAllocator; using Aggregator = BTreeAggregator; using InternalNodeType = BTreeInternalNode; using LeafNodeType = BTreeLeafNode; using InternalNodeTypeRefPair = typename InternalNodeType::RefPair; using LeafNodeTypeRefPair = typename LeafNodeType::RefPair; template static void steal(InternalNodeType *pNode, BTreeNode::Ref sNodeRef, NodeType *sNode, uint32_t idx, NodeAllocatorType &allocator, const AggrCalcT &aggrCalc, Iterator &itr, uint32_t level); }; template , typename TraitsT = BTreeDefaultTraits, class AggrCalcT = NoAggrCalc> class BTreeRemover : public BTreeRemoverBase { public: using ParentType = BTreeRemoverBase; using NodeAllocatorType = BTreeNodeAllocator; using Aggregator = BTreeAggregator; using InternalNodeType = BTreeInternalNode; using LeafNodeType = BTreeLeafNode; using KeyType = KeyT; using DataType = DataT; using InternalNodeTypeRefPair = typename InternalNodeType::RefPair; using LeafNodeTypeRefPair = typename LeafNodeType::RefPair; using Iterator = BTreeIterator; static void remove(BTreeNode::Ref &root, Iterator &itr, const AggrCalcT &aggrCalc); }; extern template class BTreeRemover; extern template class BTreeRemover; extern template class BTreeRemover, BTreeDefaultTraits, MinMaxAggrCalc>; }