diff options
author | Neil <nyamatongwe@gmail.com> | 2024-02-28 15:24:13 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2024-02-28 15:24:13 +1100 |
commit | d09724bee7cc77bb6c8b327a6f2004cebe5ec9ba (patch) | |
tree | 9ac7d1f0f59c222df7c6841d0f0909afd16ffae7 | |
parent | ce9ec5366ab200193140bbd060b948f62a10286b (diff) | |
download | scintilla-mirror-d09724bee7cc77bb6c8b327a6f2004cebe5ec9ba.tar.gz |
Fix failures with values larger than 0xffffff in 32-bit builds.
-rw-r--r-- | src/UndoHistory.cxx | 48 | ||||
-rw-r--r-- | src/UndoHistory.h | 8 |
2 files changed, 28 insertions, 28 deletions
diff --git a/src/UndoHistory.cxx b/src/UndoHistory.cxx index c71551e60..0c8644f16 100644 --- a/src/UndoHistory.cxx +++ b/src/UndoHistory.cxx @@ -62,52 +62,48 @@ void WriteValue(uint8_t *bytes, size_t length, size_t value) noexcept { } size_t ScaledVector::Size() const noexcept { - return bytes.size() / elementSize; + return bytes.size() / element.size; } size_t ScaledVector::ValueAt(size_t index) const noexcept { - return ReadValue(bytes.data() + index * elementSize, elementSize); + return ReadValue(bytes.data() + index * element.size, element.size); } intptr_t ScaledVector::SignedValueAt(size_t index) const noexcept { - return ReadValue(bytes.data() + index * elementSize, elementSize); + return ReadValue(bytes.data() + index * element.size, element.size); } -constexpr size_t MaxForBytes(size_t length) noexcept { - constexpr size_t one = 1; - return (one << (byteBits * length)) - 1; -} - -constexpr size_t SizeForValue(size_t value) noexcept { +constexpr SizeMax ElementForValue(size_t value) noexcept { + size_t maxN = byteMask; for (size_t i = 1; i < maxElementSize; i++) { - if (value <= MaxForBytes(i)) { - return i; + if (value <= maxN) { + return { i, maxN }; } + maxN = (maxN << byteBits) + byteMask; } - return 1; + return { 1, byteMask }; } void ScaledVector::SetValueAt(size_t index, size_t value) { // Check if value fits, if not then expand - if (value > elementMax) { - const size_t elementSizeNew = SizeForValue(value); - const size_t length = bytes.size() / elementSize; - std::vector<uint8_t> bytesNew(elementSizeNew * length); + if (value > element.maxValue) { + const SizeMax elementForValue = ElementForValue(value); + const size_t length = bytes.size() / element.size; + std::vector<uint8_t> bytesNew(elementForValue.size * length); for (size_t i = 0; i < length; i++) { - const uint8_t *source = bytes.data() + i * elementSize; - uint8_t *destination = bytesNew.data() + (i+1) * elementSizeNew - elementSize; - memcpy(destination, source, elementSize); + const uint8_t *source = bytes.data() + i * element.size; + uint8_t *destination = bytesNew.data() + (i+1) * elementForValue.size - element.size; + memcpy(destination, source, element.size); } std::swap(bytes, bytesNew); - elementSize = elementSizeNew; - elementMax = MaxForBytes(elementSize); + element = elementForValue; } - WriteValue(bytes.data() + index * elementSize, elementSize, value); + WriteValue(bytes.data() + index * element.size, element.size, value); } void ScaledVector::ClearValueAt(size_t index) noexcept { // 0 fits in any size element so no expansion needed so no exceptions - WriteValue(bytes.data() + index * elementSize, elementSize, 0); + WriteValue(bytes.data() + index * element.size, element.size, 0); } void ScaledVector::Clear() noexcept { @@ -115,12 +111,12 @@ void ScaledVector::Clear() noexcept { } void ScaledVector::Truncate(size_t length) noexcept { - VectorTruncate(bytes, length * elementSize); - assert(bytes.size() == length * elementSize); + VectorTruncate(bytes, length * element.size); + assert(bytes.size() == length * element.size); } void ScaledVector::ReSize(size_t length) { - bytes.resize(length * elementSize); + bytes.resize(length * element.size); } void ScaledVector::PushBack() { diff --git a/src/UndoHistory.h b/src/UndoHistory.h index 90b2860a7..8de636f8d 100644 --- a/src/UndoHistory.h +++ b/src/UndoHistory.h @@ -15,9 +15,13 @@ namespace Scintilla::Internal { // only use 2 bytes or even 1 byte for each length. // This saves much memory often reducing by 50% for 32-bit builds and 75% for 64-bit builds. +struct SizeMax { + size_t size = 1; + size_t maxValue = UINT8_MAX; +}; + class ScaledVector { - size_t elementSize = 1; - size_t elementMax = 255; + SizeMax element; std::vector<uint8_t> bytes; public: [[nodiscard]] size_t Size() const noexcept; |