18#if __has_include(<sys/resource.h>)
19# include <sys/resource.h>
28#if __has_include(<sys/resource.h>)
30inline long peak_ram_in_KiB()
33 return getrusage(RUSAGE_SELF, &usage) == 0 ? usage.ru_maxrss : -1L;
36inline long peak_ram_in_KiB()
42[[nodiscard]]
inline std::string formatted_peak_ram(
size_t const bytes)
47 size_t integer{bytes};
49 while (integer >> 10u && iterations < 6u)
56 auto first_decimal_position = [&]()
58 assert(iterations > 0u);
59 size_t decimal{bytes};
60 decimal -= integer << (iterations * 10u);
61 decimal >>= (iterations - 1u) * 10u;
62 decimal = decimal * 1000u / 1024u;
63 size_t const diff{decimal - (decimal / 100u) * 100u};
64 uint32_t
const round_up{diff >= 50u};
65 decimal += round_up * 100u - diff;
70 auto formatted_string = [&]()
72 static constexpr int8_t int_to_char_offset{
'0'};
73 size_t const decimal = iterations ? first_decimal_position() : 0u;
74 assert(decimal <= 10u);
78 else if (decimal < 10u)
79 return std::to_string(integer) +
'.' +
static_cast<char>(decimal + int_to_char_offset);
97 return "[Bytes]: " + formatted;
99 return "[KiB]: " + formatted;
101 return "[MiB]: " + formatted;
103 return "[GiB]: " + formatted;
105 return "[TiB]: " + formatted;
107 return "[PiB]: " + formatted;
109 return "[EiB]: " + formatted;
115[[nodiscard]]
inline std::string formatted_peak_ram()
117 long const peak_ram_KiB = detail::peak_ram_in_KiB();
118 if (peak_ram_KiB == -1L)
119 return {
": Not available"};
121 return detail::formatted_peak_ram(
static_cast<size_t>(peak_ram_KiB));
123 return detail::formatted_peak_ram(
static_cast<size_t>(peak_ram_KiB) << 10);