John Park | 33858a3 | 2018-09-28 23:05:48 -0700 | [diff] [blame] | 1 | #ifndef AOS_PRINT_FIELD_HELPERS_H_ |
| 2 | #define AOS_PRINT_FIELD_HELPERS_H_ |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 3 | |
| 4 | #include <stdint.h> |
| 5 | |
| 6 | #include <type_traits> |
| 7 | |
| 8 | namespace aos { |
| 9 | |
| 10 | template<typename T> |
| 11 | inline bool PrintInteger(char *buf, T val, size_t *output) { |
| 12 | static const bool is_signed = ::std::is_signed<T>::value; |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 13 | const bool is_negative = |
| 14 | is_signed ? (val & (static_cast<T>(1) << (sizeof(T) * 8 - 1))) : false; |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 15 | |
| 16 | size_t len = 0; |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 17 | if (is_negative) { |
| 18 | do { |
| 19 | if (len == *output) return false; |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 20 | buf[len++] = '0' - (val % 10); |
| 21 | val /= 10; |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 22 | } while (val != 0); |
| 23 | if (len == *output) return false; |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 24 | buf[len++] = '-'; |
| 25 | } else { |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 26 | do { |
| 27 | if (len == *output) return false; |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 28 | buf[len++] = '0' + (val % 10); |
| 29 | val /= 10; |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 30 | } while (val != 0); |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 31 | } |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 32 | for (size_t i = 0; i < (len >> 1); i++) { |
| 33 | std::swap(buf[len - 1 - i], buf[i]); |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 34 | } |
Brian Silverman | 2a2660f | 2014-03-30 17:11:29 -0700 | [diff] [blame] | 35 | *output -= len; |
| 36 | return true; |
Brian Silverman | 074392a | 2014-03-24 16:32:44 -0700 | [diff] [blame] | 37 | } |
| 38 | |
| 39 | } // namespace aos |
| 40 | |
John Park | 33858a3 | 2018-09-28 23:05:48 -0700 | [diff] [blame] | 41 | #endif // AOS_PRINT_FIELD_HELPERS_H_ |