Skip to content

Commit be328de

Browse files
committed
Simplify string adapters
1 parent 94d81a3 commit be328de

File tree

10 files changed

+71
-149
lines changed

10 files changed

+71
-149
lines changed

extras/tests/Misc/StringAdapters.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
#include <Arduino.h>
66

7-
#include <ArduinoJson/Strings/IsString.hpp>
87
#include <ArduinoJson/Strings/StringAdapters.hpp>
98

109
#include <catch.hpp>

src/ArduinoJson/Strings/Adapters/FlashString.hpp

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#pragma once
66

77
#include <ArduinoJson/Polyfills/pgmspace.hpp>
8-
#include <ArduinoJson/Strings/StringAdapter.hpp>
98

109
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1110

@@ -72,22 +71,12 @@ class FlashString {
7271
size_t size_;
7372
};
7473

75-
template <>
76-
struct StringAdapter<const __FlashStringHelper*, void> {
77-
using AdaptedString = FlashString;
74+
inline FlashString adaptString(const __FlashStringHelper* s) {
75+
return FlashString(s, s ? strlen_P(reinterpret_cast<const char*>(s)) : 0);
76+
}
7877

79-
static AdaptedString adapt(const __FlashStringHelper* s) {
80-
return AdaptedString(s, s ? strlen_P(reinterpret_cast<const char*>(s)) : 0);
81-
}
82-
};
83-
84-
template <>
85-
struct SizedStringAdapter<const __FlashStringHelper*, void> {
86-
using AdaptedString = FlashString;
87-
88-
static AdaptedString adapt(const __FlashStringHelper* s, size_t n) {
89-
return AdaptedString(s, n);
90-
}
91-
};
78+
inline FlashString adaptString(const __FlashStringHelper* s, size_t n) {
79+
return FlashString(s, n);
80+
}
9281

9382
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/Adapters/JsonString.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,11 @@
66

77
#include <ArduinoJson/Strings/Adapters/RamString.hpp>
88
#include <ArduinoJson/Strings/JsonString.hpp>
9-
#include <ArduinoJson/Strings/StringAdapter.hpp>
109

1110
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1211

13-
template <>
14-
struct StringAdapter<JsonString> {
15-
using AdaptedString = RamString;
16-
17-
static AdaptedString adapt(const JsonString& s) {
18-
return AdaptedString(s.c_str(), s.size(), s.isLinked());
19-
}
20-
};
12+
inline RamString adaptString(const JsonString& s) {
13+
return RamString(s.c_str(), s.size(), s.isLinked());
14+
}
2115

2216
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/Adapters/RamString.hpp

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99

1010
#include <ArduinoJson/Polyfills/assert.hpp>
1111
#include <ArduinoJson/Polyfills/attributes.hpp>
12-
#include <ArduinoJson/Strings/StringAdapter.hpp>
1312

1413
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1514

1615
template <typename T>
1716
struct IsChar
18-
: integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
17+
: integral_constant<bool,
18+
is_same<remove_cv_t<T>, char>::value ||
19+
is_same<remove_cv_t<T>, signed char>::value ||
20+
is_same<remove_cv_t<T>, unsigned char>::value> {};
1921

2022
class RamString {
2123
public:
@@ -52,42 +54,27 @@ class RamString {
5254
bool linked_; // TODO: merge with size_
5355
};
5456

55-
template <typename TChar>
56-
struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
57-
using AdaptedString = RamString;
58-
59-
static AdaptedString adapt(const TChar* p) {
60-
auto str = reinterpret_cast<const char*>(p);
61-
return AdaptedString(str, str ? ::strlen(str) : 0);
62-
}
63-
};
57+
template <typename TChar, typename = enable_if_t<IsChar<TChar>::value>>
58+
inline RamString adaptString(TChar* p) {
59+
auto str = reinterpret_cast<const char*>(p);
60+
return RamString(str, str ? ::strlen(str) : 0);
61+
}
6462

65-
template <typename TChar, size_t N>
66-
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
67-
using AdaptedString = RamString;
68-
69-
static AdaptedString adapt(const TChar* p) {
70-
auto str = reinterpret_cast<const char*>(p);
71-
return AdaptedString(str, str ? ::strlen(str) : 0);
72-
}
73-
};
63+
template <
64+
typename TChar, size_t N,
65+
typename = enable_if_t<IsChar<TChar>::value && !is_const<TChar>::value>>
66+
inline RamString adaptString(TChar p[N]) {
67+
auto str = reinterpret_cast<const char*>(p);
68+
return RamString(str, str ? ::strlen(str) : 0);
69+
}
7470

