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