From b5d67582955be0b30a55e1ad50271ff172c42fdc Mon Sep 17 00:00:00 2001 From: Vladimir Olteanu Date: Fri, 6 Aug 2021 22:31:37 +0300 Subject: [PATCH] Introduce AutofillArray --- Source/misdat.cpp | 58 +++++------------------------------ Source/misdat.h | 31 +++++-------------- Source/utils/autofill_array.h | 29 ++++++++++++++++++ 3 files changed, 45 insertions(+), 73 deletions(-) create mode 100644 Source/utils/autofill_array.h diff --git a/Source/misdat.cpp b/Source/misdat.cpp index 9863fa5d5..aa7cbd431 100644 --- a/Source/misdat.cpp +++ b/Source/misdat.cpp @@ -194,8 +194,8 @@ MisFileData MissileSpriteData[] = { }; MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - std::array animDelay, std::array animLen, - std::array animWidth, std::array animWidth2) + AutofillArray animDelay, AutofillArray animLen, + AutofillArray animWidth, AutofillArray animWidth2) : name(name) , animName(animName) , animFAmt(animFAmt) @@ -209,55 +209,13 @@ MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, u pinnedMem.reserve(1); else pinnedMem.reserve(animFAmt); -} - -namespace { - -template -constexpr std::array duplicate(T value, unsigned count) -{ - std::array ret = {}; - for (unsigned i = 0; i < count; i++) - ret[i] = value; - return ret; -} - -} //namespace -MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - uint8_t animDelay, uint8_t animLen, - int16_t animWidth, int16_t animWidth2) - : MisFileData(name, animName, animFAmt, flags, - duplicate(animDelay, animFAmt), duplicate(animLen, animFAmt), - duplicate(animWidth, animFAmt), duplicate(animWidth2, animFAmt)) -{ -} - -MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - uint8_t animDelay, std::array animLen, - int16_t animWidth, int16_t animWidth2) - : MisFileData(name, animName, animFAmt, flags, - duplicate(animDelay, animFAmt), animLen, - duplicate(animWidth, animFAmt), duplicate(animWidth2, animFAmt)) -{ -} - -MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - std::array animDelay, uint8_t animLen, - int16_t animWidth, int16_t animWidth2) - : MisFileData(name, animName, animFAmt, flags, - animDelay, duplicate(animLen, animFAmt), - duplicate(animWidth, animFAmt), duplicate(animWidth2, animFAmt)) -{ -} - -MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - uint8_t animDelay, std::array animLen, - std::array animWidth, std::array animWidth2) - : MisFileData(name, animName, animFAmt, flags, - duplicate(animDelay, animFAmt), animLen, - animWidth, animWidth2) -{ + for (int i = animFAmt; i < 16; i++) { + animDelay[i] = 0; + animLen[i] = 0; + animWidth = 0; + animWidth2 = 0; + } } void MisFileData::LoadGFX() diff --git a/Source/misdat.h b/Source/misdat.h index ebf0d99c9..1fa00f629 100644 --- a/Source/misdat.h +++ b/Source/misdat.h @@ -10,6 +10,7 @@ #include "engine.h" #include "effects.h" +#include "utils/autofill_array.h" #include "utils/stdcompat/cstddef.hpp" namespace devilution { @@ -127,11 +128,11 @@ struct MisFileData { uint8_t animName; uint8_t animFAmt; uint32_t flags; - std::array animData = {}; - std::array animDelay = {}; - std::array animLen = {}; - std::array animWidth = {}; - std::array animWidth2 = {}; + AutofillArray animData = {}; + AutofillArray animDelay = {}; + AutofillArray animLen = {}; + AutofillArray animWidth = {}; + AutofillArray animWidth2 = {}; private: std::vector> pinnedMem; @@ -146,24 +147,8 @@ public: } MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - std::array animDelay, std::array animLen, - std::array animWidth, std::array animWidth2); - - MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - uint8_t animDelay, uint8_t animLen, - int16_t animWidth, int16_t animWidth2); - - MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - uint8_t animDelay, std::array animLen, - int16_t animWidth, int16_t animWidth2); - - MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - std::array animDelay, uint8_t animLen, - int16_t animWidth, int16_t animWidth2); - - MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, - uint8_t animDelay, std::array animLen, - std::array animWidth, std::array animWidth2); + AutofillArray animDelay, AutofillArray animLen, + AutofillArray animWidth, AutofillArray animWidth2); void LoadGFX(); diff --git a/Source/utils/autofill_array.h b/Source/utils/autofill_array.h new file mode 100644 index 000000000..4dc55aa2e --- /dev/null +++ b/Source/utils/autofill_array.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace devilution { + +template +struct AutofillArray: public std::array +{ + using std::array::array; + + explicit AutofillArray(T x) + { + std::array::fill(x); + } + + AutofillArray() + : AutofillArray(0) + { + } + + template + AutofillArray(const T &x, const Xs &... xs) + : std::array({ x, static_cast(xs)... }) + { + } +}; + +} //namespace devilution