75-
template <>
76-
struct StringAdapter<const char*, void> {
77-
using AdaptedString = RamString;
78-
79-
static AdaptedString adapt(const char* p) {
80-
return AdaptedString(p, p ? ::strlen(p) : 0, true);
81-
}
82-
};
71+
inline RamString adaptString(const char* p) {
72+
return RamString(p, p ? ::strlen(p) : 0, true);
73+
}
8374

8475
template <typename TChar>
85-
struct SizedStringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
86-
using AdaptedString = RamString;
87-
88-
static AdaptedString adapt(const TChar* p, size_t n) {
89-
return AdaptedString(reinterpret_cast<const char*>(p), n);
90-
}
91-
};
76+
inline RamString adaptString(const TChar* p, size_t n) {
77+
return RamString(reinterpret_cast<const char*>(p), n);
78+
}
9279

9380
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/Adapters/StringObject.hpp

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,40 @@
55
#pragma once
66

77
#include <ArduinoJson/Strings/Adapters/RamString.hpp>
8-
#include <ArduinoJson/Strings/StringAdapter.hpp>
98
#include <ArduinoJson/Strings/StringTraits.hpp>
109

1110
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1211

13-
template <typename T>
14-
struct StringAdapter<
15-
T,
16-
enable_if_t<(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
17-
(string_traits<T>::has_length || string_traits<T>::has_size)>> {
18-
using AdaptedString = RamString;
19-
20-
static AdaptedString adapt(const T& s) {
21-
return AdaptedString(get_data(s), get_size(s));
22-
}
23-
24-
private:
25-
template <typename U>
26-
static enable_if_t<string_traits<U>::has_size, size_t> get_size(const U& s) {
27-
return s.size();
28-
}
29-
30-
template <typename U>
31-
static enable_if_t<!string_traits<U>::has_size, size_t> get_size(const U& s) {
32-
return s.length();
33-
}
34-
35-
template <typename U>
36-
static enable_if_t<string_traits<U>::has_data, const char*> get_data(
37-
const U& s) {
38-
return s.data();
39-
}
40-
41-
template <typename U>
42-
static enable_if_t<!string_traits<U>::has_data, const char*> get_data(
43-
const U& s) {
44-
return s.c_str();
45-
}
46-
};
12+
namespace string_helpers {
13+
template <typename U>
14+
static enable_if_t<string_traits<U>::has_size, size_t> get_size(const U& s) {
15+
return s.size();
16+
}
17+
18+
template <typename U>
19+
static enable_if_t<!string_traits<U>::has_size, size_t> get_size(const U& s) {
20+
return s.length();
21+
}
22+
23+
template <typename U>
24+
static enable_if_t<string_traits<U>::has_data, const char*> get_data(
25+
const U& s) {
26+
return s.data();
27+
}
28+
29+
template <typename U>
30+
static enable_if_t<!string_traits<U>::has_data, const char*> get_data(
31+
const U& s) {
32+
return s.c_str();
33+
}
34+
} // namespace string_helpers
35+
36+
template <typename T,
37+
typename = enable_if_t<
38+
(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
39+
(string_traits<T>::has_length || string_traits<T>::has_size)>>
40+
inline RamString adaptString(const T& s) {
41+
return RamString(string_helpers::get_data(s), string_helpers::get_size(s));
42+
}
4743

4844
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/IsString.hpp

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/ArduinoJson/Strings/StringAdapter.hpp

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/ArduinoJson/Strings/StringAdapters.hpp

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

73+
template <typename TString>
74+
using AdaptedString = decltype(adaptString(declval<TString>()));
75+
76+
template <typename T, typename Enable = void>
77+
struct IsString : false_type {};
78+
79+
template <typename T>
80+
struct IsString<T, void_t<AdaptedString<T>>> : true_type {};
81+
7382
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/StringTraits.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#pragma once
66

77
#include <ArduinoJson/Strings/Adapters/RamString.hpp>
8-
#include <ArduinoJson/Strings/StringAdapter.hpp>
98

109
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1110

src/ArduinoJson/Variant/JsonVariantConst.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
#include <ArduinoJson/Memory/ResourceManager.hpp>
1111
#include <ArduinoJson/Polyfills/type_traits.hpp>
12-
#include <ArduinoJson/Strings/IsString.hpp>
1312
#include <ArduinoJson/Strings/StringAdapters.hpp>
1413
#include <ArduinoJson/Variant/VariantAttorney.hpp>
1514
#include <ArduinoJson/Variant/VariantOperators.hpp>

0 commit comments

Comments
 (0)