@@ -146,35 +146,39 @@ size_t Print::print(unsigned int n, int base) {
146
146
}
147
147
148
148
size_t Print::print (long n, int base) {
149
- if (base == 0 ) {
150
- return write (n);
151
- } else if (base == 10 ) {
152
- if (n < 0 ) {
153
- int t = print (' -' );
154
- n = -n;
155
- return printNumber (n, 10 ) + t;
156
- }
157
- return printNumber (n, 10 );
158
- } else {
159
- return printNumber (n, base);
149
+ int t = 0 ;
150
+ if (base == 10 && n < 0 ) {
151
+ t = print (' -' );
152
+ n = -n;
160
153
}
154
+ return printNumber (static_cast <unsigned long >(n), base) + t;
161
155
}
162
156
163
157
size_t Print::print (unsigned long n, int base) {
164
- if (base == 0 )
158
+ if (base == 0 ) {
165
159
return write (n);
166
- else
167
- return printNumber (n, base);
160
+ }
161
+ return printNumber (n, base);
168
162
}
169
163
170
- size_t Print::print (double n, int digits) {
171
- return printFloat (n, digits);
164
+ size_t Print::print (long long n, int base) {
165
+ int t = 0 ;
166
+ if (base == 10 && n < 0 ) {
167
+ t = print (' -' );
168
+ n = -n;
169
+ }
170
+ return printNumber (static_cast <unsigned long long >(n), base) + t;
172
171
}
173
172
174
- size_t Print::println (const __FlashStringHelper *ifsh) {
175
- size_t n = print (ifsh);
176
- n += println ();
177
- return n;
173
+ size_t Print::print (unsigned long long n, int base) {
174
+ if (base == 0 ) {
175
+ return write (n);
176
+ }
177
+ return printNumber (n, base);
178
+ }
179
+
180
+ size_t Print::print (double n, int digits) {
181
+ return printNumber (n, digits);
178
182
}
179
183
180
184
size_t Print::print (const Printable& x) {
@@ -185,89 +189,90 @@ size_t Print::println(void) {
185
189
return print (" \r\n " );
186
190
}
187
191
192
+ size_t Print::println (const __FlashStringHelper* ifsh) {
193
+ return _println<const __FlashStringHelper*>(ifsh);
194
+ }
195
+
188
196
size_t Print::println (const String &s) {
189
- size_t n = print (s);
190
- n += println ();
191
- return n;
197
+ return _println (s);
192
198
}
193
199
194
200
size_t Print::println (const char c[]) {
195
- size_t n = print (c);
196
- n += println ();
197
- return n;
201
+ return _println (c);
198
202
}
199
203
200
204
size_t Print::println (char c) {
201
- size_t n = print (c);
202
- n += println ();
203
- return n;
205
+ return _println (c);
204
206
}
205
207
206
208
size_t Print::println (unsigned char b, int base) {
207
- size_t n = print (b, base);
208
- n += println ();
209
- return n;
209
+ return _println (b, base);
210
210
}
211
211
212
212
size_t Print::println (int num, int base) {
213
- size_t n = print (num, base);
214
- n += println ();
215
- return n;
213
+ return _println (num, base);
216
214
}
217
215
218
216
size_t Print::println (unsigned int num, int base) {
219
- size_t n = print (num, base);
220
- n += println ();
221
- return n;
217
+ return _println (num, base);
222
218
}
223
219
224
220
size_t Print::println (long num, int base) {
225
- size_t n = print (num, base);
226
- n += println ();
227
- return n;
221
+ return _println (num, base);
228
222
}
229
223
230
224
size_t Print::println (unsigned long num, int base) {
231
- size_t n = print (num, base);
232
- n += println ();
233
- return n;
225
+ return _println (num, base);
226
+ }
227
+
228
+ size_t Print::println (long long num, int base) {
229
+ return _println (num, base);
230
+ }
231
+
232
+ size_t Print::println (unsigned long long num, int base) {
233
+ return _println (num, base);
234
234
}
235
235
236
236
size_t Print::println (double num, int digits) {
237
- size_t n = print (num, digits);
238
- n += println ();
239
- return n;
237
+ return _println (num, digits);
240
238
}
241
239
242
240
size_t Print::println (const Printable& x) {
243
- size_t n = print (x);
244
- n += println ();
245
- return n;
241
+ return _println<const Printable&>(x);
246
242
}
247
243
248
244
// Private Methods /////////////////////////////////////////////////////////////
249
245
250
- size_t Print::printNumber (unsigned long n, uint8_t base) {
251
- char buf[8 * sizeof (long ) + 1 ]; // Assumes 8-bit chars plus zero byte.
252
- char *str = &buf[sizeof (buf) - 1 ];
246
+ template <typename T, typename ... P> inline size_t Print::_println (T v, P... args)
247
+ {
248
+ size_t n = print (v, args...);
249
+ n += println ();
250
+ return n;
251
+ };
252
+
253
+ template <typename T> size_t Print::printNumber (T n, uint8_t base) {
254
+ char buf[8 * sizeof (n) + 1 ]; // Assumes 8-bit chars plus zero byte.
255
+ char * str = &buf[sizeof (buf) - 1 ];
253
256
254
257
*str = ' \0 ' ;
255
258
256
259
// prevent crash if called with base == 1
257
- if (base < 2 )
260
+ if (base < 2 ) {
258
261
base = 10 ;
262
+ }
259
263
260
264
do {
261
- unsigned long m = n;
265
+ auto m = n;
262
266
n /= base;
263
267
char c = m - base * n;
268
+
264
269
*--str = c < 10 ? c + ' 0' : c + ' A' - 10 ;
265
- } while (n);
270
+ } while (n);
266
271
267
272
return write (str);
268
273
}
269
274
270
- size_t Print::printFloat (double number, uint8_t digits) {
275
+ template <> size_t Print::printNumber (double number, uint8_t digits) {
271
276
char buf[40 ];
272
277
return write (dtostrf (number, 0 , digits, buf));
273
278
}
0 commit comments