#pragma once #include "BaseTreePoolBuilder.h" class OriginalPoolBuilder : public BaseTreePoolBuilder { public: using BaseTreePoolBuilder::BaseTreePoolBuilder; virtual ~OriginalPoolBuilder() override {} std::string GetFullFileName(const std::string& fileName) const override { return fileName + ".o.pool"; } protected: void InitBuild(const BaseTree* tree) override {} void FinishBuild(const BaseTree* tree) override {} bool WordAligned() const override { return true; } unsigned8 GetBytesPerPointer(const BaseTree* tree, const unsigned32& nodeId) const override { // All pointers are 4 bytes return 4; } std::vector WrapPointer(const BaseTree* root, const unsigned32& nodeIndex, const unsigned32& indexInPool, const unsigned32& pointer) const override { return BitHelper::SplitInBytes(pointer); } size_t GetPoolInfoSize(const BaseTree* tree) const override { return 0; } std::vector GetPoolInfo(const BaseTree* tree, const std::vector& nodePointers, const std::vector& nodeOrder) override { return std::vector(); } unsigned8 GetAdditionalPoolInfoForNodeSize(const BaseTree* tree, const unsigned32& nodeIndex) const override { const Node* node = tree->GetNode(nodeIndex); unsigned8 level = node->GetLevel(); unsigned8 additionalBytes = tree->GetAdditionalBytesPerNode(level); // The original paper uses 32 bit as the atomic unit. Therefore they have 24 unused bits after each childmask. We put these in here for correctness. // However, if they are used to store, for example, color information (i.e., additionalBytes != 0), we use them for that. if (additionalBytes <= 3) return 3 - additionalBytes; else return 0; } std::vector GetAdditionalPoolInfoForNode(const BaseTree* tree, const unsigned32& nodeIndex, const unsigned32& indexInPool) const override { return std::vector(GetAdditionalPoolInfoForNodeSize(tree, nodeIndex), 0); } };