diff --git a/hardware/arduino/avr/cores/arduino/Print.cpp b/hardware/arduino/avr/cores/arduino/Print.cpp index 1e4c99a6552..3f9534c0ea6 100644 --- a/hardware/arduino/avr/cores/arduino/Print.cpp +++ b/hardware/arduino/avr/cores/arduino/Print.cpp @@ -59,32 +59,7 @@ size_t Print::print(const String &s) return write(s.c_str(), s.length()); } -size_t Print::print(const char str[]) -{ - return write(str); -} - -size_t Print::print(char c) -{ - return write(c); -} - -size_t Print::print(unsigned char b, int base) -{ - return print((unsigned long) b, base); -} - -size_t Print::print(int n, int base) -{ - return print((long) n, base); -} - -size_t Print::print(unsigned int n, int base) -{ - return print((unsigned long) n, base); -} - -size_t Print::print(long n, int base) +size_t Print::print(signed long n, int base) { if (base == 0) { return write(n); @@ -111,93 +86,11 @@ size_t Print::print(double n, int digits) return printFloat(n, digits); } -size_t Print::println(const __FlashStringHelper *ifsh) -{ - size_t n = print(ifsh); - n += println(); - return n; -} - -size_t Print::print(const Printable& x) -{ - return x.printTo(*this); -} - size_t Print::println(void) { return write("\r\n"); } -size_t Print::println(const String &s) -{ - size_t n = print(s); - n += println(); - return n; -} - -size_t Print::println(const char c[]) -{ - size_t n = print(c); - n += println(); - return n; -} - -size_t Print::println(char c) -{ - size_t n = print(c); - n += println(); - return n; -} - -size_t Print::println(unsigned char b, int base) -{ - size_t n = print(b, base); - n += println(); - return n; -} - -size_t Print::println(int num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(unsigned int num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(long num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(unsigned long num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(double num, int digits) -{ - size_t n = print(num, digits); - n += println(); - return n; -} - -size_t Print::println(const Printable& x) -{ - size_t n = print(x); - n += println(); - return n; -} - // Private Methods ///////////////////////////////////////////////////////////// size_t Print::printNumber(unsigned long n, uint8_t base) diff --git a/hardware/arduino/avr/cores/arduino/Print.h b/hardware/arduino/avr/cores/arduino/Print.h index 7b53aa4d17e..172f599a3b3 100644 --- a/hardware/arduino/avr/cores/arduino/Print.h +++ b/hardware/arduino/avr/cores/arduino/Print.h @@ -31,6 +31,8 @@ #define OCT 8 #define BIN 2 +#define _always_inline __attribute__ ((__always_inline__)) // undefined at end + class Print { private: @@ -57,28 +59,58 @@ class Print size_t print(const __FlashStringHelper *); size_t print(const String &); - size_t print(const char[]); - size_t print(char); - size_t print(unsigned char, int = DEC); - size_t print(int, int = DEC); - size_t print(unsigned int, int = DEC); - size_t print(long, int = DEC); + size_t print( signed long, int = DEC); size_t print(unsigned long, int = DEC); size_t print(double, int = 2); - size_t print(const Printable&); - - size_t println(const __FlashStringHelper *); - size_t println(const String &s); - size_t println(const char[]); - size_t println(char); - size_t println(unsigned char, int = DEC); - size_t println(int, int = DEC); - size_t println(unsigned int, int = DEC); - size_t println(long, int = DEC); - size_t println(unsigned long, int = DEC); - size_t println(double, int = 2); - size_t println(const Printable&); + + _always_inline size_t print(const char str[]) { return write(str); } + _always_inline size_t print(const char c) { return write(c); } + _always_inline size_t print(const Printable &x) { return x.printTo(*this); } + + _always_inline size_t print( signed char n, int f = DEC) { return print(( signed long) n, f); } + _always_inline size_t print( signed short n, int f = DEC) { return print(( signed long) n, f); } + _always_inline size_t print( signed int n, int f = DEC) { return print(( signed long) n, f); } + _always_inline size_t print(unsigned char n, int f = DEC) { return print((unsigned long) n, f); } + _always_inline size_t print(unsigned short n, int f = DEC) { return print((unsigned long) n, f); } + _always_inline size_t print(unsigned int n, int f = DEC) { return print((unsigned long) n, f); } + _always_inline size_t print( float n, int f = 2 ) { return print(( double ) n, f); } + size_t println(void); + +#if __cplusplus >= 201103L + template _always_inline size_t println(const Ts &...args) { size_t t = print(args...); return t + println(); } +#else + template _always_inline size_t println(const T &arg) { size_t t = print(arg); return t + println(); } + template _always_inline size_t println(const T &n, int f) { size_t t = print(n, f); return t + println(); } +#endif // __cplusplus >= 201103L + + + /** Variadic methods **/ +#if __cplusplus >= 201103L // requires C++11 + // Ensure there are at least two parameters to avoid infinite recursion. + // e.g. `StringSumHelper s; print(s)` may be treated as `print(s, ...)` + // with `...` being the empty list, thus calling `print(s)` again. + // (This is because print(StringSumHelper) isn't explicitly defined.) + template + _always_inline size_t print(const T &arg, const T2 &arg2, const Ts &...args) { + size_t t = print(arg); + return t + print(arg2, args...); + } + // Some methods take an extra int parameter. If so, use these templates. + // In a future, it would be nice to make the base/precision a special type. + template _always_inline size_t print( signed char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( signed short n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( signed int n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( signed long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned short n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned int n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( float n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( double n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } +#endif // __cplusplus >= 201103L }; +#undef _always_inline + #endif diff --git a/hardware/arduino/sam/cores/arduino/Print.cpp b/hardware/arduino/sam/cores/arduino/Print.cpp index 881722e8962..3df7ed049cd 100644 --- a/hardware/arduino/sam/cores/arduino/Print.cpp +++ b/hardware/arduino/sam/cores/arduino/Print.cpp @@ -51,32 +51,7 @@ size_t Print::print(const String &s) return write(s.c_str(), s.length()); } -size_t Print::print(const char str[]) -{ - return write(str); -} - -size_t Print::print(char c) -{ - return write(c); -} - -size_t Print::print(unsigned char b, int base) -{ - return print((unsigned long) b, base); -} - -size_t Print::print(int n, int base) -{ - return print((long) n, base); -} - -size_t Print::print(unsigned int n, int base) -{ - return print((unsigned long) n, base); -} - -size_t Print::print(long n, int base) +size_t Print::print(signed long n, int base) { if (base == 0) { return write(n); @@ -103,93 +78,11 @@ size_t Print::print(double n, int digits) return printFloat(n, digits); } -size_t Print::println(const __FlashStringHelper *ifsh) -{ - size_t n = print(ifsh); - n += println(); - return n; -} - -size_t Print::print(const Printable& x) -{ - return x.printTo(*this); -} - size_t Print::println(void) { return write("\r\n"); } -size_t Print::println(const String &s) -{ - size_t n = print(s); - n += println(); - return n; -} - -size_t Print::println(const char c[]) -{ - size_t n = print(c); - n += println(); - return n; -} - -size_t Print::println(char c) -{ - size_t n = print(c); - n += println(); - return n; -} - -size_t Print::println(unsigned char b, int base) -{ - size_t n = print(b, base); - n += println(); - return n; -} - -size_t Print::println(int num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(unsigned int num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(long num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(unsigned long num, int base) -{ - size_t n = print(num, base); - n += println(); - return n; -} - -size_t Print::println(double num, int digits) -{ - size_t n = print(num, digits); - n += println(); - return n; -} - -size_t Print::println(const Printable& x) -{ - size_t n = print(x); - n += println(); - return n; -} - // Private Methods ///////////////////////////////////////////////////////////// size_t Print::printNumber(unsigned long n, uint8_t base) diff --git a/hardware/arduino/sam/cores/arduino/Print.h b/hardware/arduino/sam/cores/arduino/Print.h index 7b53aa4d17e..172f599a3b3 100644 --- a/hardware/arduino/sam/cores/arduino/Print.h +++ b/hardware/arduino/sam/cores/arduino/Print.h @@ -31,6 +31,8 @@ #define OCT 8 #define BIN 2 +#define _always_inline __attribute__ ((__always_inline__)) // undefined at end + class Print { private: @@ -57,28 +59,58 @@ class Print size_t print(const __FlashStringHelper *); size_t print(const String &); - size_t print(const char[]); - size_t print(char); - size_t print(unsigned char, int = DEC); - size_t print(int, int = DEC); - size_t print(unsigned int, int = DEC); - size_t print(long, int = DEC); + size_t print( signed long, int = DEC); size_t print(unsigned long, int = DEC); size_t print(double, int = 2); - size_t print(const Printable&); - - size_t println(const __FlashStringHelper *); - size_t println(const String &s); - size_t println(const char[]); - size_t println(char); - size_t println(unsigned char, int = DEC); - size_t println(int, int = DEC); - size_t println(unsigned int, int = DEC); - size_t println(long, int = DEC); - size_t println(unsigned long, int = DEC); - size_t println(double, int = 2); - size_t println(const Printable&); + + _always_inline size_t print(const char str[]) { return write(str); } + _always_inline size_t print(const char c) { return write(c); } + _always_inline size_t print(const Printable &x) { return x.printTo(*this); } + + _always_inline size_t print( signed char n, int f = DEC) { return print(( signed long) n, f); } + _always_inline size_t print( signed short n, int f = DEC) { return print(( signed long) n, f); } + _always_inline size_t print( signed int n, int f = DEC) { return print(( signed long) n, f); } + _always_inline size_t print(unsigned char n, int f = DEC) { return print((unsigned long) n, f); } + _always_inline size_t print(unsigned short n, int f = DEC) { return print((unsigned long) n, f); } + _always_inline size_t print(unsigned int n, int f = DEC) { return print((unsigned long) n, f); } + _always_inline size_t print( float n, int f = 2 ) { return print(( double ) n, f); } + size_t println(void); + +#if __cplusplus >= 201103L + template _always_inline size_t println(const Ts &...args) { size_t t = print(args...); return t + println(); } +#else + template _always_inline size_t println(const T &arg) { size_t t = print(arg); return t + println(); } + template _always_inline size_t println(const T &n, int f) { size_t t = print(n, f); return t + println(); } +#endif // __cplusplus >= 201103L + + + /** Variadic methods **/ +#if __cplusplus >= 201103L // requires C++11 + // Ensure there are at least two parameters to avoid infinite recursion. + // e.g. `StringSumHelper s; print(s)` may be treated as `print(s, ...)` + // with `...` being the empty list, thus calling `print(s)` again. + // (This is because print(StringSumHelper) isn't explicitly defined.) + template + _always_inline size_t print(const T &arg, const T2 &arg2, const Ts &...args) { + size_t t = print(arg); + return t + print(arg2, args...); + } + // Some methods take an extra int parameter. If so, use these templates. + // In a future, it would be nice to make the base/precision a special type. + template _always_inline size_t print( signed char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( signed short n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( signed int n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( signed long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned short n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned int n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print(unsigned long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( float n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } + template _always_inline size_t print( double n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } +#endif // __cplusplus >= 201103L }; +#undef _always_inline + #endif