diff options
author | Mattes D <github@xoft.cz> | 2019-12-01 14:41:46 +0100 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2019-12-28 22:43:35 +0100 |
commit | 2de6b7537d37dff82afe5563704949e9d4131a52 (patch) | |
tree | e82888542a559315dc59dacee61c09e6f7946c8e /src/BlockTypePalette.h | |
parent | Update submodules (#4439) (diff) | |
download | cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.tar cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.tar.gz cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.tar.bz2 cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.tar.lz cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.tar.xz cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.tar.zst cuberite-2de6b7537d37dff82afe5563704949e9d4131a52.zip |
Diffstat (limited to 'src/BlockTypePalette.h')
-rw-r--r-- | src/BlockTypePalette.h | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/src/BlockTypePalette.h b/src/BlockTypePalette.h index 47318f171..adb156ff1 100644 --- a/src/BlockTypePalette.h +++ b/src/BlockTypePalette.h @@ -1,5 +1,6 @@ #pragma once +#include <unordered_map> #include <utility> #include "BlockState.h" @@ -7,13 +8,33 @@ -/** Holds a palette that maps block type + state into numbers. -Used primarily by PalettedBlockArea to translate between numeric and stringular block representation. -The object itself provides no thread safety, users of this class need to handle locking, if required. */ +/** Holds a palette that maps between block type + state and numbers. +Used primarily by PalettedBlockArea to map from stringular block representation to numeric, +and by protocols to map from stringular block representation to protocol-numeric. +The object itself provides no thread safety, users of this class need to handle locking, if required. +Note that the palette itself doesn't support erasing; +to erase, create a new instance and re-add only the wanted items. + +Internally, the object uses two synced maps, one for each translation direction. */ class BlockTypePalette { public: + /** Exception that is thrown if requiesting an index not present in the palette. */ + class NoSuchIndexException: + public std::runtime_error + { + using Super = std::runtime_error; + + public: + NoSuchIndexException(UInt32 aIndex): + Super(Printf("No such palette index: %u", aIndex)) + { + } + }; + + + /** Create a new empty instance. */ BlockTypePalette(); @@ -29,16 +50,31 @@ public: UInt32 count() const; /** Returns the blockspec represented by the specified palette index. - The index must be valid (ASSERTed). */ + If the index is not valid, throws a NoSuchIndexException. */ const std::pair<AString, BlockState> & entry(UInt32 aIndex) const; - /** Adds missing entries from aOther to this, and returns an index-transform map from aOther to this. + /** Returns an index-transform map from aFrom to this (this.entry(idx) == aFrom.entry(res[idx])). + Entries from aFrom that are not present in this are added. Used when pasting two areas, to transform the src palette to dst palette. */ - std::map<UInt32, UInt32> createTransformMap(const BlockTypePalette & aOther); + std::map<UInt32, UInt32> createTransformMapAddMissing(const BlockTypePalette & aFrom); + + /** Returns an index-transform map from aFrom to this (this.entry(idx) == aFrom.entry(res[idx])). + Entries from aFrom that are not present in this are assigned the fallback index. + Used for protocol block type mapping. */ + std::map<UInt32, UInt32> createTransformMapWithFallback(const BlockTypePalette & aFrom, UInt32 aFallbackIndex) const; protected: - /** The palette. Each item in the vector represents a single entry in the palette, the vector index is the palette index. */ - std::vector<std::pair<AString, BlockState>> mPalette; + /** The mapping from numeric to stringular representation. + mNumberToBlock[index] = {"blockTypeName", blockState}. */ + std::map<UInt32, std::pair<AString, BlockState>> mNumberToBlock; + + /** The mapping from stringular to numeric representation. + mStringToNumber["blockTypeName"][blockState] = index. */ + std::unordered_map<AString, std::map<BlockState, UInt32>> mBlockToNumber; + + /** The maximum index ever used in the maps. + Used when adding new entries through the index() call. */ + UInt32 mMaxIndex; }; |