Coverage Report

Created: 2023-04-06 06:26

/src/arduinojson/src/ArduinoJson/Strings/Adapters/RamString.hpp
Line
Count
Source (jump to first uncovered line)
1
// ArduinoJson - https://arduinojson.org
2
// Copyright © 2014-2023, Benoit BLANCHON
3
// MIT License
4
5
#pragma once
6
7
#include <stddef.h>  // size_t
8
#include <string.h>  // strcmp
9
10
#include <ArduinoJson/Polyfills/assert.hpp>
11
#include <ArduinoJson/Strings/StoragePolicy.hpp>
12
#include <ArduinoJson/Strings/StringAdapter.hpp>
13
14
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
15
16
template <typename T>
17
struct IsChar
18
    : integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
19
20
class ZeroTerminatedRamString {
21
 public:
22
  static const size_t typeSortKey = 3;
23
24
5.07k
  ZeroTerminatedRamString(const char* str) : _str(str) {}
25
26
8.21k
  bool isNull() const {
27
8.21k
    return !_str;
28
8.21k
  }
29
30
12.6k
  size_t size() const {
31
12.6k
    return _str ? ::strlen(_str) : 0;
32
12.6k
  }
33
34
6.33k
  char operator[](size_t i) const {
35
6.33k
    ARDUINOJSON_ASSERT(_str != 0);
36
6.33k
    ARDUINOJSON_ASSERT(i <= size());
37
0
    return _str[i];
38
6.33k
  }
39
40
0
  const char* data() const {
41
0
    return _str;
42
0
  }
43
44
  friend int stringCompare(ZeroTerminatedRamString a,
45
0
                           ZeroTerminatedRamString b) {
46
0
    ARDUINOJSON_ASSERT(!a.isNull());
47
0
    ARDUINOJSON_ASSERT(!b.isNull());
48
0
    return ::strcmp(a._str, b._str);
49
0
  }
50
51
  friend bool stringEquals(ZeroTerminatedRamString a,
52
0
                           ZeroTerminatedRamString b) {
53
0
    return stringCompare(a, b) == 0;
54
0
  }
55
56
0
  StringStoragePolicy::Copy storagePolicy() const {
57
0
    return StringStoragePolicy::Copy();
58
0
  }
59
60
 protected:
61
  const char* _str;
62
};
63
64
template <typename TChar>
65
struct StringAdapter<TChar*, typename enable_if<IsChar<TChar>::value>::type> {
66
  typedef ZeroTerminatedRamString AdaptedString;
67
68
  static AdaptedString adapt(const TChar* p) {
69
    return AdaptedString(reinterpret_cast<const char*>(p));
70
  }
71
};
72
73
template <typename TChar, size_t N>
74
struct StringAdapter<TChar[N], typename enable_if<IsChar<TChar>::value>::type> {
75
  typedef ZeroTerminatedRamString AdaptedString;
76
77
  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
5.07k
  StaticStringAdapter(const char* str) : ZeroTerminatedRamString(str) {}
85
86
0
  StringStoragePolicy::Link storagePolicy() const {
87
0
    return StringStoragePolicy::Link();
88
0
  }
89
};
90
91
template <>
92
struct StringAdapter<const char*, void> {
93
  typedef StaticStringAdapter AdaptedString;
94
95
5.07k
  static AdaptedString adapt(const char* p) {
96
5.07k
    return AdaptedString(p);
97
5.07k
  }
98
};
99
100
class SizedRamString {
101
 public:
102
  static const size_t typeSortKey = 2;
103
104
19.3k
  SizedRamString(const char* str, size_t sz) : _str(str), _size(sz) {}
105
106
24.6k
  bool isNull() const {
107
24.6k
    return !_str;
108
24.6k
  }
109
110
50.1k
  size_t size() const {
111
50.1k
    return _size;
112
50.1k
  }
113
114
18.4k
  char operator[](size_t i) const {
115
18.4k
    ARDUINOJSON_ASSERT(_str != 0);
116
18.4k
    ARDUINOJSON_ASSERT(i <= size());
117
0
    return _str[i];
118
18.4k
  }
119
120
0
  const char* data() const {
121
0
    return _str;
122
0
  }
123
124
0
  StringStoragePolicy::Copy storagePolicy() const {
125
0
    return StringStoragePolicy::Copy();
126
0
  }
127
128
 protected:
129
  const char* _str;
130
  size_t _size;
131
};
132
133
template <typename TChar>
134
struct SizedStringAdapter<TChar*,
135
                          typename enable_if<IsChar<TChar>::value>::type> {
136
  typedef SizedRamString AdaptedString;
137
138
19.3k
  static AdaptedString adapt(const TChar* p, size_t n) {
139
19.3k
    return AdaptedString(reinterpret_cast<const char*>(p), n);
140
19.3k
  }
ArduinoJson::V6211HB::detail::SizedStringAdapter<char*, void>::adapt(char const*, unsigned long)
Line
Count
Source
138
19.3k
  static AdaptedString adapt(const TChar* p, size_t n) {
139
19.3k
    return AdaptedString(reinterpret_cast<const char*>(p), n);
140
19.3k
  }
Unexecuted instantiation: ArduinoJson::V6211HB::detail::SizedStringAdapter<char const*, void>::adapt(char const*, unsigned long)
141
};
142
143
ARDUINOJSON_END_PRIVATE_NAMESPACE