Fixes implementation of __FlashStringHelper (#183)
Previous __FlashStringHelper implementation was defines as a char which brought problem in case the method with char* parameter used overloading with __FlashStringHelper* parameter (they was identical). Now __FlashStringHelper is defined as a class and all casts between char* and __FlashStringHelper* are made with reinterpret_cast sugar.
This commit is contained in:
parent
cea41d965a
commit
67128fcb2c
@ -68,19 +68,12 @@ size_t Print::printf(const char *format, ...)
|
|||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
size_t Print::print(const __FlashStringHelper *ifsh) {
|
|
||||||
PGM_P p = reinterpret_cast<PGM_P>(ifsh);
|
|
||||||
|
|
||||||
size_t n = 0;
|
size_t Print::print(const __FlashStringHelper *ifsh)
|
||||||
while (1) {
|
{
|
||||||
uint8_t c = pgm_read_byte(p++);
|
return print(reinterpret_cast<const char *>(ifsh));
|
||||||
if (c == 0) break;
|
|
||||||
n += write(c);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
size_t Print::print(const String &s)
|
size_t Print::print(const String &s)
|
||||||
{
|
{
|
||||||
return write(s.c_str(), s.length());
|
return write(s.c_str(), s.length());
|
||||||
@ -140,14 +133,14 @@ size_t Print::print(double n, int digits)
|
|||||||
{
|
{
|
||||||
return printFloat(n, digits);
|
return printFloat(n, digits);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
size_t Print::println(const __FlashStringHelper *ifsh)
|
size_t Print::println(const __FlashStringHelper *ifsh)
|
||||||
{
|
{
|
||||||
size_t n = print(ifsh);
|
size_t n = print(ifsh);
|
||||||
n += println();
|
n += println();
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
size_t Print::print(const Printable& x)
|
size_t Print::print(const Printable& x)
|
||||||
{
|
{
|
||||||
return x.printTo(*this);
|
return x.printTo(*this);
|
||||||
|
@ -72,7 +72,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));
|
size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));
|
||||||
//size_t print(const __FlashStringHelper *);
|
size_t print(const __FlashStringHelper *);
|
||||||
size_t print(const String &);
|
size_t print(const String &);
|
||||||
size_t print(const char[]);
|
size_t print(const char[]);
|
||||||
size_t print(char);
|
size_t print(char);
|
||||||
@ -85,7 +85,7 @@ public:
|
|||||||
size_t print(const Printable&);
|
size_t print(const Printable&);
|
||||||
size_t print(struct tm * timeinfo, const char * format = NULL);
|
size_t print(struct tm * timeinfo, const char * format = NULL);
|
||||||
|
|
||||||
//size_t println(const __FlashStringHelper *);
|
size_t println(const __FlashStringHelper *);
|
||||||
size_t println(const String &s);
|
size_t println(const String &s);
|
||||||
size_t println(const char[]);
|
size_t println(const char[]);
|
||||||
size_t println(char);
|
size_t println(char);
|
||||||
|
@ -44,12 +44,7 @@ String::String(const String &value)
|
|||||||
init();
|
init();
|
||||||
*this = value;
|
*this = value;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
String::String(const __FlashStringHelper *pstr) {
|
|
||||||
init();
|
|
||||||
*this = pstr; // see operator =
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||||
String::String(String &&rval)
|
String::String(String &&rval)
|
||||||
{
|
{
|
||||||
@ -200,17 +195,12 @@ String & String::copy(const char *cstr, unsigned int length)
|
|||||||
strcpy(buffer, cstr);
|
strcpy(buffer, cstr);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
String & String::copy(const __FlashStringHelper *pstr, unsigned int length) {
|
String & String::copy(const __FlashStringHelper *pstr, unsigned int length)
|
||||||
if (!reserve(length)) {
|
{
|
||||||
invalidate();
|
return copy(reinterpret_cast<const char *>(pstr), length);
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
len = length;
|
|
||||||
strcpy_P(buffer, (PGM_P)pstr);
|
|
||||||
return *this;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||||
void String::move(String &rhs)
|
void String::move(String &rhs)
|
||||||
{
|
{
|
||||||
@ -276,7 +266,7 @@ String & String::operator =(const char *cstr)
|
|||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
String & String::operator = (const __FlashStringHelper *pstr)
|
String & String::operator = (const __FlashStringHelper *pstr)
|
||||||
{
|
{
|
||||||
if (pstr) copy(pstr, strlen_P((PGM_P)pstr));
|
if (pstr) copy(pstr, strlen_P((PGM_P)pstr));
|
||||||
@ -284,7 +274,7 @@ String & String::operator = (const __FlashStringHelper *pstr)
|
|||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// /*********************************************/
|
// /*********************************************/
|
||||||
// /* concat */
|
// /* concat */
|
||||||
// /*********************************************/
|
// /*********************************************/
|
||||||
@ -375,18 +365,12 @@ unsigned char String::concat(double num)
|
|||||||
char* string = dtostrf(num, 4, 2, buf);
|
char* string = dtostrf(num, 4, 2, buf);
|
||||||
return concat(string, strlen(string));
|
return concat(string, strlen(string));
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
unsigned char String::concat(const __FlashStringHelper * str) {
|
unsigned char String::concat(const __FlashStringHelper * str)
|
||||||
if (!str) return 0;
|
{
|
||||||
int length = strlen_P((PGM_P)str);
|
return concat(reinterpret_cast<const char *>(str));
|
||||||
if (length == 0) return 1;
|
|
||||||
unsigned int newlen = len + length;
|
|
||||||
if (!reserve(newlen)) return 0;
|
|
||||||
strcpy_P(buffer + len, (PGM_P)str);
|
|
||||||
len = newlen;
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
/* Concatenate */
|
/* Concatenate */
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
@ -480,14 +464,14 @@ StringSumHelper & operator +(const StringSumHelper &lhs, double num)
|
|||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs)
|
StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs)
|
||||||
{
|
{
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
||||||
if (!a.concat(rhs)) a.invalidate();
|
if (!a.concat(rhs)) a.invalidate();
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// /*********************************************/
|
// /*********************************************/
|
||||||
// /* Comparison */
|
// /* Comparison */
|
||||||
// /*********************************************/
|
// /*********************************************/
|
||||||
|
@ -34,7 +34,8 @@ class StringSumHelper;
|
|||||||
|
|
||||||
// an abstract class used as a means to proide a unique pointer type
|
// an abstract class used as a means to proide a unique pointer type
|
||||||
// but really has no body
|
// but really has no body
|
||||||
//class __FlashStringHelper;
|
class __FlashStringHelper;
|
||||||
|
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
|
||||||
|
|
||||||
// The string class
|
// The string class
|
||||||
class String
|
class String
|
||||||
@ -55,7 +56,7 @@ public:
|
|||||||
// be false).
|
// be false).
|
||||||
String(const char *cstr = "");
|
String(const char *cstr = "");
|
||||||
String(const String &str);
|
String(const String &str);
|
||||||
//String(const __FlashStringHelper *str);
|
String(const __FlashStringHelper *str) : String(reinterpret_cast<const char *>(str)) {};
|
||||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||||
String(String &&rval);
|
String(String &&rval);
|
||||||
String(StringSumHelper &&rval);
|
String(StringSumHelper &&rval);
|
||||||
@ -89,7 +90,7 @@ public:
|
|||||||
// marked as invalid ("if (s)" will be false).
|
// marked as invalid ("if (s)" will be false).
|
||||||
String & operator =(const String &rhs);
|
String & operator =(const String &rhs);
|
||||||
String & operator =(const char *cstr);
|
String & operator =(const char *cstr);
|
||||||
//String & operator = (const __FlashStringHelper *str);
|
String & operator = (const __FlashStringHelper *str);
|
||||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||||
String & operator =(String &&rval);
|
String & operator =(String &&rval);
|
||||||
String & operator =(StringSumHelper &&rval);
|
String & operator =(StringSumHelper &&rval);
|
||||||
@ -110,7 +111,7 @@ public:
|
|||||||
unsigned char concat(unsigned long num);
|
unsigned char concat(unsigned long num);
|
||||||
unsigned char concat(float num);
|
unsigned char concat(float num);
|
||||||
unsigned char concat(double num);
|
unsigned char concat(double num);
|
||||||
//unsigned char concat(const __FlashStringHelper * str);
|
unsigned char concat(const __FlashStringHelper * str);
|
||||||
|
|
||||||
// if there's not enough memory for the concatenated value, the string
|
// if there's not enough memory for the concatenated value, the string
|
||||||
// will be left unchanged (but this isn't signalled in any way)
|
// will be left unchanged (but this isn't signalled in any way)
|
||||||
@ -164,10 +165,11 @@ public:
|
|||||||
concat(num);
|
concat(num);
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
//String & operator += (const __FlashStringHelper *str){
|
String & operator += (const __FlashStringHelper *str)
|
||||||
// concat(str);
|
{
|
||||||
// return (*this);
|
concat(str);
|
||||||
//}
|
return (*this);
|
||||||
|
}
|
||||||
|
|
||||||
friend StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs);
|
friend StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs);
|
||||||
friend StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr);
|
friend StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr);
|
||||||
@ -179,7 +181,7 @@ public:
|
|||||||
friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num);
|
friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num);
|
||||||
friend StringSumHelper & operator +(const StringSumHelper &lhs, float num);
|
friend StringSumHelper & operator +(const StringSumHelper &lhs, float num);
|
||||||
friend StringSumHelper & operator +(const StringSumHelper &lhs, double num);
|
friend StringSumHelper & operator +(const StringSumHelper &lhs, double num);
|
||||||
//friend StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs);
|
friend StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs);
|
||||||
|
|
||||||
// comparison (only works w/ Strings and "strings")
|
// comparison (only works w/ Strings and "strings")
|
||||||
operator StringIfHelperType() const
|
operator StringIfHelperType() const
|
||||||
@ -270,7 +272,7 @@ protected:
|
|||||||
|
|
||||||
// copy and move
|
// copy and move
|
||||||
String & copy(const char *cstr, unsigned int length);
|
String & copy(const char *cstr, unsigned int length);
|
||||||
//String & copy(const __FlashStringHelper *pstr, unsigned int length);
|
String & copy(const __FlashStringHelper *pstr, unsigned int length);
|
||||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||||
void move(String &rhs);
|
void move(String &rhs);
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,8 +29,6 @@ typedef unsigned short prog_uint16_t;
|
|||||||
typedef long prog_int32_t;
|
typedef long prog_int32_t;
|
||||||
typedef unsigned long prog_uint32_t;
|
typedef unsigned long prog_uint32_t;
|
||||||
|
|
||||||
typedef char __FlashStringHelper;
|
|
||||||
|
|
||||||
#define SIZE_IRRELEVANT 0x7fffffff
|
#define SIZE_IRRELEVANT 0x7fffffff
|
||||||
|
|
||||||
#define PROGMEM
|
#define PROGMEM
|
||||||
@ -38,7 +36,6 @@ typedef char __FlashStringHelper;
|
|||||||
#define PGM_VOID_P const void *
|
#define PGM_VOID_P const void *
|
||||||
#define FPSTR(p) ((const char *)(p))
|
#define FPSTR(p) ((const char *)(p))
|
||||||
#define PSTR(s) (s)
|
#define PSTR(s) (s)
|
||||||
#define F(s) (s)
|
|
||||||
#define _SFR_BYTE(n) (n)
|
#define _SFR_BYTE(n) (n)
|
||||||
|
|
||||||
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
|
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
|
||||||
|
Loading…
Reference in New Issue
Block a user