19#if __has_include(<sys/resource.h>)
20# include <sys/resource.h>
29#if __has_include(<sys/resource.h>)
31inline long peak_ram_in_KiB()
34 return getrusage(RUSAGE_SELF, &usage) == 0 ? usage.ru_maxrss : -1L;
37inline long peak_ram_in_KiB()
43[[nodiscard]]
inline std::string formatted_peak_ram(
size_t const bytes)
48 size_t integer{bytes};
50 while (integer >> 10u && iterations < 6u)
57 auto first_decimal_position = [&]()
59 assert(iterations > 0u);
60 size_t decimal{bytes};
61 decimal -= integer << (iterations * 10u);
62 decimal >>= (iterations - 1u) * 10u;
63 decimal = decimal * 1000u / 1024u;
64 size_t const diff{decimal - (decimal / 100u) * 100u};
65 uint32_t
const round_up{diff >= 50u};
66 decimal += round_up * 100u - diff;
71 auto formatted_string = [&]()
73 static constexpr int8_t int_to_char_offset{
'0'};
74 size_t const decimal = iterations ? first_decimal_position() : 0u;
75 assert(decimal <= 10u);
79 else if (decimal < 10u)
80 return std::to_string(integer) +
'.' +
static_cast<char>(decimal + int_to_char_offset);
98 return "[Bytes]: " + formatted;
100 return "[KiB]: " + formatted;
102 return "[MiB]: " + formatted;
104 return "[GiB]: " + formatted;
106 return "[TiB]: " + formatted;
108 return "[PiB]: " + formatted;
110 return "[EiB]: " + formatted;
116[[nodiscard]]
inline std::string formatted_peak_ram()
118 long const peak_ram_KiB = detail::peak_ram_in_KiB();
119 if (peak_ram_KiB == -1L)
120 return {
": Not available"};
122 return detail::formatted_peak_ram(
static_cast<size_t>(peak_ram_KiB));
124 return detail::formatted_peak_ram(
static_cast<size_t>(peak_ram_KiB) << 10);