3131#include < ctype.h>
3232
3333
34- // an abstract class used as a means to proide a unique pointer type
35- // but really has no body
34+ // A pure abstract class forward used as a means to proide a unique pointer type
35+ // but really is never defined.
3636class __FlashStringHelper ;
37- #define FPSTR (pstr_pointer ) (reinterpret_cast < const __FlashStringHelper *>( pstr_pointer) )
38- #define F (string_literal ) (FPSTR(PSTR( string_literal)) )
37+ #define FPSTR (pstr_pointer ) (pstr_pointer)
38+ #define F (string_literal ) (string_literal)
3939
4040// An inherited class for holding the result of a concatenation. These
4141// result objects are assumed to be writable by subsequent concatenations.
@@ -59,10 +59,10 @@ class String {
5959 String (const char *cstr = " " );
6060 String (const char *cstr, unsigned int length);
6161#ifdef __GXX_EXPERIMENTAL_CXX0X__
62- String (const uint8_t *cstr, unsigned int length) : String(( const char *) cstr, length) {}
62+ String (const uint8_t *cstr, unsigned int length) : String(reinterpret_cast < const char *>( cstr) , length) {}
6363#endif
6464 String (const String &str);
65- String (const __FlashStringHelper *str);
65+ String (const __FlashStringHelper *str) : String( reinterpret_cast < const char *>(str)) {}
6666#ifdef __GXX_EXPERIMENTAL_CXX0X__
6767 String (String &&rval);
6868 String (StringSumHelper &&rval);
@@ -103,7 +103,7 @@ class String {
103103 // marked as invalid ("if (s)" will be false).
104104 String & operator =(const String &rhs);
105105 String & operator =(const char *cstr);
106- String & operator = (const __FlashStringHelper *str);
106+ String & operator = (const __FlashStringHelper *str) { return * this = reinterpret_cast < const char *>(str);}
107107#ifdef __GXX_EXPERIMENTAL_CXX0X__
108108 String & operator =(String &&rval);
109109 String & operator =(StringSumHelper &&rval);
@@ -117,7 +117,7 @@ class String {
117117 bool concat (const String &str);
118118 bool concat (const char *cstr);
119119 bool concat (const char *cstr, unsigned int length);
120- bool concat (const uint8_t *cstr, unsigned int length) {return concat (( const char *) cstr, length);}
120+ bool concat (const uint8_t *cstr, unsigned int length) {return concat (reinterpret_cast < const char *>( cstr) , length);}
121121 bool concat (char c);
122122 bool concat (unsigned char c);
123123 bool concat (int num);
@@ -128,7 +128,7 @@ class String {
128128 bool concat (double num);
129129 bool concat (long long num);
130130 bool concat (unsigned long long num);
131- bool concat (const __FlashStringHelper * str);
131+ bool concat (const __FlashStringHelper * str) { return concat ( reinterpret_cast < const char *>(str));}
132132
133133 // if there's not enough memory for the concatenated value, the string
134134 // will be left unchanged (but this isn't signalled in any way)
@@ -180,10 +180,7 @@ class String {
180180 concat (num);
181181 return (*this );
182182 }
183- String & operator += (const __FlashStringHelper *str){
184- concat (str);
185- return (*this );
186- }
183+ String & operator += (const __FlashStringHelper *str) {return *this += reinterpret_cast <const char *>(str);}
187184
188185 friend StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs);
189186 friend StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr);
@@ -195,7 +192,6 @@ class String {
195192 friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num);
196193 friend StringSumHelper & operator +(const StringSumHelper &lhs, float num);
197194 friend StringSumHelper & operator +(const StringSumHelper &lhs, double num);
198- friend StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs);
199195 friend StringSumHelper & operator +(const StringSumHelper &lhs, long long num);
200196 friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long long num);
201197
@@ -229,15 +225,15 @@ class String {
229225 return this ->startsWith (String (prefix));
230226 }
231227 bool startsWith (const __FlashStringHelper *prefix) const {
232- return this ->startsWith (String (prefix));
228+ return this ->startsWith (reinterpret_cast < const char *> (prefix));
233229 }
234230 bool startsWith (const String &prefix, unsigned int offset) const ;
235231 bool endsWith (const String &suffix) const ;
236232 bool endsWith (const char *suffix) const {
237233 return this ->endsWith (String (suffix));
238234 }
239235 bool endsWith (const __FlashStringHelper * suffix) const {
240- return this ->endsWith (String (suffix));
236+ return this ->endsWith (reinterpret_cast < const char *> (suffix));
241237 }
242238
243239 // character access
@@ -276,16 +272,16 @@ class String {
276272 this ->replace (String (find), replace);
277273 }
278274 void replace (const __FlashStringHelper *find, const String &replace) {
279- this ->replace (String (find), replace);
275+ this ->replace (reinterpret_cast < const char *> (find), replace);
280276 }
281277 void replace (const char *find, const char *replace) {
282278 this ->replace (String (find), String (replace));
283279 }
284280 void replace (const __FlashStringHelper *find, const char *replace) {
285- this ->replace (String (find), String (replace));
281+ this ->replace (reinterpret_cast < const char *> (find), String (replace));
286282 }
287283 void replace (const __FlashStringHelper *find, const __FlashStringHelper *replace) {
288- this ->replace (String (find), String (replace));
284+ this ->replace (reinterpret_cast < const char *> (find), reinterpret_cast < const char *> (replace));
289285 }
290286 void remove (unsigned int index);
291287 void remove (unsigned int index, unsigned int count);
@@ -340,7 +336,7 @@ class String {
340336 inline void setCapacity (int cap) { if (!isSSO ()) ptr.cap = cap; }
341337 inline void setBuffer (char *buff) { if (!isSSO ()) ptr.buff = buff; }
342338 // Buffer accessor functions
343- inline const char *buffer () const { return ( const char *) (isSSO () ? sso.buff : ptr.buff ); }
339+ inline const char *buffer () const { return reinterpret_cast < const char *> (isSSO () ? sso.buff : ptr.buff ); }
344340 inline char *wbuffer () const { return isSSO () ? const_cast <char *>(sso.buff ) : ptr.buff ; } // Writable version of buffer
345341
346342 protected:
@@ -350,7 +346,9 @@ class String {
350346
351347 // copy and move
352348 String & copy (const char *cstr, unsigned int length);
353- String & copy (const __FlashStringHelper *pstr, unsigned int length);
349+ String & copy (const __FlashStringHelper *pstr, unsigned int length) {
350+ return copy (reinterpret_cast <const char *>(pstr), length);
351+ }
354352#ifdef __GXX_EXPERIMENTAL_CXX0X__
355353 void move (String &rhs);
356354#endif
@@ -395,6 +393,10 @@ class StringSumHelper: public String {
395393 String (num) {
396394 }
397395};
396+
397+ inline StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs) {
398+ return lhs + reinterpret_cast <const char *>(rhs);
399+ }
398400
399401extern const String emptyString;
400402
0 commit comments