Skip to content

Commit 94d81a3

Browse files
committed
Merge all RAM string adapters
1 parent 31253db commit 94d81a3

File tree

5 files changed

+67
-162
lines changed

5 files changed

+67
-162
lines changed

extras/tests/Misc/StringAdapters.cpp

Lines changed: 44 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -14,75 +14,80 @@
1414

1515
using namespace ArduinoJson::detail;
1616

17-
TEST_CASE("ZeroTerminatedRamString") {
18-
SECTION("null") {
19-
ZeroTerminatedRamString s = adaptString(static_cast<const char*>(0));
17+
TEST_CASE("adaptString()") {
18+
SECTION("null const char*") {
19+
auto s = adaptString(static_cast<const char*>(0));
2020

2121
CHECK(s.isNull() == true);
2222
CHECK(s.size() == 0);
23+
CHECK(s.isLinked() == true);
2324
}
2425

25-
SECTION("non-null") {
26-
ZeroTerminatedRamString s = adaptString("bravo");
26+
SECTION("non-null const char*") {
27+
auto s = adaptString("bravo");
2728

2829
CHECK(s.isNull() == false);
2930
CHECK(s.size() == 5);
31+
CHECK(s.isLinked() == true);
3032
}
31-
}
3233

33-
TEST_CASE("SizedRamString") {
34-
SECTION("null") {
35-
SizedRamString s = adaptString(static_cast<const char*>(0), 10);
34+
SECTION("null const char* + size") {
35+
auto s = adaptString(static_cast<const char*>(0), 10);
3636

3737
CHECK(s.isNull() == true);
38+
CHECK(s.isLinked() == false);
3839
}
3940

40-
SECTION("non-null") {
41-
SizedRamString s = adaptString("bravo", 5);
41+
SECTION("non-null const char* + size") {
42+
auto s = adaptString("bravo", 5);
4243

4344
CHECK(s.isNull() == false);
4445
CHECK(s.size() == 5);
46+
CHECK(s.isLinked() == false);
4547
}
46-
}
4748

48-
TEST_CASE("FlashString") {
49-
SECTION("null") {
50-
FlashString s = adaptString(static_cast<const __FlashStringHelper*>(0));
49+
SECTION("null Flash string") {
50+
auto s = adaptString(static_cast<const __FlashStringHelper*>(0));
5151

5252
CHECK(s.isNull() == true);
5353
CHECK(s.size() == 0);
54+
CHECK(s.isLinked() == false);
5455
}
5556

56-
SECTION("non-null") {
57-
FlashString s = adaptString(F("bravo"));
57+
SECTION("non-null Flash string") {
58+
auto s = adaptString(F("bravo"));
5859

5960
CHECK(s.isNull() == false);
6061
CHECK(s.size() == 5);
62+
CHECK(s.isLinked() == false);
6163
}
62-
}
6364

64-
TEST_CASE("std::string") {
65-
std::string orig("bravo");
66-
SizedRamString s = adaptString(orig);
65+
SECTION("std::string") {
66+
std::string orig("bravo");
67+
auto s = adaptString(orig);
6768

68-
CHECK(s.isNull() == false);
69-
CHECK(s.size() == 5);
70-
}
69+
CHECK(s.isNull() == false);
70+
CHECK(s.size() == 5);
71+
CHECK(s.isLinked() == false);
72+
}
7173

72-
TEST_CASE("Arduino String") {
73-
::String orig("bravo");
74-
SizedRamString s = adaptString(orig);
74+
SECTION("Arduino String") {
75+
::String orig("bravo");
76+
auto s = adaptString(orig);
7577

76-
CHECK(s.isNull() == false);
77-
CHECK(s.size() == 5);
78-
}
78+
CHECK(s.isNull() == false);
79+
CHECK(s.size() == 5);
80+
CHECK(s.isLinked() == false);
81+
}
7982

80-
TEST_CASE("custom_string") {
81-
custom_string orig("bravo");
82-
SizedRamString s = adaptString(orig);
83+
SECTION("custom_string") {
84+
custom_string orig("bravo");
85+
auto s = adaptString(orig);
8386

84-
CHECK(s.isNull() == false);
85-
CHECK(s.size() == 5);
87+
CHECK(s.isNull() == false);
88+
CHECK(s.size() == 5);
89+
CHECK(s.isLinked() == false);
90+
}
8691
}
8792

8893
struct EmptyStruct {};
@@ -100,21 +105,7 @@ TEST_CASE("IsString<T>") {
100105
}
101106

102107
TEST_CASE("stringCompare") {
103-
SECTION("ZeroTerminatedRamString vs ZeroTerminatedRamString") {
104-
CHECK(stringCompare(adaptString("bravo"), adaptString("alpha")) > 0);
105-
CHECK(stringCompare(adaptString("bravo"), adaptString("bravo")) == 0);
106-
CHECK(stringCompare(adaptString("bravo"), adaptString("charlie")) < 0);
107-
}
108-
109-
SECTION("ZeroTerminatedRamString vs SizedRamString") {
110-
CHECK(stringCompare(adaptString("bravo"), adaptString("alpha?", 5)) > 0);
111-
CHECK(stringCompare(adaptString("bravo"), adaptString("bravo?", 4)) > 0);
112-
CHECK(stringCompare(adaptString("bravo"), adaptString("bravo?", 5)) == 0);
113-
CHECK(stringCompare(adaptString("bravo"), adaptString("bravo?", 6)) < 0);
114-
CHECK(stringCompare(adaptString("bravo"), adaptString("charlie?", 7)) < 0);
115-
}
116-
117-
SECTION("SizedRamString vs SizedRamString") {
108+
SECTION("RamString vs RamString") {
118109
// clang-format off
119110
CHECK(stringCompare(adaptString("bravo!", 5), adaptString("alpha?", 5)) > 0);
120111
CHECK(stringCompare(adaptString("bravo!", 5), adaptString("bravo?", 5)) == 0);
@@ -134,7 +125,7 @@ TEST_CASE("stringCompare") {
134125
// clang-format on
135126
}
136127

137-
SECTION("FlashString vs SizedRamString") {
128+
SECTION("FlashString vs RamString") {
138129
// clang-format off
139130
CHECK(stringCompare(adaptString(F("bravo")), adaptString("alpha?", 5)) > 0);
140131
CHECK(stringCompare(adaptString(F("bravo")), adaptString("bravo?", 5)) == 0);
@@ -145,42 +136,18 @@ TEST_CASE("stringCompare") {
145136
CHECK(stringCompare(adaptString(F("bravo")), adaptString("bravo!", 6)) < 0);
146137
// clang-format on
147138
}
148-
149-
SECTION("ZeroTerminatedRamString vs FlashString") {
150-
// clang-format off
151-
CHECK(stringCompare(adaptString("bravo"), adaptString(F("alpha?"), 5)) > 0);
152-
CHECK(stringCompare(adaptString("bravo"), adaptString(F("bravo?"), 4)) > 0);
153-
CHECK(stringCompare(adaptString("bravo"), adaptString(F("bravo?"), 5)) == 0);
154-
CHECK(stringCompare(adaptString("bravo"), adaptString(F("bravo?"), 6)) < 0);
155-
CHECK(stringCompare(adaptString("bravo"), adaptString(F("charlie?"), 7)) < 0);
156-
// clang-format on
157-
}
158139
}
159140

160141
TEST_CASE("stringEquals()") {
161-
SECTION("ZeroTerminatedRamString vs ZeroTerminatedRamString") {
162-
CHECK(stringEquals(adaptString("bravo"), adaptString("brav")) == false);
163-
CHECK(stringEquals(adaptString("bravo"), adaptString("bravo")) == true);
164-
CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!")) == false);
165-
}
166-
167-
SECTION("ZeroTerminatedRamString vs SizedRamString") {
168-
// clang-format off
169-
CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!", 4)) == false);
170-
CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!", 5)) == true);
171-
CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!", 6)) == false);
172-
// clang-format on
173-
}
174-
175-
SECTION("FlashString vs SizedRamString") {
142+
SECTION("FlashString vs RamString") {
176143
// clang-format off
177144
CHECK(stringEquals(adaptString(F("bravo")), adaptString("bravo!", 4)) == false);
178145
CHECK(stringEquals(adaptString(F("bravo")), adaptString("bravo!", 5)) == true);
179146
CHECK(stringEquals(adaptString(F("bravo")), adaptString("bravo!", 6)) == false);
180147
// clang-format on
181148
}
182149

183-
SECTION("SizedRamString vs SizedRamString") {
150+
SECTION("RamString vs RamString") {
184151
// clang-format off
185152
CHECK(stringEquals(adaptString("bravo?", 5), adaptString("bravo!", 4)) == false);
186153
CHECK(stringEquals(adaptString("bravo?", 5), adaptString("bravo!", 5)) == true);

src/ArduinoJson/Strings/Adapters/FlashString.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class FlashString {
3434
return size_;
3535
}
3636

37-
friend bool stringEquals(FlashString a, SizedRamString b) {
37+
friend bool stringEquals(FlashString a, RamString b) {
3838
ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey);
3939
ARDUINOJSON_ASSERT(!a.isNull());
4040
ARDUINOJSON_ASSERT(!b.isNull());
@@ -43,7 +43,7 @@ class FlashString {
4343
return ::memcmp_P(b.data(), a.str_, a.size_) == 0;
4444
}
4545

46-
friend int stringCompare(FlashString a, SizedRamString b) {
46+
friend int stringCompare(FlashString a, RamString b) {
4747
ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey);
4848
ARDUINOJSON_ASSERT(!a.isNull());
4949
ARDUINOJSON_ASSERT(!b.isNull());

src/ArduinoJson/Strings/Adapters/JsonString.hpp

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,12 @@
1010

1111
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1212

13-
class JsonStringAdapter : public SizedRamString {
14-
public:
15-
JsonStringAdapter(const JsonString& s)
16-
: SizedRamString(s.c_str(), s.size()), linked_(s.isLinked()) {}
17-
18-
bool isLinked() const {
19-
return linked_;
20-
}
21-
22-
private:
23-
bool linked_;
24-
};
25-
2613
template <>
2714
struct StringAdapter<JsonString> {
28-
using AdaptedString = JsonStringAdapter;
15+
using AdaptedString = RamString;
2916

3017
static AdaptedString adapt(const JsonString& s) {
31-
return AdaptedString(s);
18+
return AdaptedString(s.c_str(), s.size(), s.isLinked());
3219
}
3320
};
3421

src/ArduinoJson/Strings/Adapters/RamString.hpp

Lines changed: 18 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,19 @@ template <typename T>
1717
struct 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 {
@@ -41,98 +42,48 @@ class ZeroTerminatedRamString {
4142
return str_;
4243
}
4344

44-
friend int stringCompare(ZeroTerminatedRamString a,
45-
ZeroTerminatedRamString b) {
46-
ARDUINOJSON_ASSERT(!a.isNull());
47-
ARDUINOJSON_ASSERT(!b.isNull());
48-
return ::strcmp(a.str_, b.str_);
49-
}
50-
51-
friend bool stringEquals(ZeroTerminatedRamString a,
52-
ZeroTerminatedRamString b) {
53-
return stringCompare(a, b) == 0;
54-
}
55-
5645
bool isLinked() const {
57-
return false;
46+
return linked_;
5847
}
5948

6049
protected:
6150
const char* str_;
51+
size_t size_;
52+
bool linked_; // TODO: merge with size_
6253
};
6354

6455
template <typename TChar>
6556
struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
66-
using AdaptedString = ZeroTerminatedRamString;
57+
using AdaptedString = RamString;
6758

6859
static AdaptedString adapt(const TChar* p) {
69-
return AdaptedString(reinterpret_cast<const char*>(p));
60+
auto str = reinterpret_cast<const char*>(p);
61+
return AdaptedString(str, str ? ::strlen(str) : 0);
7062
}
7163
};
7264

7365
template <typename TChar, size_t N>
7466
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
75-
using AdaptedString = ZeroTerminatedRamString;
67+
using AdaptedString = RamString;
7668

7769
static AdaptedString adapt(const TChar* p) {
78-
return AdaptedString(reinterpret_cast<const char*>(p));
79-
}
80-
};
81-
82-
class StaticStringAdapter : public ZeroTerminatedRamString {
83-
public:
84-
StaticStringAdapter(const char* str) : ZeroTerminatedRamString(str) {}
85-
86-
bool isLinked() const {
87-
return true;
70+
auto str = reinterpret_cast<const char*>(p);
71+
return AdaptedString(str, str ? ::strlen(str) : 0);
8872
}
8973
};
9074

9175
template <>
9276
struct StringAdapter<const char*, void> {
93-
using AdaptedString = StaticStringAdapter;
77+
using AdaptedString = RamString;
9478

9579
static AdaptedString adapt(const char* p) {
96-
return AdaptedString(p);
97-
}
98-
};
99-
100-
class SizedRamString {
101-
public:
102-
static const size_t typeSortKey = 2;
103-
104-
SizedRamString(const char* str, size_t sz) : str_(str), size_(sz) {}
105-
106-
bool isNull() const {
107-
return !str_;
108-
}
109-
110-
size_t size() const {
111-
return size_;
112-
}
113-
114-
char operator[](size_t i) const {
115-
ARDUINOJSON_ASSERT(str_ != 0);
116-
ARDUINOJSON_ASSERT(i <= size());
117-
return str_[i];
80+
return AdaptedString(p, p ? ::strlen(p) : 0, true);
11881
}
119-
120-
const char* data() const {
121-
return str_;
122-
}
123-
124-
bool isLinked() const {
125-
return false;
126-
}
127-
128-
protected:
129-
const char* str_;
130-
size_t size_;
13182
};
13283

13384
template <typename TChar>
13485
struct SizedStringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
135-
using AdaptedString = SizedRamString;
86+
using AdaptedString = RamString;
13687

13788
static AdaptedString adapt(const TChar* p, size_t n) {
13889
return AdaptedString(reinterpret_cast<const char*>(p), n);

src/ArduinoJson/Strings/Adapters/StringObject.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct StringAdapter<
1515
T,
1616
enable_if_t<(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
1717
(string_traits<T>::has_length || string_traits<T>::has_size)>> {
18-
using AdaptedString = SizedRamString;
18+
using AdaptedString = RamString;
1919

2020
static AdaptedString adapt(const T& s) {
2121
return AdaptedString(get_data(s), get_size(s));

0 commit comments

Comments
 (0)