summaryrefslogtreecommitdiffstats
path: root/src/BlockState.cpp
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2020-09-08 10:46:16 +0200
committerTiger Wang <ziwei.tiger@outlook.com>2020-12-21 01:11:34 +0100
commit742e27ad2f037205285e475be487ec9ed874ca91 (patch)
tree3218d3c2791e823c88a294ba7fdb10035c8fbb9b /src/BlockState.cpp
parentEnable LOS checks for Hostile Mobs. (diff)
downloadcuberite-742e27ad2f037205285e475be487ec9ed874ca91.tar
cuberite-742e27ad2f037205285e475be487ec9ed874ca91.tar.gz
cuberite-742e27ad2f037205285e475be487ec9ed874ca91.tar.bz2
cuberite-742e27ad2f037205285e475be487ec9ed874ca91.tar.lz
cuberite-742e27ad2f037205285e475be487ec9ed874ca91.tar.xz
cuberite-742e27ad2f037205285e475be487ec9ed874ca91.tar.zst
cuberite-742e27ad2f037205285e475be487ec9ed874ca91.zip
Diffstat (limited to 'src/BlockState.cpp')
-rw-r--r--src/BlockState.cpp213
1 files changed, 0 insertions, 213 deletions
diff --git a/src/BlockState.cpp b/src/BlockState.cpp
deleted file mode 100644
index 8ee87c50f..000000000
--- a/src/BlockState.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-#include "Globals.h"
-#include "BlockState.h"
-
-
-
-
-
-BlockState::BlockState():
- mChecksum(initializeChecksum())
-{
- // Nothing needed yet
-}
-
-
-
-
-
-BlockState::BlockState(const AString & aKey, const AString & aValue):
- mState({{aKey, aValue}}),
- mChecksum(initializeChecksum())
-{
-}
-
-
-
-
-
-BlockState::BlockState(std::initializer_list<std::pair<const AString, AString>> aKeysAndValues):
- mState(aKeysAndValues),
- mChecksum(initializeChecksum())
-{
-}
-
-
-
-
-
-BlockState::BlockState(const std::map<AString, AString> & aKeysAndValues):
- mState(aKeysAndValues),
- mChecksum(initializeChecksum())
-{
-}
-
-
-
-
-
-BlockState::BlockState(std::map<AString, AString> && aKeysAndValues):
- mState(std::move(aKeysAndValues)),
- mChecksum(initializeChecksum())
-{
-}
-
-
-
-
-
-BlockState::BlockState(const BlockState & aCopyFrom, std::initializer_list<std::pair<const AString, AString>> aAdditionalKeysAndValues):
- mState(aCopyFrom.mState)
-{
- for (const auto & kav: aAdditionalKeysAndValues)
- {
- mState[kav.first] = kav.second;
- }
- mChecksum = initializeChecksum();
-}
-
-
-
-
-
-BlockState::BlockState(const BlockState & aCopyFrom, const std::map<AString, AString> & aAdditionalKeysAndValues):
- mState(aCopyFrom.mState)
-{
- for (const auto & kav: aAdditionalKeysAndValues)
- {
- mState[kav.first] = kav.second;
- }
- mChecksum = initializeChecksum();
-}
-
-
-
-
-
-bool BlockState::operator <(const BlockState & aOther) const
-{
- // Fast-return this using checksum
- if (mChecksum != aOther.mChecksum)
- {
- return (mChecksum < aOther.mChecksum);
- }
-
- // Can fast-return this due to how comparison works
- if (mState.size() != aOther.mState.size())
- {
- return (mState.size() < aOther.mState.size());
- }
-
- auto itA = mState.begin();
- auto itOther = aOther.mState.begin();
-
- // don't need to check itOther, size checks above ensure size(A) == size(O)
- while (itA != mState.end())
- {
- {
- const auto cmp = itA->first.compare(itOther->first);
- if (cmp != 0)
- {
- return (cmp < 0);
- }
- }
- {
- const auto cmp = itA->second.compare(itOther->second);
- if (cmp != 0)
- {
- return (cmp < 0);
- }
- }
-
- ++itA;
- ++itOther;
- }
-
- return false;
-}
-
-
-
-
-
-bool BlockState::operator ==(const BlockState & aOther) const
-{
- // Fast-fail if the checksums differ or differrent counts:
- if ((mChecksum != aOther.mChecksum) || (mState.size() != aOther.mState.size()))
- {
- return false;
- }
-
- // Slow-check everything if the checksums match:
- return std::equal(mState.begin(), mState.end(), aOther.mState.begin());
-}
-
-
-
-
-
-const AString & BlockState::value(const AString & aKey) const
-{
- auto itr = mState.find(aKey);
- if (itr == mState.end())
- {
- static AString empty;
- return empty;
- }
- return itr->second;
-}
-
-
-
-
-
-UInt32 BlockState::initializeChecksum()
-{
- removeEmptyKeys();
-
- // Calculate the checksum as a XOR of all mState keys' and values' checksums
- // This way we don't depend on the std::map's ordering
- UInt32 res = 0;
- for (const auto & kv: mState)
- {
- auto partial = partialChecksum(kv.first) ^ partialChecksum(kv.second);
- res = res ^ partial;
- }
- return res;
-}
-
-
-
-
-
-void BlockState::removeEmptyKeys()
-{
- for (auto itr = mState.begin(); itr != mState.end();)
- {
- if (itr->second.empty())
- {
- itr = mState.erase(itr);
- }
- else
- {
- ++itr;
- }
- }
-}
-
-
-
-
-
-UInt32 BlockState::partialChecksum(const AString & aString)
-{
- UInt32 shift = 0;
- UInt32 res = 0;
- for (auto ch: aString)
- {
- UInt32 v = static_cast<UInt8>(ch);
- v = v << shift;
- shift = (shift + 1) % 24;
- res = res ^ v;
- }
- return res;
-}