// // Created by gabi on 6/15/18. // #pragma once #include "chrono" #include "spdlog/fmt/fmt.h" // Some fmt helpers to efficiently format and pad ints and strings namespace spdlog { namespace details { namespace fmt_helper { template inline void append_str(const std::string &str, fmt::basic_memory_buffer &dest) { auto *str_ptr = str.data(); dest.append(str_ptr, str_ptr + str.size()); } template inline void append_c_str(const char *c_str, fmt::basic_memory_buffer &dest) { auto len = std::char_traits::length(c_str); dest.append(c_str, c_str + len); } template inline void append_buf(const fmt::basic_memory_buffer &buf, fmt::basic_memory_buffer &dest) { auto *buf_ptr = buf.data(); dest.append(buf_ptr, buf_ptr + buf.size()); } template inline void append_int(T n, fmt::basic_memory_buffer &dest) { fmt::format_int i(n); dest.append(i.data(), i.data() + i.size()); } template inline void pad2(int n, fmt::basic_memory_buffer &dest) { if (n > 99) { append_int(n, dest); return; } if (n > 9) // 10-99 { dest.push_back(static_cast('0' + n / 10)); dest.push_back(static_cast('0' + n % 10)); return; } if (n >= 0) // 0-9 { dest.push_back('0'); dest.push_back(static_cast('0' + n)); return; } // negatives (unlikely, but just in case, let fmt deal with it) fmt::format_to(dest, "{:02}", n); } template inline void pad3(int n, fmt::basic_memory_buffer &dest) { if (n > 999) { append_int(n, dest); return; } if (n > 99) // 100-999 { dest.push_back(static_cast('0' + n / 100)); pad2(n % 100, dest); return; } if (n > 9) // 10-99 { dest.push_back('0'); dest.push_back(static_cast('0' + n / 10)); dest.push_back(static_cast('0' + n % 10)); return; } if (n >= 0) { dest.push_back('0'); dest.push_back('0'); dest.push_back(static_cast('0' + n)); return; } // negatives (unlikely, but just in case let fmt deal with it) fmt::format_to(dest, "{:03}", n); } template inline void pad6(size_t n, fmt::basic_memory_buffer &dest) { if (n > 99999) { append_int(n, dest); return; } pad3(static_cast(n / 1000), dest); pad3(static_cast(n % 1000), dest); } // return fraction of a second of the given time_point. // e.g. // fraction(tp) -> will return the millis part of the second template inline ToDuration time_fraction(const log_clock::time_point &tp) { using std::chrono::duration_cast; using std::chrono::seconds; auto duration = tp.time_since_epoch(); auto secs = duration_cast(duration); return duration_cast(duration) - duration_cast(secs); } } // namespace fmt_helper } // namespace details } // namespace spdlog