@@ -57,45 +57,63 @@ class Print
57
57
return write ((const uint8_t *)buffer, size);
58
58
}
59
59
60
- size_t print (const __FlashStringHelper *);
61
- size_t print (const String &);
62
- size_t print ( signed long , int = DEC);
63
- size_t print (unsigned long , int = DEC);
64
- size_t print (double , int = 2 );
60
+ size_t doPrint (const __FlashStringHelper *);
61
+ size_t doPrint (const String &);
62
+ size_t doPrint ( signed long , int = DEC);
63
+ size_t doPrint (unsigned long , int = DEC);
64
+ size_t doPrint (double , int = 2 );
65
65
66
- _always_inline size_t print (const char str[]) { return write (str); }
67
- _always_inline size_t print (const char c) { return write (c); }
68
- _always_inline size_t print (const Printable &x) { return x.printTo (*this ); }
69
-
70
- _always_inline size_t print ( signed char n, int f = DEC) { return print (( signed long ) n, f); }
71
- _always_inline size_t print ( signed short n, int f = DEC) { return print (( signed long ) n, f); }
72
- _always_inline size_t print ( signed int n, int f = DEC) { return print (( signed long ) n, f); }
73
- _always_inline size_t print (unsigned char n, int f = DEC) { return print ((unsigned long ) n, f); }
74
- _always_inline size_t print (unsigned short n, int f = DEC) { return print ((unsigned long ) n, f); }
75
- _always_inline size_t print (unsigned int n, int f = DEC) { return print ((unsigned long ) n, f); }
76
- _always_inline size_t print ( float n, int f = 2 ) { return print (( double ) n, f); }
66
+ _always_inline size_t doPrint (const char str[]) { return write (str); }
67
+ _always_inline size_t doPrint (const char c) { return write (c); }
68
+ _always_inline size_t doPrint (const Printable &x) { return x.printTo (*this ); }
77
69
70
+ _always_inline size_t doPrint ( signed char n, int f = DEC) { return doPrint (( signed long ) n, f); }
71
+ _always_inline size_t doPrint ( signed short n, int f = DEC) { return doPrint (( signed long ) n, f); }
72
+ _always_inline size_t doPrint ( signed int n, int f = DEC) { return doPrint (( signed long ) n, f); }
73
+ _always_inline size_t doPrint (unsigned char n, int f = DEC) { return doPrint ((unsigned long ) n, f); }
74
+ _always_inline size_t doPrint (unsigned short n, int f = DEC) { return doPrint ((unsigned long ) n, f); }
75
+ _always_inline size_t doPrint (unsigned int n, int f = DEC) { return doPrint ((unsigned long ) n, f); }
76
+ _always_inline size_t doPrint ( float n, int f = 2 ) { return doPrint (( double ) n, f); }
77
+
78
+ template <typename Check, typename T>
79
+ struct check_type {
80
+ using type = T;
81
+ };
82
+ template <typename Check, typename T> using check_type_t = typename check_type<Check, T>::type;
83
+
84
+ template <typename T, typename F>
85
+ _always_inline auto doPrint (T v, F f )
86
+ -> check_type_t <decltype (f.printTo (this , v)), size_t > {
87
+ return f.printTo (this , v);
88
+ }
89
+
78
90
size_t println (void );
79
91
80
92
#if __cplusplus >= 201103L
81
93
template <typename ...Ts > _always_inline size_t println (const Ts &...args ) { size_t t = print (args...); return t + println (); }
82
94
#else
83
95
template <typename T> _always_inline size_t println (const T &arg) { size_t t = print (arg); return t + println (); }
84
- template <typename T> _always_inline size_t println (const T &n, int f ) { size_t t = print (n, f ); return t + println (); }
96
+ template <typename T, typename T2 > _always_inline size_t println (const T &arg1, const T2& arg2 ) { size_t t = print (arg1, arg2 ); return t + println (); }
85
97
#endif // __cplusplus >= 201103L
86
98
87
99
100
+ _always_inline size_t print () { return 0 ; }
101
+
88
102
/* * Variadic methods **/
89
103
#if __cplusplus >= 201103L // requires C++11
90
- // Ensure there are at least two parameters to avoid infinite recursion.
91
- // e.g. `StringSumHelper s; print(s)` may be treated as `print(s, ...)`
92
- // with `...` being the empty list, thus calling `print(s)` again.
93
- // (This is because print(StringSumHelper) isn't explicitly defined.)
104
+ template <typename T, typename ...Ts >
105
+ _always_inline size_t print (const T &arg, const Ts &...args ) {
106
+ size_t t = doPrint (arg);
107
+ return t + print (args...);
108
+ }
109
+
94
110
template <typename T, typename T2, typename ...Ts >
95
- _always_inline size_t print (const T &arg, const T2 &arg2, const Ts &...args ) {
96
- size_t t = print (arg);
97
- return t + print (arg2, args...);
111
+ _always_inline auto print (const T &arg, const T2 &arg2, const Ts &...args )
112
+ -> check_type_t <decltype (doPrint (arg, arg2)), size_t > {
113
+ size_t t = doPrint (arg, arg2);
114
+ return t + print (args...);
98
115
}
116
+ /*
99
117
// Some methods take an extra int parameter. If so, use these templates.
100
118
// In a future, it would be nice to make the base/precision a special type.
101
119
template<typename ...Ts> _always_inline size_t print( signed char n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); }
@@ -108,6 +126,10 @@ class Print
108
126
template<typename ...Ts> _always_inline size_t print(unsigned long n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); }
109
127
template<typename ...Ts> _always_inline size_t print( float n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); }
110
128
template<typename ...Ts> _always_inline size_t print( double n, int f, const Ts &...args) { size_t t = print(n, f); return t + print(args...); }
129
+ */
130
+ #else
131
+ template <typename T> _always_inline size_t print (const T &arg) { return doPrint (arg); }
132
+ template <typename T, typename T2> _always_inline size_t print (const T &arg1, const T2& arg2) { return doPrint (arg1, arg2); }
111
133
#endif // __cplusplus >= 201103L
112
134
};
113
135
0 commit comments