#pragma once #include "BaseTreePoolBuilder.h" #include "../../core/Util/BoolArray.h" class AdaptivePointerPoolBuilder : public BaseTreePoolBuilder { public: AdaptivePointerPoolBuilder(bool useLookupTable, unsigned8 maskSize, unsigned8 size1 = 1, unsigned8 size2 = 2, unsigned8 size3 = 3) : BaseTreePoolBuilder(), mMaskSize(maskSize), mMaskBits(std::vector{size1, size2, size3}), mUseLookupTable(useLookupTable) { assert(maskSize == 1 || maskSize == 2); assert(size1 <= 4 && size2 <= 4 && size3 <= 4); } virtual ~AdaptivePointerPoolBuilder() override {} std::string GetFullFileName(const std::string& fileName) const override; protected: void InitBuild(const BaseTree* tree) override; void FinishBuild(const BaseTree* tree) override; bool WordAligned() const override { return false; } unsigned8 GetBytesPerPointer(const BaseTree* tree, const unsigned32& nodeIndex) const override; std::vector WrapPointer(const BaseTree* tree, const unsigned32& nodeIndex, const unsigned32& indexInPool, const unsigned32& pointer) const override; size_t GetPoolInfoSize(const BaseTree* tree) const override; std::vector GetPoolInfo(const BaseTree* tree, const std::vector& nodePointers, const std::vector& nodeOrder) override; size_t GetAdditionalPoolInfoSize(const BaseTree* tree) const override; std::vector GetAdditionalPoolInfo(const BaseTree* tree, const std::vector& nodePointers, const std::vector& nodeOrder) override; void OrderNodes(const BaseTree* tree, std::vector& nodeOrder) const override; static void OrderNodes(const BaseTree* tree, std::vector& nodeOrder, const std::vector& parentCounts); void ClearVariables(); size_t GetMaxLookupTableSize() const; unsigned8 GetMinimumSizeOfPointer(const unsigned32& index) const; // Calculates in which "section" this pointer is. Wraps to pointer to a pointer within that sections and returns the mask. unsigned32 GetShortenedPointerTo(const unsigned32& pointer, unsigned8& mask) const; void CalculateEverything(const BaseTree* tree, std::vector& pointerSizes, std::vector& pointerSizesPerLevel, std::vector& levelOffsets, std::vector& parentCounts, std::vector>& lookupTableNodesPerLevel, BoolArray& nodeWithinLookupTable) const; // Size of the mask used to indicate the size of pointers const unsigned8 mMaskSize; // Indicates how many bits each index of the mask indicates. Standard is "1, 2, 3", but // one could image stuff such as "1, 1, 2", when 00 indicates the first 64 nodes, 01 the second 64 nodes, and 10 the next 16K nodes. const std::vector mMaskBits; const bool mUseLookupTable; // Variables used during the current build // Pointer sizes for each individual node within the tree std::vector mPointerSizes; // Pointer sizes for direct (byte precision) pointers per level std::vector mPointerSizePerLevel; // Level offsets as the index of the first node in each level std::vector mNodeLevelOffsets; std::vector mPointerLevelOffsets; //std::vector mLevelOffsets; std::vector mParentCounts; std::vector> mLookupTableNodesPerLevel; BoolArray mNodeWithinLookupTable; bool mBuildInitiated = false; };