Skip to content

Commit c89a202

Browse files
committed
Make string support generic (issue #1807)
1 parent 42ae8c3 commit c89a202

File tree

10 files changed

+141
-90
lines changed

10 files changed

+141
-90
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ HEAD
66

77
* Drop support for C++98/C++03. Minimum required is C++11.
88
* Remove `ARDUINOJSON_NAMESPACE`; use `ArduinoJson` instead.
9+
* Make string support generic (issue #1807)
910

1011
v6.20.1 (2023-02-08)
1112
-------

extras/tests/Misc/StringAdapters.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// MIT License
44

55
#define ARDUINOJSON_ENABLE_PROGMEM 1
6-
#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1
76

87
#include "custom_string.hpp"
98
#include "progmem_emulation.hpp"

src/ArduinoJson/Polyfills/type_traits/declval.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1010

1111
template <typename T>
12-
T declval();
12+
T&& declval();
1313

1414
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@
77
#include <ArduinoJson/Namespace.hpp>
88
#include <ArduinoJson/Polyfills/type_traits.hpp>
99

10-
#include <string>
11-
1210
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1311

14-
template <class T>
12+
template <class...>
13+
using void_t = void;
14+
15+
template <class T, typename = void>
1516
struct is_std_string : false_type {};
1617

17-
template <class TCharTraits, class TAllocator>
18-
struct is_std_string<std::basic_string<char, TCharTraits, TAllocator>>
18+
template <class T>
19+
struct is_std_string<
20+
T, void_t<decltype(T().push_back('a')), decltype(T().append(""))>>
1921
: true_type {};
2022

2123
template <typename TDestination>
@@ -25,7 +27,7 @@ class Writer<TDestination,
2527
Writer(TDestination& str) : _str(&str) {}
2628

2729
size_t write(uint8_t c) {
28-
_str->operator+=(static_cast<char>(c));
30+
_str->push_back(static_cast<char>(c));
2931
return 1;
3032
}
3133

src/ArduinoJson/Strings/Adapters/ArduinoString.hpp

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

src/ArduinoJson/Strings/Adapters/StdString.hpp

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// ArduinoJson - https://arduinojson.org
2+
// Copyright © 2014-2023, Benoit BLANCHON
3+
// MIT License
4+
5+
#pragma once
6+
7+
#include <ArduinoJson/Strings/Adapters/RamString.hpp>
8+
#include <ArduinoJson/Strings/StringAdapter.hpp>
9+
#include <ArduinoJson/Strings/StringTraits.hpp>
10+
11+
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
12+
13+
template <typename T>
14+
struct StringAdapter<
15+
T,
16+
typename enable_if<
17+
(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
18+
(string_traits<T>::has_length || string_traits<T>::has_size)>::type> {
19+
typedef SizedRamString AdaptedString;
20+
21+
static AdaptedString adapt(const T& s) {
22+
return AdaptedString(get_data(s), get_size(s));
23+
}
24+
25+
private:
26+
template <typename U>
27+
static typename enable_if<string_traits<U>::has_size, size_t>::type get_size(
28+
const U& s) {
29+
return s.size();
30+
}
31+
32+
template <typename U>
33+
static typename enable_if<!string_traits<U>::has_size, size_t>::type get_size(
34+
const U& s) {
35+
return s.length();
36+
}
37+
38+
template <typename U>
39+
static typename enable_if<string_traits<U>::has_data, const char*>::type
40+
get_data(const U& s) {
41+
return s.data();
42+
}
43+
44+
template <typename U>
45+
static typename enable_if<!string_traits<U>::has_data, const char*>::type
46+
get_data(const U& s) {
47+
return s.c_str();
48+
}
49+
};
50+
51+
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Strings/Adapters/StringView.hpp

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

src/ArduinoJson/Strings/StringAdapters.hpp

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,7 @@
77
#include <ArduinoJson/Polyfills/type_traits.hpp>
88
#include <ArduinoJson/Strings/Adapters/JsonString.hpp>
99
#include <ArduinoJson/Strings/Adapters/RamString.hpp>
10-
11-
#if ARDUINOJSON_ENABLE_STD_STRING
12-
# include <ArduinoJson/Strings/Adapters/StdString.hpp>
13-
#endif
14-
15-
#if ARDUINOJSON_ENABLE_STRING_VIEW
16-
# include <ArduinoJson/Strings/Adapters/StringView.hpp>
17-
#endif
18-
19-
#if ARDUINOJSON_ENABLE_ARDUINO_STRING
20-
# include <ArduinoJson/Strings/Adapters/ArduinoString.hpp>
21-
#endif
10+
#include <ArduinoJson/Strings/Adapters/StringObject.hpp>
2211

2312
#if ARDUINOJSON_ENABLE_PROGMEM
2413
# include <ArduinoJson/Strings/Adapters/FlashString.hpp>
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// ArduinoJson - https://arduinojson.org
2+
// Copyright © 2014-2023, Benoit BLANCHON
3+
// MIT License
4+
5+
#pragma once
6+
7+
#include <ArduinoJson/Strings/Adapters/RamString.hpp>
8+
#include <ArduinoJson/Strings/StringAdapter.hpp>
9+
10+
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
11+
12+
namespace string_traits_impl {
13+
14+
// const char* c_str() const
15+
// - String
16+
// - std::string
17+
18+
template <class T, class = void>
19+
struct has_cstr : false_type {};
20+
21+
template <class T>
22+
struct has_cstr<T,
23+
typename enable_if<is_same<decltype(declval<const T>().c_str()),
24+
const char*>::value>::type>
25+
: true_type {};
26+
27+
// const char* data() const
28+
// - std::string
29+
// - std::string_view
30+
// - etl::string
31+
32+
template <class T, class = void>
33+
struct has_data : false_type {};
34+
35+
template <class T>
36+
struct has_data<T,
37+
typename enable_if<is_same<decltype(declval<const T>().data()),
38+
const char*>::value>::type>
39+
: true_type {};
40+
41+
// size_t length() const
42+
// - String
43+
44+
template <class T, class = void>
45+
struct has_length : false_type {};
46+
47+
template <class T>
48+
struct has_length<
49+
T, typename enable_if<
50+
is_same<decltype(declval<const T>().length()), size_t>::value>::type>
51+
: true_type {};
52+
53+
// size_t size() const
54+
// - std::string
55+
// - std::string_view
56+
// - etl::string
57+
58+
template <class T, class = void>
59+
struct has_size : false_type {};
60+
61+
template <class T>
62+
struct has_size<
63+
T, typename enable_if<
64+
is_same<decltype(declval<const T>().size()), size_t>::value>::type>
65+
: true_type {};
66+
67+
} // namespace string_traits_impl
68+
69+
template <typename T>
70+
struct string_traits {
71+
enum {
72+
has_cstr = string_traits_impl::has_cstr<T>::value,
73+
has_length = string_traits_impl::has_length<T>::value,
74+
has_data = string_traits_impl::has_data<T>::value,
75+
has_size = string_traits_impl::has_size<T>::value
76+
};
77+
};
78+
79+
ARDUINOJSON_END_PRIVATE_NAMESPACE

0 commit comments

Comments
 (0)