blob: 933ce46cc932089da516836598f946b7367f2df4 [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
4#include <stdint.h>
5
6#include <type_traits>
7
8namespace aos {
9
10template<typename T>
11inline bool PrintInteger(char *buf, T val, size_t *output) {
12 static const bool is_signed = ::std::is_signed<T>::value;
Brian Silverman2a2660f2014-03-30 17:11:29 -070013 const bool is_negative =
14 is_signed ? (val & (static_cast<T>(1) << (sizeof(T) * 8 - 1))) : false;
Brian Silverman074392a2014-03-24 16:32:44 -070015
16 size_t len = 0;
Brian Silverman2a2660f2014-03-30 17:11:29 -070017 if (is_negative) {
18 do {
19 if (len == *output) return false;
Brian Silverman074392a2014-03-24 16:32:44 -070020 buf[len++] = '0' - (val % 10);
21 val /= 10;
Brian Silverman2a2660f2014-03-30 17:11:29 -070022 } while (val != 0);
23 if (len == *output) return false;
Brian Silverman074392a2014-03-24 16:32:44 -070024 buf[len++] = '-';
25 } else {
Brian Silverman2a2660f2014-03-30 17:11:29 -070026 do {
27 if (len == *output) return false;
Brian Silverman074392a2014-03-24 16:32:44 -070028 buf[len++] = '0' + (val % 10);
29 val /= 10;
Brian Silverman2a2660f2014-03-30 17:11:29 -070030 } while (val != 0);
Brian Silverman074392a2014-03-24 16:32:44 -070031 }
Brian Silverman2a2660f2014-03-30 17:11:29 -070032 for (size_t i = 0; i < (len >> 1); i++) {
33 std::swap(buf[len - 1 - i], buf[i]);
Brian Silverman074392a2014-03-24 16:32:44 -070034 }
Brian Silverman2a2660f2014-03-30 17:11:29 -070035 *output -= len;
36 return true;
Brian Silverman074392a2014-03-24 16:32:44 -070037}
38
39} // namespace aos
40
John Park33858a32018-09-28 23:05:48 -070041#endif // AOS_PRINT_FIELD_HELPERS_H_