Skip to content

Commit d12fe18

Browse files
committed
Restoring concatenation of built-in types with String.
1 parent 0ac0dcf commit d12fe18

File tree

2 files changed

+113
-5
lines changed

2 files changed

+113
-5
lines changed

hardware/arduino/cores/arduino/WString.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,49 @@ unsigned char String::concat(const char *cstr)
240240
return concat(cstr, strlen(cstr));
241241
}
242242

243+
unsigned char String::concat(char c)
244+
{
245+
char buf[2];
246+
buf[0] = c;
247+
buf[1] = 0;
248+
return concat(buf, 1);
249+
}
250+
251+
unsigned char String::concat(unsigned char num)
252+
{
253+
char buf[4];
254+
itoa(num, buf, 10);
255+
return concat(buf, strlen(buf));
256+
}
257+
258+
unsigned char String::concat(int num)
259+
{
260+
char buf[7];
261+
itoa(num, buf, 10);
262+
return concat(buf, strlen(buf));
263+
}
264+
265+
unsigned char String::concat(unsigned int num)
266+
{
267+
char buf[6];
268+
utoa(num, buf, 10);
269+
return concat(buf, strlen(buf));
270+
}
271+
272+
unsigned char String::concat(long num)
273+
{
274+
char buf[12];
275+
ltoa(num, buf, 10);
276+
return concat(buf, strlen(buf));
277+
}
278+
279+
unsigned char String::concat(unsigned long num)
280+
{
281+
char buf[11];
282+
ultoa(num, buf, 10);
283+
return concat(buf, strlen(buf));
284+
}
285+
243286
/*********************************************/
244287
/* Concatenate */
245288
/*********************************************/
@@ -258,6 +301,48 @@ StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
258301
return a;
259302
}
260303

304+
StringSumHelper & operator + (const StringSumHelper &lhs, char c)
305+
{
306+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
307+
if (!a.concat(c)) a.invalidate();
308+
return a;
309+
}
310+
311+
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num)
312+
{
313+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
314+
if (!a.concat(num)) a.invalidate();
315+
return a;
316+
}
317+
318+
StringSumHelper & operator + (const StringSumHelper &lhs, int num)
319+
{
320+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
321+
if (!a.concat(num)) a.invalidate();
322+
return a;
323+
}
324+
325+
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num)
326+
{
327+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
328+
if (!a.concat(num)) a.invalidate();
329+
return a;
330+
}
331+
332+
StringSumHelper & operator + (const StringSumHelper &lhs, long num)
333+
{
334+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
335+
if (!a.concat(num)) a.invalidate();
336+
return a;
337+
}
338+
339+
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
340+
{
341+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
342+
if (!a.concat(num)) a.invalidate();
343+
return a;
344+
}
345+
261346
/*********************************************/
262347
/* Comparison */
263348
/*********************************************/

hardware/arduino/cores/arduino/WString.h

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,42 @@ class String
8787
String & operator = (StringSumHelper &&rval);
8888
#endif
8989

90-
// concat
90+
// concatenate (works w/ built-in types)
91+
9192
// returns true on success, false on failure (in which case, the string
9293
// is left unchanged). if the argument is null or invalid, the
9394
// concatenation is considered unsucessful.
9495
unsigned char concat(const String &str);
9596
unsigned char concat(const char *cstr);
97+
unsigned char concat(char c);
98+
unsigned char concat(unsigned char c);
99+
unsigned char concat(int num);
100+
unsigned char concat(unsigned int num);
101+
unsigned char concat(long num);
102+
unsigned char concat(unsigned long num);
96103

97104
// if there's not enough memory for the concatenated value, the string
98105
// will be left unchanged (but this isn't signalled in any way)
99106
String & operator += (const String &rhs) {concat(rhs); return (*this);}
100107
String & operator += (const char *cstr) {concat(cstr); return (*this);}
108+
String & operator += (char c) {concat(c); return (*this);}
109+
String & operator += (unsigned char num) {concat(num); return (*this);}
110+
String & operator += (int num) {concat(num); return (*this);}
111+
String & operator += (unsigned int num) {concat(num); return (*this);}
112+
String & operator += (long num) {concat(num); return (*this);}
113+
String & operator += (unsigned long num) {concat(num); return (*this);}
101114

102-
// concatenate
103115
friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);
104116
friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
105-
106-
// comparison
117+
friend StringSumHelper & operator + (const StringSumHelper &lhs, char c);
118+
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num);
119+
friend StringSumHelper & operator + (const StringSumHelper &lhs, int num);
120+
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
121+
friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
122+
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
123+
124+
// comparison (only works w/ Strings and "strings")
107125
operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
108-
109126
int compareTo(const String &s) const;
110127
unsigned char equals(const String &s) const;
111128
unsigned char equals(const char *cstr) const;
@@ -176,6 +193,12 @@ class StringSumHelper : public String
176193
public:
177194
StringSumHelper(const String &s) : String(s) {}
178195
StringSumHelper(const char *p) : String(p) {}
196+
StringSumHelper(char c) : String(c) {}
197+
StringSumHelper(unsigned char num) : String(num) {}
198+
StringSumHelper(int num) : String(num) {}
199+
StringSumHelper(unsigned int num) : String(num) {}
200+
StringSumHelper(long num) : String(num) {}
201+
StringSumHelper(unsigned long num) : String(num) {}
179202
};
180203

181204
#endif // __cplusplus

0 commit comments

Comments
 (0)