forked from bblanchon/ArduinoJson
Merge all RAM string adapters
This commit is contained in:
@ -34,7 +34,7 @@ class FlashString {
|
||||
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.isNull());
|
||||
ARDUINOJSON_ASSERT(!b.isNull());
|
||||
@ -43,7 +43,7 @@ class FlashString {
|
||||
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.isNull());
|
||||
ARDUINOJSON_ASSERT(!b.isNull());
|
||||
|
@ -10,25 +10,12 @@
|
||||
|
||||
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 <>
|
||||
struct StringAdapter<JsonString> {
|
||||
using AdaptedString = JsonStringAdapter;
|
||||
using AdaptedString = RamString;
|
||||
|
||||
static AdaptedString adapt(const JsonString& s) {
|
||||
return AdaptedString(s);
|
||||
return AdaptedString(s.c_str(), s.size(), s.isLinked());
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -17,79 +17,12 @@ template <typename T>
|
||||
struct IsChar
|
||||
: integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
|
||||
|
||||
class ZeroTerminatedRamString {
|
||||
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 {
|
||||
class RamString {
|
||||
public:
|
||||
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 {
|
||||
return !str_;
|
||||
@ -110,17 +43,47 @@ class SizedRamString {
|
||||
}
|
||||
|
||||
bool isLinked() const {
|
||||
return false;
|
||||
return linked_;
|
||||
}
|
||||
|
||||
protected:
|
||||
const char* str_;
|
||||
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>
|
||||
struct SizedStringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
|
||||
using AdaptedString = SizedRamString;
|
||||
using AdaptedString = RamString;
|
||||
|
||||
static AdaptedString adapt(const TChar* p, size_t n) {
|
||||
return AdaptedString(reinterpret_cast<const char*>(p), n);
|
||||
|
@ -15,7 +15,7 @@ struct StringAdapter<
|
||||
T,
|
||||
enable_if_t<(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
|
||||
(string_traits<T>::has_length || string_traits<T>::has_size)>> {
|
||||
using AdaptedString = SizedRamString;
|
||||
using AdaptedString = RamString;
|
||||
|
||||
static AdaptedString adapt(const T& s) {
|
||||
return AdaptedString(get_data(s), get_size(s));
|
||||
|
Reference in New Issue
Block a user