@@ -17,18 +17,19 @@ template <typename T>
1717struct IsChar
1818 : integral_constant<bool , is_integral<T>::value && sizeof (T) == 1 > {};
1919
20- class ZeroTerminatedRamString {
20+ class RamString {
2121 public:
22- static const size_t typeSortKey = 3 ;
22+ static const size_t typeSortKey = 2 ;
2323
24- ZeroTerminatedRamString (const char * str) : str_(str) {}
24+ RamString (const char * str, size_t sz, bool linked = false )
25+ : str_(str), size_(sz), linked_(linked) {}
2526
2627 bool isNull () const {
2728 return !str_;
2829 }
2930
30- FORCE_INLINE size_t size () const {
31- return str_ ? :: strlen (str_) : 0 ;
31+ size_t size () const {
32+ return size_ ;
3233 }
3334
3435 char operator [](size_t i) const {
@@ -42,85 +43,47 @@ class ZeroTerminatedRamString {
4243 }
4344
4445 bool isLinked () const {
45- return false ;
46+ return linked_ ;
4647 }
4748
4849 protected:
4950 const char * str_;
51+ size_t size_;
52+ bool linked_; // TODO: merge with size_
5053};
5154
5255template <typename TChar>
5356struct StringAdapter <TChar*, enable_if_t <IsChar<TChar>::value>> {
54- using AdaptedString = ZeroTerminatedRamString ;
57+ using AdaptedString = RamString ;
5558
5659 static AdaptedString adapt (const TChar* p) {
57- return AdaptedString (reinterpret_cast <const char *>(p));
60+ auto str = reinterpret_cast <const char *>(p);
61+ return AdaptedString (str, str ? ::strlen (str) : 0 );
5862 }
5963};
6064
6165template <typename TChar, size_t N>
6266struct StringAdapter <TChar[N], enable_if_t <IsChar<TChar>::value>> {
63- using AdaptedString = ZeroTerminatedRamString ;
67+ using AdaptedString = RamString ;
6468
6569 static AdaptedString adapt (const TChar* p) {
66- return AdaptedString (reinterpret_cast <const char *>(p));
67- }
68- };
69-
70- class StaticStringAdapter : public ZeroTerminatedRamString {
71- public:
72- StaticStringAdapter (const char * str) : ZeroTerminatedRamString(str) {}
73-
74- bool isLinked () const {
75- return true ;
70+ auto str = reinterpret_cast <const char *>(p);
71+ return AdaptedString (str, str ? ::strlen (str) : 0 );
7672 }
7773};
7874
7975template <>
8076struct StringAdapter <const char *, void > {
81- using AdaptedString = StaticStringAdapter ;
77+ using AdaptedString = RamString ;
8278
8379 static AdaptedString adapt (const char * p) {
84- return AdaptedString (p);
85- }
86- };
87-
88- class SizedRamString {
89- public:
90- static const size_t typeSortKey = 2 ;
91-
92- SizedRamString (const char * str, size_t sz) : str_(str), size_(sz) {}
93-
94- bool isNull () const {
95- return !str_;
96- }
97-
98- size_t size () const {
99- return size_;
100- }
101-
102- char operator [](size_t i) const {
103- ARDUINOJSON_ASSERT (str_ != 0 );
104- ARDUINOJSON_ASSERT (i <= size ());
105- return str_[i];
106- }
107-
108- const char * data () const {
109- return str_;
110- }
111-
112- bool isLinked () const {
113- return false ;
80+ return AdaptedString (p, p ? ::strlen (p) : 0 , true );
11481 }
115-
116- protected:
117- const char * str_;
118- size_t size_;
11982};
12083
12184template <typename TChar>
12285struct SizedStringAdapter <TChar*, enable_if_t <IsChar<TChar>::value>> {
123- using AdaptedString = SizedRamString ;
86+ using AdaptedString = RamString ;
12487
12588 static AdaptedString adapt (const TChar* p, size_t n) {
12689 return AdaptedString (reinterpret_cast <const char *>(p), n);
0 commit comments