Skip to content

Commit 94e4ce8

Browse files
committed
Store adapted string in MemberProxy
1 parent 7946ebe commit 94e4ce8

File tree

7 files changed

+53
-48
lines changed

7 files changed

+53
-48
lines changed

extras/tests/JsonDocument/MemberProxy.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,9 @@
1414
using ArduinoJson::detail::sizeofArray;
1515
using ArduinoJson::detail::sizeofObject;
1616

17-
using MemberProxy =
18-
ArduinoJson::detail::MemberProxy<JsonDocument&, const char*>;
19-
2017
TEST_CASE("MemberProxy::add()") {
2118
JsonDocument doc;
22-
MemberProxy mp = doc["hello"];
19+
auto mp = doc["hello"];
2320

2421
SECTION("add(int)") {
2522
mp.add(42);
@@ -48,7 +45,7 @@ TEST_CASE("MemberProxy::add()") {
4845

4946
TEST_CASE("MemberProxy::clear()") {
5047
JsonDocument doc;
51-
MemberProxy mp = doc["hello"];
48+
auto mp = doc["hello"];
5249

5350
SECTION("size goes back to zero") {
5451
mp.add(42);
@@ -139,7 +136,7 @@ TEST_CASE("MemberProxy::operator|()") {
139136

140137
TEST_CASE("MemberProxy::remove()") {
141138
JsonDocument doc;
142-
MemberProxy mp = doc["hello"];
139+
auto mp = doc["hello"];
143140

144141
SECTION("remove(int)") {
145142
mp.add(1);
@@ -186,7 +183,7 @@ TEST_CASE("MemberProxy::remove()") {
186183

187184
TEST_CASE("MemberProxy::set()") {
188185
JsonDocument doc;
189-
MemberProxy mp = doc["hello"];
186+
auto mp = doc["hello"];
190187

191188
SECTION("set(int)") {
192189
mp.set(42);
@@ -223,7 +220,7 @@ TEST_CASE("MemberProxy::set()") {
223220

224221
TEST_CASE("MemberProxy::size()") {
225222
JsonDocument doc;
226-
MemberProxy mp = doc["hello"];
223+
auto mp = doc["hello"];
227224

228225
SECTION("returns 0") {
229226
REQUIRE(mp.size() == 0);
@@ -246,7 +243,7 @@ TEST_CASE("MemberProxy::size()") {
246243

247244
TEST_CASE("MemberProxy::operator[]") {
248245
JsonDocument doc;
249-
MemberProxy mp = doc["hello"];
246+
auto mp = doc["hello"];
250247

251248
SECTION("set member") {
252249
mp["world"] = 42;
@@ -265,7 +262,7 @@ TEST_CASE("MemberProxy cast to JsonVariantConst") {
265262
JsonDocument doc;
266263
doc["hello"] = "world";
267264

268-
const MemberProxy mp = doc["hello"];
265+
const auto mp = doc["hello"];
269266

270267
JsonVariantConst var = mp;
271268

@@ -276,7 +273,7 @@ TEST_CASE("MemberProxy cast to JsonVariant") {
276273
JsonDocument doc;
277274
doc["hello"] = "world";
278275

279-
MemberProxy mp = doc["hello"];
276+
auto mp = doc["hello"];
280277

281278
JsonVariant var = mp;
282279

src/ArduinoJson/Document/JsonDocument.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,21 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
186186
// Gets or sets a root object's member.
187187
// https://arduinojson.org/v7/api/jsondocument/subscript/
188188
template <typename TString>
189-
detail::enable_if_t<detail::IsString<TString>::value,
190-
detail::MemberProxy<JsonDocument&, TString>>
189+
detail::enable_if_t<
190+
detail::IsString<TString>::value,
191+
detail::MemberProxy<JsonDocument&, detail::AdaptedString<TString>>>
191192
operator[](const TString& key) {
192-
return {*this, key};
193+
return {*this, detail::adaptString(key)};
193194
}
194195

195196
// Gets or sets a root object's member.
196197
// https://arduinojson.org/v7/api/jsondocument/subscript/
197198
template <typename TChar>
198-
detail::enable_if_t<detail::IsString<TChar*>::value,
199-
detail::MemberProxy<JsonDocument&, TChar*>>
199+
detail::enable_if_t<
200+
detail::IsString<TChar*>::value,
201+
detail::MemberProxy<JsonDocument&, detail::AdaptedString<TChar*>>>
200202
operator[](TChar* key) {
201-
return {*this, key};
203+
return {*this, detail::adaptString(key)};
202204
}
203205

204206
// Gets a root object's member.

src/ArduinoJson/Object/JsonObject.hpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,31 +102,31 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
102102
// Gets or sets the member with specified key.
103103
// https://arduinojson.org/v7/api/jsonobject/subscript/
104104
template <typename TString>
105-
detail::enable_if_t<detail::IsString<TString>::value,
106-
detail::MemberProxy<JsonObject, TString>>
105+
detail::enable_if_t<
106+
detail::IsString<TString>::value,
107+
detail::MemberProxy<JsonObject, detail::AdaptedString<TString>>>
107108
operator[](const TString& key) const {
108-
return {*this, key};
109+
return {*this, detail::adaptString(key)};
109110
}
110111

111112
// Gets or sets the member with specified key.
112113
// https://arduinojson.org/v7/api/jsonobject/subscript/
113114
template <typename TChar>
114-
detail::enable_if_t<detail::IsString<TChar*>::value,
115-
detail::MemberProxy<JsonObject, TChar*>>
115+
detail::enable_if_t<
116+
detail::IsString<TChar*>::value,
117+
detail::MemberProxy<JsonObject, detail::AdaptedString<TChar*>>>
116118
operator[](TChar* key) const {
117-
return {*this, key};
119+
return {*this, detail::adaptString(key)};
118120
}
119121

120122
// Gets or sets the member with specified key.
121123
// https://arduinojson.org/v7/api/jsonobject/subscript/
122124
template <typename TVariant>
123-
detail::enable_if_t<detail::IsVariant<TVariant>::value,
124-
detail::MemberProxy<JsonObject, JsonString>>
125+
detail::enable_if_t<
126+
detail::IsVariant<TVariant>::value,
127+
detail::MemberProxy<JsonObject, detail::AdaptedString<JsonString>>>
125128
operator[](const TVariant& key) const {
126-
if (key.template is<JsonString>())
127-
return {*this, key.template as<JsonString>()};
128-
else
129-
return {*this, nullptr};
129+
return {*this, detail::adaptString(key.template as<JsonString>())};
130130
}
131131

132132
// Removes the member at the specified iterator.

src/ArduinoJson/Object/MemberProxy.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1010

1111
// A proxy class to get or set a member of an object.
1212
// https://arduinojson.org/v7/api/jsonobject/subscript/
13-
template <typename TUpstream, typename TStringRef>
13+
template <typename TUpstream, typename AdaptedString>
1414
class MemberProxy
15-
: public VariantRefBase<MemberProxy<TUpstream, TStringRef>>,
16-
public VariantOperators<MemberProxy<TUpstream, TStringRef>> {
15+
: public VariantRefBase<MemberProxy<TUpstream, AdaptedString>>,
16+
public VariantOperators<MemberProxy<TUpstream, AdaptedString>> {
1717
friend class VariantAttorney;
1818

1919
public:
20-
MemberProxy(TUpstream upstream, TStringRef key)
20+
MemberProxy(TUpstream upstream, AdaptedString key)
2121
: upstream_(upstream), key_(key) {}
2222

2323
MemberProxy(const MemberProxy& src)
@@ -47,21 +47,21 @@ class MemberProxy
4747

4848
VariantData* getData() const {
4949
return VariantData::getMember(
50-
VariantAttorney::getData(upstream_), adaptString(key_),
50+
VariantAttorney::getData(upstream_), key_,
5151
VariantAttorney::getResourceManager(upstream_));
5252
}
5353

5454
VariantData* getOrCreateData() const {
5555
auto data = VariantAttorney::getOrCreateData(upstream_);
5656
if (!data)
5757
return nullptr;
58-
return data->getOrAddMember(adaptString(key_),
58+
return data->getOrAddMember(key_,
5959
VariantAttorney::getResourceManager(upstream_));
6060
}
6161

6262
private:
6363
TUpstream upstream_;
64-
TStringRef key_;
64+
AdaptedString key_;
6565
};
6666

6767
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/StringAdapters.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,8 @@ static void stringGetChars(TAdaptedString s, char* p, size_t n) {
7070
}
7171
}
7272

73+
template <typename T>
74+
using AdaptedString =
75+
typename StringAdapter<remove_reference_t<T>>::AdaptedString;
76+
7377
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Variant/VariantRefBase.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,16 +188,16 @@ class VariantRefBase : public VariantTag {
188188
// Gets or sets an object member.
189189
// https://arduinojson.org/v7/api/jsonvariant/subscript/
190190
template <typename TString>
191-
FORCE_INLINE
192-
enable_if_t<IsString<TString>::value, MemberProxy<TDerived, TString>>
193-
operator[](const TString& key) const;
191+
FORCE_INLINE enable_if_t<IsString<TString>::value,
192+
MemberProxy<TDerived, AdaptedString<TString>>>
193+
operator[](const TString& key) const;
194194

195195
// Gets or sets an object member.
196196
// https://arduinojson.org/v7/api/jsonvariant/subscript/
197197
template <typename TChar>
198-
FORCE_INLINE
199-
enable_if_t<IsString<TChar*>::value, MemberProxy<TDerived, TChar*>>
200-
operator[](TChar* key) const;
198+
FORCE_INLINE enable_if_t<IsString<TChar*>::value,
199+
MemberProxy<TDerived, AdaptedString<TChar*>>>
200+
operator[](TChar* key) const;
201201

202202
// Gets an object member or an array element.
203203
// https://arduinojson.org/v7/api/jsonvariant/subscript/

src/ArduinoJson/Variant/VariantRefBaseImpl.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,17 +123,19 @@ inline ElementProxy<TDerived> VariantRefBase<TDerived>::operator[](
123123
}
124124

125125
template <typename TDerived>
126-
template <typename TString>
127-
inline enable_if_t<IsString<TString*>::value, MemberProxy<TDerived, TString*>>
128-
VariantRefBase<TDerived>::operator[](TString* key) const {
129-
return MemberProxy<TDerived, TString*>(derived(), key);
126+
template <typename TChar>
127+
inline enable_if_t<IsString<TChar*>::value,
128+
MemberProxy<TDerived, AdaptedString<TChar*>>>
129+
VariantRefBase<TDerived>::operator[](TChar* key) const {
130+
return {derived(), adaptString(key)};
130131
}
131132

132133
template <typename TDerived>
133134
template <typename TString>
134-
inline enable_if_t<IsString<TString>::value, MemberProxy<TDerived, TString>>
135+
inline enable_if_t<IsString<TString>::value,
136+
MemberProxy<TDerived, AdaptedString<TString>>>
135137
VariantRefBase<TDerived>::operator[](const TString& key) const {
136-
return MemberProxy<TDerived, TString>(derived(), key);
138+
return {derived(), adaptString(key)};
137139
}
138140

139141
template <typename TDerived>

0 commit comments

Comments
 (0)