@@ -146,35 +146,39 @@ size_t Print::print(unsigned int n, int base) {
146146}
147147
148148size_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;
160153 }
154+ return printNumber (static_cast <unsigned long >(n), base) + t;
161155}
162156
163157size_t Print::print (unsigned long n, int base) {
164- if (base == 0 )
158+ if (base == 0 ) {
165159 return write (n);
166- else
167- return printNumber (n, base);
160+ }
161+ return printNumber (n, base);
168162}
169163
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;
172171}
173172
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);
178182}
179183
180184size_t Print::print (const Printable& x) {
@@ -185,89 +189,90 @@ size_t Print::println(void) {
185189 return print (" \r\n " );
186190}
187191
192+ size_t Print::println (const __FlashStringHelper* ifsh) {
193+ return _println<const __FlashStringHelper*>(ifsh);
194+ }
195+
188196size_t Print::println (const String &s) {
189- size_t n = print (s);
190- n += println ();
191- return n;
197+ return _println (s);
192198}
193199
194200size_t Print::println (const char c[]) {
195- size_t n = print (c);
196- n += println ();
197- return n;
201+ return _println (c);
198202}
199203
200204size_t Print::println (char c) {
201- size_t n = print (c);
202- n += println ();
203- return n;
205+ return _println (c);
204206}
205207
206208size_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);
210210}
211211
212212size_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);
216214}
217215
218216size_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);
222218}
223219
224220size_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);
228222}
229223
230224size_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);
234234}
235235
236236size_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);
240238}
241239
242240size_t Print::println (const Printable& x) {
243- size_t n = print (x);
244- n += println ();
245- return n;
241+ return _println<const Printable&>(x);
246242}
247243
248244// Private Methods /////////////////////////////////////////////////////////////
249245
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 ];
253256
254257 *str = ' \0 ' ;
255258
256259 // prevent crash if called with base == 1
257- if (base < 2 )
260+ if (base < 2 ) {
258261 base = 10 ;
262+ }
259263
260264 do {
261- unsigned long m = n;
265+ auto m = n;
262266 n /= base;
263267 char c = m - base * n;
268+
264269 *--str = c < 10 ? c + ' 0' : c + ' A' - 10 ;
265- } while (n);
270+ } while (n);
266271
267272 return write (str);
268273}
269274
270- size_t Print::printFloat (double number, uint8_t digits) {
275+ template <> size_t Print::printNumber (double number, uint8_t digits) {
271276 char buf[40 ];
272277 return write (dtostrf (number, 0 , digits, buf));
273278}
0 commit comments