Line data Source code
1 : #pragma once 2 : 3 : // This component provides functions for formatting an unsigned integral value 4 : // in hexadecimal. 5 : 6 : #include <cassert> 7 : #include <charconv> 8 : #include <limits> 9 : #include <system_error> 10 : #include <utility> 11 : 12 : namespace datadog { 13 : namespace tracing { 14 : 15 : // Return the specified unsigned `value` formatted as a lower-case hexadecimal 16 : // string without any leading zeroes. 17 : template <typename UnsignedInteger> 18 4 : std::string hex(UnsignedInteger value) { 19 : static_assert(!std::numeric_limits<UnsignedInteger>::is_signed); 20 : 21 : // 4 bits per hex digit char 22 : char buffer[std::numeric_limits<UnsignedInteger>::digits / 4]; 23 : 24 4 : const int base = 16; 25 : auto result = 26 4 : std::to_chars(std::begin(buffer), std::end(buffer), value, base); 27 4 : assert(result.ec == std::errc()); 28 : 29 4 : return std::string{std::begin(buffer), result.ptr}; 30 : } 31 : 32 : // Return the specified unsigned `value` formatted as a lower-case hexadecimal 33 : // string with leading zeroes. 34 : template <typename UnsignedInteger> 35 85032 : std::string hex_padded(UnsignedInteger value) { 36 : static_assert(!std::numeric_limits<UnsignedInteger>::is_signed); 37 : 38 : // 4 bits per hex digit char. 39 : char buffer[std::numeric_limits<UnsignedInteger>::digits / 4]; 40 : 41 85032 : const int base = 16; 42 : auto result = 43 85032 : std::to_chars(std::begin(buffer), std::end(buffer), value, base); 44 85032 : assert(result.ec == std::errc()); 45 : 46 85032 : const auto num_zeroes = sizeof(buffer) - (result.ptr - std::begin(buffer)); 47 85032 : std::string padded(num_zeroes, '0'); 48 85032 : padded.append(std::begin(buffer), result.ptr); 49 170064 : return padded; 50 0 : } 51 : 52 : } // namespace tracing 53 : } // namespace datadog