blob: fdfd1c658ddd0b6c359c2bafbbd9b8eda94052a4 [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#ifndef AOS_PRINT_FIELD_HELPERS_H_
2#define AOS_PRINT_FIELD_HELPERS_H_
Brian Silverman074392a2014-03-24 16:32:44 -07003
Tyler Chatowbf0609c2021-07-31 16:13:27 -07004#include <cstdint>
Brian Silverman074392a2014-03-24 16:32:44 -07005#include <type_traits>
6
7namespace aos {
8
Tyler Chatowbf0609c2021-07-31 16:13:27 -07009template <typename T>
Brian Silverman074392a2014-03-24 16:32:44 -070010inline bool PrintInteger(char *buf, T val, size_t *output) {
11 static const bool is_signed = ::std::is_signed<T>::value;
Brian Silverman2a2660f2014-03-30 17:11:29 -070012 const bool is_negative =
13 is_signed ? (val & (static_cast<T>(1) << (sizeof(T) * 8 - 1))) : false;
Brian Silverman074392a2014-03-24 16:32:44 -070014
15 size_t len = 0;
Brian Silverman2a2660f2014-03-30 17:11:29 -070016 if (is_negative) {
17 do {
18 if (len == *output) return false;
Brian Silverman074392a2014-03-24 16:32:44 -070019 buf[len++] = '0' - (val % 10);
20 val /= 10;
Brian Silverman2a2660f2014-03-30 17:11:29 -070021 } while (val != 0);
22 if (len == *output) return false;
Brian Silverman074392a2014-03-24 16:32:44 -070023 buf[len++] = '-';
24 } else {
Brian Silverman2a2660f2014-03-30 17:11:29 -070025 do {
26 if (len == *output) return false;
Brian Silverman074392a2014-03-24 16:32:44 -070027 buf[len++] = '0' + (val % 10);
28 val /= 10;
Brian Silverman2a2660f2014-03-30 17:11:29 -070029 } while (val != 0);
Brian Silverman074392a2014-03-24 16:32:44 -070030 }
Brian Silverman2a2660f2014-03-30 17:11:29 -070031 for (size_t i = 0; i < (len >> 1); i++) {
32 std::swap(buf[len - 1 - i], buf[i]);
Brian Silverman074392a2014-03-24 16:32:44 -070033 }
Brian Silverman2a2660f2014-03-30 17:11:29 -070034 *output -= len;
35 return true;
Brian Silverman074392a2014-03-24 16:32:44 -070036}
37
38} // namespace aos
39
John Park33858a32018-09-28 23:05:48 -070040#endif // AOS_PRINT_FIELD_HELPERS_H_