#pragma once #include "BaseTree.h" std::vector BaseTree::mTreePool = std::vector(); BaseTree::BaseTree() { mTreeIndex = AssignRootIndex(); } BaseTree::~BaseTree() { mTreePool[mTreeIndex] = NULL; } // Returns the number of bytes per pointer for each level as a vector std::vector BaseTree::GetAdditionalBytesPerPointer() const { std::vector res(GetMaxLevel() + 1); for (unsigned8 level = 0; level <= GetMaxLevel(); level++) res[level] = GetAdditionalBytesPerPointer(level); return res; } // Returns the number of bytes per node for each level as a vector. std::vector BaseTree::GetAdditionalBytesPerNode() const { std::vector res(GetMaxLevel() + 1); for (unsigned8 level = 0; level <= GetMaxLevel(); level++) res[level] = GetAdditionalBytesPerNode(level); return res; } unsigned16 BaseTree::AssignRootIndex() { if (!mTreePool.empty()) { // Try and find an empty spot in the RootPool: for (size_t i = 0; i < mTreePool.size(); i++) { if (mTreePool[i] == NULL) { mTreePool[i] = this; return (unsigned16)i; } if (mTreePool[i] == this) return (unsigned16)i; // Already assigned } } // If no empty spot was found, increase the size of the root mTreePool.push_back(this); assert(mTreePool.size() < BitHelper::Exp2(16)); return (unsigned16)(mTreePool.size() - 1); }