From 6f57c222c17bfa488d78193554dc5237c3305594 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sat, 18 Apr 2020 10:07:08 +0200 Subject: [PATCH] Eliminate code duplication by template for printNumber(...)/printFloat(...). Move template defintion into cpp file - valid for private member function templates. --- cores/esp8266/Print.cpp | 33 +++++++++------------------------ cores/esp8266/Print.h | 17 +++++------------ 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/cores/esp8266/Print.cpp b/cores/esp8266/Print.cpp index f6fd2ec74..186d6e1cb 100644 --- a/cores/esp8266/Print.cpp +++ b/cores/esp8266/Print.cpp @@ -178,7 +178,7 @@ size_t Print::print(unsigned long long n, int base) { } size_t Print::print(double n, int digits) { - return printFloat(n, digits); + return printNumber(n, digits); } size_t Print::print(const Printable& x) { @@ -243,29 +243,14 @@ size_t Print::println(const Printable& x) { // Private Methods ///////////////////////////////////////////////////////////// -size_t Print::printNumber(unsigned long n, uint8_t base) { - char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte. - char *str = &buf[sizeof(buf) - 1]; +template inline size_t Print::_println(T v, P... args) +{ + size_t n = print(v, args...); + n += println(); + return n; +}; - *str = '\0'; - - // prevent crash if called with base == 1 - if(base < 2) { - base = 10; - } - - do { - auto m = n; - n /= base; - char c = m - base * n; - - *--str = c < 10 ? c + '0' : c + 'A' - 10; - } while (n); - - return write(str); -} - -size_t Print::printNumber(unsigned long long n, uint8_t base) { +template size_t Print::printNumber(T n, uint8_t base) { char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte. char* str = &buf[sizeof(buf) - 1]; @@ -287,7 +272,7 @@ size_t Print::printNumber(unsigned long long n, uint8_t base) { return write(str); } -size_t Print::printFloat(double number, uint8_t digits) { +template<> size_t Print::printNumber(double number, uint8_t digits) { char buf[40]; return write(dtostrf(number, 0, digits, buf)); } diff --git a/cores/esp8266/Print.h b/cores/esp8266/Print.h index edfd7f7d6..e49332b31 100644 --- a/cores/esp8266/Print.h +++ b/cores/esp8266/Print.h @@ -36,18 +36,9 @@ class Print { private: int write_error; - size_t printNumber(unsigned long, uint8_t); - size_t printNumber(unsigned long long, uint8_t); - size_t printFloat(double, uint8_t); - - template inline size_t _println(T v, P... args) - { - size_t n = print(v, args...); - n += println(); - return n; - }; - - protected: + template size_t printNumber(T n, uint8_t base); + template inline size_t _println(T v, P... args); +protected: void setWriteError(int err = 1) { write_error = err; } @@ -120,4 +111,6 @@ class Print { virtual void flush() { /* Empty implementation for backward compatibility */ } }; +template<> size_t Print::printNumber(double number, uint8_t digits); + #endif