Extend Print class for 64bit integers. (#3688)
* Extend Print class for 64bit integers. modulo 32bit and 64bit tuned for code size. * Fix 32bit long used in long long printNumber.
This commit is contained in:
		
							parent
							
								
									ab23e8a656
								
							
						
					
					
						commit
						4204869ec9
					
				| @ -111,18 +111,12 @@ size_t Print::print(unsigned int n, int base) | ||||
| 
 | ||||
| size_t Print::print(long n, int base) | ||||
| { | ||||
|     if(base == 0) { | ||||
|         return write(n); | ||||
|     } else if(base == 10) { | ||||
|         if(n < 0) { | ||||
|             int t = print('-'); | ||||
|             n = -n; | ||||
|             return printNumber(n, 10) + t; | ||||
|         } | ||||
|         return printNumber(n, 10); | ||||
|     } else { | ||||
|         return printNumber(n, base); | ||||
|     int t = 0; | ||||
|     if (base == 10 && n < 0) { | ||||
|         t = print('-'); | ||||
|         n = -n; | ||||
|     } | ||||
|     return printNumber(static_cast<unsigned long>(n), base) + t; | ||||
| } | ||||
| 
 | ||||
| size_t Print::print(unsigned long n, int base) | ||||
| @ -134,6 +128,25 @@ size_t Print::print(unsigned long n, int base) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| size_t Print::print(long long n, int base) | ||||
| { | ||||
|     int t = 0; | ||||
|     if (base == 10 && n < 0) { | ||||
|         t = print('-'); | ||||
|         n = -n; | ||||
|     } | ||||
|     return printNumber(static_cast<unsigned long long>(n), base) + t; | ||||
| } | ||||
| 
 | ||||
| size_t Print::print(unsigned long long n, int base) | ||||
| { | ||||
|     if (base == 0) { | ||||
|         return write(n); | ||||
|     } else { | ||||
|         return printNumber(n, base); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| size_t Print::print(double n, int digits) | ||||
| { | ||||
|     return printFloat(n, digits); | ||||
| @ -226,6 +239,20 @@ size_t Print::println(unsigned long num, int base) | ||||
|     return n; | ||||
| } | ||||
| 
 | ||||
| size_t Print::println(long long num, int base) | ||||
| { | ||||
|     size_t n = print(num, base); | ||||
|     n += println(); | ||||
|     return n; | ||||
| } | ||||
| 
 | ||||
| size_t Print::println(unsigned long long num, int base) | ||||
| { | ||||
|     size_t n = print(num, base); | ||||
|     n += println(); | ||||
|     return n; | ||||
| } | ||||
| 
 | ||||
| size_t Print::println(double num, int digits) | ||||
| { | ||||
|     size_t n = print(num, digits); | ||||
| @ -251,7 +278,7 @@ size_t Print::println(struct tm * timeinfo, const char * format) | ||||
| 
 | ||||
| size_t Print::printNumber(unsigned long n, uint8_t base) | ||||
| { | ||||
|     char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
 | ||||
|     char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte.
 | ||||
|     char *str = &buf[sizeof(buf) - 1]; | ||||
| 
 | ||||
|     *str = '\0'; | ||||
| @ -262,11 +289,34 @@ size_t Print::printNumber(unsigned long n, uint8_t base) | ||||
|     } | ||||
| 
 | ||||
|     do { | ||||
|         unsigned long m = n; | ||||
|         char c = n % base; | ||||
|         n /= base; | ||||
| 
 | ||||
|         *--str = c < 10 ? c + '0' : c + 'A' - 10; | ||||
|     } while (n); | ||||
| 
 | ||||
|     return write(str); | ||||
| } | ||||
| 
 | ||||
| size_t Print::printNumber(unsigned long long n, uint8_t base) | ||||
| { | ||||
|     char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte.
 | ||||
|     char* str = &buf[sizeof(buf) - 1]; | ||||
| 
 | ||||
|     *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); | ||||
|     } while (n); | ||||
| 
 | ||||
|     return write(str); | ||||
| } | ||||
|  | ||||
| @ -36,6 +36,7 @@ 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); | ||||
| protected: | ||||
|     void setWriteError(int err = 1) | ||||
| @ -81,6 +82,8 @@ public: | ||||
|     size_t print(unsigned int, int = DEC); | ||||
|     size_t print(long, int = DEC); | ||||
|     size_t print(unsigned long, int = DEC); | ||||
|     size_t print(long long, int = DEC); | ||||
|     size_t print(unsigned long long, int = DEC); | ||||
|     size_t print(double, int = 2); | ||||
|     size_t print(const Printable&); | ||||
|     size_t print(struct tm * timeinfo, const char * format = NULL); | ||||
| @ -94,6 +97,8 @@ public: | ||||
|     size_t println(unsigned int, int = DEC); | ||||
|     size_t println(long, int = DEC); | ||||
|     size_t println(unsigned long, int = DEC); | ||||
|     size_t println(long long, int = DEC); | ||||
|     size_t println(unsigned long long, int = DEC); | ||||
|     size_t println(double, int = 2); | ||||
|     size_t println(const Printable&); | ||||
|     size_t println(struct tm * timeinfo, const char * format = NULL); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user