|
|
@@ -17,18 +17,19 @@ template <typename T>
|
|
|
struct IsChar
|
|
|
: integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
|
|
|
|
|
|
-class ZeroTerminatedRamString {
|
|
|
+class RamString {
|
|
|
public:
|
|
|
- static const size_t typeSortKey = 3;
|
|
|
+ static const size_t typeSortKey = 2;
|
|
|
|
|
|
- ZeroTerminatedRamString(const char* str) : str_(str) {}
|
|
|
+ RamString(const char* str, size_t sz, bool linked = false)
|
|
|
+ : str_(str), size_(sz), linked_(linked) {}
|
|
|
|
|
|
bool isNull() const {
|
|
|
return !str_;
|
|
|
}
|
|
|
|
|
|
- FORCE_INLINE size_t size() const {
|
|
|
- return str_ ? ::strlen(str_) : 0;
|
|
|
+ size_t size() const {
|
|
|
+ return size_;
|
|
|
}
|
|
|
|
|
|
char operator[](size_t i) const {
|
|
|
@@ -42,85 +43,47 @@ class ZeroTerminatedRamString {
|
|
|
}
|
|
|
|
|
|
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 = ZeroTerminatedRamString;
|
|
|
+ using AdaptedString = RamString;
|
|
|
|
|
|
static AdaptedString adapt(const TChar* p) {
|
|
|
- return AdaptedString(reinterpret_cast<const char*>(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 = ZeroTerminatedRamString;
|
|
|
+ using AdaptedString = RamString;
|
|
|
|
|
|
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;
|
|
|
+ auto str = reinterpret_cast<const char*>(p);
|
|
|
+ return AdaptedString(str, str ? ::strlen(str) : 0);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
template <>
|
|
|
struct StringAdapter<const char*, void> {
|
|
|
- using AdaptedString = StaticStringAdapter;
|
|
|
+ using AdaptedString = RamString;
|
|
|
|
|
|
static AdaptedString adapt(const char* p) {
|
|
|
- return AdaptedString(p);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-class SizedRamString {
|
|
|
- public:
|
|
|
- static const size_t typeSortKey = 2;
|
|
|
-
|
|
|
- SizedRamString(const char* str, size_t sz) : str_(str), size_(sz) {}
|
|
|
-
|
|
|
- bool isNull() const {
|
|
|
- return !str_;
|
|
|
- }
|
|
|
-
|
|
|
- size_t size() const {
|
|
|
- return size_;
|
|
|
- }
|
|
|
-
|
|
|
- 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;
|
|
|
+ return AdaptedString(p, p ? ::strlen(p) : 0, true);
|
|
|
}
|
|
|
-
|
|
|
- protected:
|
|
|
- const char* str_;
|
|
|
- size_t size_;
|
|
|
};
|
|
|
|
|
|
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);
|