Skip to content

Commit 96243d7

Browse files
authored
Merge pull request #7040 from dok-net/print64bit
Extend Print class for 64bit integers.
2 parents f542175 + 6f57c22 commit 96243d7

File tree

2 files changed

+73
-60
lines changed

2 files changed

+73
-60
lines changed

cores/esp8266/Print.cpp

+62-57
Original file line numberDiff line numberDiff line change
@@ -146,35 +146,39 @@ size_t Print::print(unsigned int n, int base) {
146146
}
147147

148148
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;
160153
}
154+
return printNumber(static_cast<unsigned long>(n), base) + t;
161155
}
162156

163157
size_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

180184
size_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+
188196
size_t Print::println(const String &s) {
189-
size_t n = print(s);
190-
n += println();
191-
return n;
197+
return _println(s);
192198
}
193199

194200
size_t Print::println(const char c[]) {
195-
size_t n = print(c);
196-
n += println();
197-
return n;
201+
return _println(c);
198202
}
199203

200204
size_t Print::println(char c) {
201-
size_t n = print(c);
202-
n += println();
203-
return n;
205+
return _println(c);
204206
}
205207

206208
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);
210210
}
211211

212212
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);
216214
}
217215

218216
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);
222218
}
223219

224220
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);
228222
}
229223

230224
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);
234234
}
235235

236236
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);
240238
}
241239

242240
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);
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
}

cores/esp8266/Print.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
class Print {
3737
private:
3838
int write_error;
39-
size_t printNumber(unsigned long, uint8_t);
40-
size_t printFloat(double, uint8_t);
41-
protected:
39+
template<typename T> size_t printNumber(T n, uint8_t base);
40+
template<typename T, typename... P> inline size_t _println(T v, P... args);
41+
protected:
4242
void setWriteError(int err = 1) {
4343
write_error = err;
4444
}
@@ -71,6 +71,8 @@ class Print {
7171
inline size_t write(unsigned int t) { return write((uint8_t)t); }
7272
inline size_t write(long t) { return write((uint8_t)t); }
7373
inline size_t write(unsigned long t) { return write((uint8_t)t); }
74+
inline size_t write(long long t) { return write((uint8_t)t); }
75+
inline size_t write(unsigned long long t) { return write((uint8_t)t); }
7476
// Enable write(char) to fall through to write(uint8_t)
7577
inline size_t write(char c) { return write((uint8_t) c); }
7678
inline size_t write(int8_t c) { return write((uint8_t) c); }
@@ -86,6 +88,8 @@ class Print {
8688
size_t print(unsigned int, int = DEC);
8789
size_t print(long, int = DEC);
8890
size_t print(unsigned long, int = DEC);
91+
size_t print(long long, int = DEC);
92+
size_t print(unsigned long long, int = DEC);
8993
size_t print(double, int = 2);
9094
size_t print(const Printable&);
9195

@@ -98,11 +102,15 @@ class Print {
98102
size_t println(unsigned int, int = DEC);
99103
size_t println(long, int = DEC);
100104
size_t println(unsigned long, int = DEC);
105+
size_t println(long long, int = DEC);
106+
size_t println(unsigned long long, int = DEC);
101107
size_t println(double, int = 2);
102108
size_t println(const Printable&);
103109
size_t println(void);
104110

105111
virtual void flush() { /* Empty implementation for backward compatibility */ }
106112
};
107113

114+
template<> size_t Print::printNumber(double number, uint8_t digits);
115+
108116
#endif

0 commit comments

Comments
 (0)