Merge all RAM string adapters

This commit is contained in:
Benoit Blanchon
2024-11-12 14:48:25 +01:00
parent de59dce527
commit bee1095042
4 changed files with 40 additions and 90 deletions

View File

@ -34,7 +34,7 @@ class FlashString {
return size_; return size_;
} }
friend bool stringEquals(FlashString a, SizedRamString b) { friend bool stringEquals(FlashString a, RamString b) {
ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey);
ARDUINOJSON_ASSERT(!a.isNull()); ARDUINOJSON_ASSERT(!a.isNull());
ARDUINOJSON_ASSERT(!b.isNull()); ARDUINOJSON_ASSERT(!b.isNull());
@ -43,7 +43,7 @@ class FlashString {
return ::memcmp_P(b.data(), a.str_, a.size_) == 0; return ::memcmp_P(b.data(), a.str_, a.size_) == 0;
} }
friend int stringCompare(FlashString a, SizedRamString b) { friend int stringCompare(FlashString a, RamString b) {
ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey);
ARDUINOJSON_ASSERT(!a.isNull()); ARDUINOJSON_ASSERT(!a.isNull());
ARDUINOJSON_ASSERT(!b.isNull()); ARDUINOJSON_ASSERT(!b.isNull());

View File

@ -10,25 +10,12 @@
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
class JsonStringAdapter : public SizedRamString {
public:
JsonStringAdapter(const JsonString& s)
: SizedRamString(s.c_str(), s.size()), linked_(s.isLinked()) {}
bool isLinked() const {
return linked_;
}
private:
bool linked_;
};
template <> template <>
struct StringAdapter<JsonString> { struct StringAdapter<JsonString> {
using AdaptedString = JsonStringAdapter; using AdaptedString = RamString;
static AdaptedString adapt(const JsonString& s) { static AdaptedString adapt(const JsonString& s) {
return AdaptedString(s); return AdaptedString(s.c_str(), s.size(), s.isLinked());
} }
}; };

View File

@ -17,79 +17,12 @@ template <typename T>
struct IsChar struct IsChar
: integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {}; : integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
class ZeroTerminatedRamString { class RamString {
public:
static const size_t typeSortKey = 3;
ZeroTerminatedRamString(const char* str) : str_(str) {}
bool isNull() const {
return !str_;
}
FORCE_INLINE size_t size() const {
return str_ ? ::strlen(str_) : 0;
}
char operator[](size_t i) const {
ARDUINOJSON_ASSERT(str_ != 0);
ARDUINOJSON_ASSERT(i <= size());
return str_[i];
}
const char* data() const {
return str_;
}
bool isLinked() const {
return false;
}
protected:
const char* str_;
};
template <typename TChar>
struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
using AdaptedString = ZeroTerminatedRamString;
static AdaptedString adapt(const TChar* p) {
return AdaptedString(reinterpret_cast<const char*>(p));
}
};
template <typename TChar, size_t N>
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
using AdaptedString = ZeroTerminatedRamString;
static AdaptedString adapt(const TChar* p) {
return AdaptedString(reinterpret_cast<const char*>(p));
}
};
class StaticStringAdapter : public ZeroTerminatedRamString {
public:
StaticStringAdapter(const char* str) : ZeroTerminatedRamString(str) {}
bool isLinked() const {
return true;
}
};
template <>
struct StringAdapter<const char*, void> {
using AdaptedString = StaticStringAdapter;
static AdaptedString adapt(const char* p) {
return AdaptedString(p);
}
};
class SizedRamString {
public: public:
static const size_t typeSortKey = 2; static const size_t typeSortKey = 2;
SizedRamString(const char* str, size_t sz) : str_(str), size_(sz) {} RamString(const char* str, size_t sz, bool linked = false)
: str_(str), size_(sz), linked_(linked) {}
bool isNull() const { bool isNull() const {
return !str_; return !str_;
@ -110,17 +43,47 @@ class SizedRamString {
} }
bool isLinked() const { bool isLinked() const {
return false; return linked_;
} }
protected: protected:
const char* str_; const char* str_;
size_t size_; size_t size_;
bool linked_; // TODO: merge with size_
};
template <typename TChar>
struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
using AdaptedString = RamString;
static AdaptedString adapt(const TChar* p) {
auto str = reinterpret_cast<const char*>(p);
return AdaptedString(str, str ? ::strlen(str) : 0);
}
};
template <typename TChar, size_t N>
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
using AdaptedString = RamString;
static AdaptedString adapt(const TChar* p) {
auto str = reinterpret_cast<const char*>(p);
return AdaptedString(str, str ? ::strlen(str) : 0);
}
};
template <>
struct StringAdapter<const char*, void> {
using AdaptedString = RamString;
static AdaptedString adapt(const char* p) {
return AdaptedString(p, p ? ::strlen(p) : 0, true);
}
}; };
template <typename TChar> template <typename TChar>
struct SizedStringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> { struct SizedStringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
using AdaptedString = SizedRamString; using AdaptedString = RamString;
static AdaptedString adapt(const TChar* p, size_t n) { static AdaptedString adapt(const TChar* p, size_t n) {
return AdaptedString(reinterpret_cast<const char*>(p), n); return AdaptedString(reinterpret_cast<const char*>(p), n);

View File

@ -15,7 +15,7 @@ struct StringAdapter<
T, T,
enable_if_t<(string_traits<T>::has_cstr || string_traits<T>::has_data) && enable_if_t<(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
(string_traits<T>::has_length || string_traits<T>::has_size)>> { (string_traits<T>::has_length || string_traits<T>::has_size)>> {
using AdaptedString = SizedRamString; using AdaptedString = RamString;
static AdaptedString adapt(const T& s) { static AdaptedString adapt(const T& s) {
return AdaptedString(get_data(s), get_size(s)); return AdaptedString(get_data(s), get_size(s));