diff --git a/src/ArduinoJson/Strings/Adapters/RamString.hpp b/src/ArduinoJson/Strings/Adapters/RamString.hpp index 950c24e8..e506d6a7 100644 --- a/src/ArduinoJson/Strings/Adapters/RamString.hpp +++ b/src/ArduinoJson/Strings/Adapters/RamString.hpp @@ -20,9 +20,16 @@ struct IsChar class RamString { public: static const size_t typeSortKey = 2; +#if ARDUINOJSON_SIZEOF_POINTER <= 2 + static constexpr size_t sizeMask = size_t(-1) >> 1; +#else + static constexpr size_t sizeMask = size_t(-1); +#endif RamString(const char* str, size_t sz, bool linked = false) - : str_(str), size_(sz), linked_(linked) {} + : str_(str), size_(sz & sizeMask), linked_(linked) { + ARDUINOJSON_ASSERT(size_ == sz); + } bool isNull() const { return !str_; @@ -48,8 +55,15 @@ class RamString { protected: const char* str_; + +#if ARDUINOJSON_SIZEOF_POINTER <= 2 + // Use a bitfield only on 8-bit microcontrollers + size_t size_ : sizeof(size_t) * 8 - 1; + bool linked_ : 1; +#else size_t size_; - bool linked_; // TODO: merge with size_ + bool linked_; +#endif }; template