Replace CopiedString and LinkedString with JsonString

This commit is contained in:
Benoit Blanchon
2022-01-13 16:15:53 +01:00
parent 973858b835
commit 4f6244eef4
11 changed files with 26 additions and 76 deletions

View File

@ -18,7 +18,7 @@ TEST_CASE("StringCopier") {
str.append("hello"); str.append("hello");
REQUIRE(str.isValid() == true); REQUIRE(str.isValid() == true);
REQUIRE(std::string(str.str()) == "hello"); REQUIRE(str.str() == "hello");
REQUIRE(pool.overflowed() == false); REQUIRE(pool.overflowed() == false);
} }

View File

@ -231,7 +231,7 @@ class JsonDeserializer {
return false; return false;
} }
typename TStringStorage::string_type key = _stringStorage.str(); String key = _stringStorage.str();
TFilter memberFilter = filter[key.c_str()]; TFilter memberFilter = filter[key.c_str()];

View File

@ -417,7 +417,7 @@ class MsgPackDeserializer {
if (!readKey()) if (!readKey())
return false; return false;
typename TStringStorage::string_type key = _stringStorage.str(); String key = _stringStorage.str();
TFilter memberFilter = filter[key.c_str()]; TFilter memberFilter = filter[key.c_str()];
VariantData *member; VariantData *member;

View File

@ -10,8 +10,6 @@ namespace ARDUINOJSON_NAMESPACE {
class StringCopier { class StringCopier {
public: public:
typedef CopiedString string_type;
StringCopier(MemoryPool& pool) : _pool(&pool) {} StringCopier(MemoryPool& pool) : _pool(&pool) {}
void startString() { void startString() {
@ -21,10 +19,10 @@ class StringCopier {
_pool->markAsOverflowed(); _pool->markAsOverflowed();
} }
string_type save() { String save() {
ARDUINOJSON_ASSERT(_ptr); ARDUINOJSON_ASSERT(_ptr);
ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator
return string_type(_pool->saveStringFromFreeZone(_size), _size); return String(_pool->saveStringFromFreeZone(_size), _size, false);
} }
void append(const char* s) { void append(const char* s) {
@ -50,11 +48,11 @@ class StringCopier {
return _size; return _size;
} }
string_type str() const { String str() const {
ARDUINOJSON_ASSERT(_ptr); ARDUINOJSON_ASSERT(_ptr);
ARDUINOJSON_ASSERT(_size < _capacity); ARDUINOJSON_ASSERT(_size < _capacity);
_ptr[_size] = 0; _ptr[_size] = 0;
return string_type(_ptr, _size); return String(_ptr, _size, false);
} }
private: private:

View File

@ -5,23 +5,21 @@
#pragma once #pragma once
#include <ArduinoJson/Namespace.hpp> #include <ArduinoJson/Namespace.hpp>
#include <ArduinoJson/Strings/StoredString.hpp> #include <ArduinoJson/Strings/String.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
class StringMover { class StringMover {
public: public:
typedef LinkedString string_type;
StringMover(char* ptr) : _writePtr(ptr) {} StringMover(char* ptr) : _writePtr(ptr) {}
void startString() { void startString() {
_startPtr = _writePtr; _startPtr = _writePtr;
} }
FORCE_INLINE string_type save() { FORCE_INLINE String save() {
_writePtr[0] = 0; // terminator _writePtr[0] = 0; // terminator
string_type s = str(); String s = str();
_writePtr++; _writePtr++;
return s; return s;
} }
@ -34,8 +32,8 @@ class StringMover {
return true; return true;
} }
string_type str() const { String str() const {
return string_type(_startPtr, size()); return String(_startPtr, size(), true);
} }
size_t size() const { size_t size() const {

View File

@ -5,7 +5,6 @@
#pragma once #pragma once
#include <ArduinoJson/Memory/MemoryPool.hpp> #include <ArduinoJson/Memory/MemoryPool.hpp>
#include <ArduinoJson/Strings/StoredString.hpp>
#include <ArduinoJson/Strings/String.hpp> #include <ArduinoJson/Strings/String.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
@ -13,15 +12,13 @@ namespace ARDUINOJSON_NAMESPACE {
struct LinkStringStoragePolicy { struct LinkStringStoragePolicy {
template <typename TAdaptedString, typename TCallback> template <typename TAdaptedString, typename TCallback>
bool store(TAdaptedString str, MemoryPool *, TCallback callback) { bool store(TAdaptedString str, MemoryPool *, TCallback callback) {
LinkedString storedString(str.data(), str.size()); String storedString(str.data(), str.size(), true);
callback(storedString); callback(storedString);
return !str.isNull(); return !str.isNull();
} }
}; };
struct CopyStringStoragePolicy { struct CopyStringStoragePolicy {
typedef CopiedString TResult;
template <typename TAdaptedString, typename TCallback> template <typename TAdaptedString, typename TCallback>
bool store(TAdaptedString str, MemoryPool *pool, TCallback callback); bool store(TAdaptedString str, MemoryPool *pool, TCallback callback);
}; };

View File

@ -1,35 +0,0 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2022, Benoit BLANCHON
// MIT License
#pragma once
namespace ARDUINOJSON_NAMESPACE {
template <bool linked>
class StoredString {
public:
StoredString() : _data(0), _size(0) {}
StoredString(const char* p, size_t n) : _data(p), _size(n) {}
operator const char*() const {
return _data;
}
const char* c_str() const {
return _data;
}
size_t size() const {
return _size;
}
private:
const char* _data;
size_t _size;
};
typedef StoredString<true> LinkedString;
typedef StoredString<false> CopiedString;
} // namespace ARDUINOJSON_NAMESPACE

View File

@ -206,9 +206,9 @@ class MemoryPoolPrint : public Print {
pool->getFreeZone(&_string, &_capacity); pool->getFreeZone(&_string, &_capacity);
} }
CopiedString str() { String str() {
ARDUINOJSON_ASSERT(_size < _capacity); ARDUINOJSON_ASSERT(_size < _capacity);
return CopiedString(_pool->saveStringFromFreeZone(_size), _size); return String(_pool->saveStringFromFreeZone(_size), _size, false);
} }
size_t write(uint8_t c) { size_t write(uint8_t c) {

View File

@ -208,16 +208,12 @@ class VariantData {
setType(VALUE_IS_NULL); setType(VALUE_IS_NULL);
} }
void setString(CopiedString s) { void setString(String s) {
ARDUINOJSON_ASSERT(s); ARDUINOJSON_ASSERT(s);
setType(VALUE_IS_OWNED_STRING); if (s.isStatic())
_content.asString.data = s.c_str(); setType(VALUE_IS_LINKED_STRING);
_content.asString.size = s.size(); else
} setType(VALUE_IS_OWNED_STRING);
void setString(LinkedString s) {
ARDUINOJSON_ASSERT(s);
setType(VALUE_IS_LINKED_STRING);
_content.asString.data = s.c_str(); _content.asString.data = s.c_str();
_content.asString.size = s.size(); _content.asString.size = s.size();
} }

View File

@ -174,7 +174,7 @@ template <typename TAdaptedString, typename TCallback>
bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool, bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool,
TCallback callback) { TCallback callback) {
const char *copy = pool->saveString(str); const char *copy = pool->saveString(str);
CopiedString storedString(copy, str.size()); String storedString(copy, str.size(), false);
callback(storedString); callback(storedString);
return copy != 0; return copy != 0;
} }

View File

@ -7,7 +7,6 @@
#include <ArduinoJson/Polyfills/integer.hpp> #include <ArduinoJson/Polyfills/integer.hpp>
#include <ArduinoJson/Polyfills/limits.hpp> #include <ArduinoJson/Polyfills/limits.hpp>
#include <ArduinoJson/Polyfills/type_traits.hpp> #include <ArduinoJson/Polyfills/type_traits.hpp>
#include <ArduinoJson/Strings/StoredString.hpp>
#include <ArduinoJson/Variant/VariantContent.hpp> #include <ArduinoJson/Variant/VariantContent.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
@ -77,15 +76,12 @@ class VariantSlot {
_next = VariantSlotDiff(slot - this); _next = VariantSlotDiff(slot - this);
} }
void setKey(CopiedString k) { void setKey(String k) {
ARDUINOJSON_ASSERT(k); ARDUINOJSON_ASSERT(k);
_flags |= OWNED_KEY_BIT; if (k.isStatic())
_key = k.c_str(); _flags &= VALUE_MASK;
} else
_flags |= OWNED_KEY_BIT;
void setKey(LinkedString k) {
ARDUINOJSON_ASSERT(k);
_flags &= VALUE_MASK;
_key = k.c_str(); _key = k.c_str();
} }