LCOV - code coverage report
Current view: top level - datadog - hex.h (source / functions) Hit Total Coverage
Test: filtered.info Lines: 13 14 92.9 %
Date: 2024-01-03 20:30:12 Functions: 3 3 100.0 %

          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

Generated by: LCOV version 1.16