|
31 | 31 | #define OCT 8
|
32 | 32 | #define BIN 2
|
33 | 33 |
|
| 34 | +#define INLINE __attribute__ ((__always_inline__)) inline // undefined at end |
| 35 | + |
34 | 36 | class Print
|
35 | 37 | {
|
36 | 38 | private:
|
@@ -59,26 +61,52 @@ class Print
|
59 | 61 | size_t print(const String &);
|
60 | 62 | size_t print(const char[]);
|
61 | 63 | size_t print(char);
|
62 |
| - size_t print(unsigned char, int = DEC); |
63 |
| - size_t print(int, int = DEC); |
64 |
| - size_t print(unsigned int, int = DEC); |
65 |
| - size_t print(long, int = DEC); |
| 64 | + size_t print(signed long, int = DEC); |
66 | 65 | size_t print(unsigned long, int = DEC);
|
67 | 66 | size_t print(double, int = 2);
|
68 | 67 | size_t print(const Printable&);
|
69 |
| - |
70 |
| - size_t println(const __FlashStringHelper *); |
71 |
| - size_t println(const String &s); |
72 |
| - size_t println(const char[]); |
73 |
| - size_t println(char); |
74 |
| - size_t println(unsigned char, int = DEC); |
75 |
| - size_t println(int, int = DEC); |
76 |
| - size_t println(unsigned int, int = DEC); |
77 |
| - size_t println(long, int = DEC); |
78 |
| - size_t println(unsigned long, int = DEC); |
79 |
| - size_t println(double, int = 2); |
80 |
| - size_t println(const Printable&); |
| 68 | + |
| 69 | + INLINE size_t print( signed char n, int f = DEC) { return print(( signed long) n, f); } |
| 70 | + INLINE size_t print( signed short n, int f = DEC) { return print(( signed long) n, f); } |
| 71 | + INLINE size_t print( signed int n, int f = DEC) { return print(( signed long) n, f); } |
| 72 | + INLINE size_t print(unsigned char n, int f = DEC) { return print((unsigned long) n, f); } |
| 73 | + INLINE size_t print(unsigned short n, int f = DEC) { return print((unsigned long) n, f); } |
| 74 | + INLINE size_t print(unsigned int n, int f = DEC) { return print((unsigned long) n, f); } |
| 75 | + INLINE size_t print( float n, int f = 2 ) { return print(( double ) n, f); } |
| 76 | + |
81 | 77 | size_t println(void);
|
| 78 | + |
| 79 | + #if __cplusplus >= 201103L |
| 80 | + template<typename ...Ts> INLINE size_t println(const Ts &...args) { size_t t = print(args...); return t + println(); } |
| 81 | + #else |
| 82 | + template<typename T> INLINE size_t println(const T &arg) { size_t t = print(arg); return t + println(); } |
| 83 | + template<typename T> INLINE size_t println(const T &n, int f) { size_t t = print(n, f); return t + println(); } |
| 84 | + #endif // __cplusplus >= 201103L |
| 85 | + |
| 86 | + |
| 87 | + /** Variadic methods **/ |
| 88 | + #if __cplusplus >= 201103L |
| 89 | + // Ensure there are at least two parameters to avoid infinite recursion. |
| 90 | + template<typename T, typename T2, typename ...Ts> |
| 91 | + INLINE size_t print(const T &arg, const T2 &arg2, const Ts &...args) { |
| 92 | + size_t t = print(arg); |
| 93 | + return t + print(arg2, args...); |
| 94 | + } |
| 95 | + // Some methods take an extra int parameter. If so, use these templates. |
| 96 | + // In a future, it would be nice to make the base/precision a special type. |
| 97 | + template<typename ...Ts> INLINE size_t print( signed char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 98 | + template<typename ...Ts> INLINE size_t print( signed short n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 99 | + template<typename ...Ts> INLINE size_t print( signed int n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 100 | + template<typename ...Ts> INLINE size_t print( signed long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 101 | + template<typename ...Ts> INLINE size_t print(unsigned char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 102 | + template<typename ...Ts> INLINE size_t print(unsigned short n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 103 | + template<typename ...Ts> INLINE size_t print(unsigned int n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 104 | + template<typename ...Ts> INLINE size_t print(unsigned long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 105 | + template<typename ...Ts> INLINE size_t print( float n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 106 | + template<typename ...Ts> INLINE size_t print( double n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); } |
| 107 | + #endif // __cplusplus >= 201103L |
82 | 108 | };
|
83 | 109 |
|
| 110 | +#undef INLINE |
| 111 | + |
84 | 112 | #endif
|
0 commit comments