#pragma once #include #include #ifndef _MSC_VER namespace floormat::detail::fmt { template struct fmt_string final { static constexpr std::size_t size = N; char data[N]; template consteval fmt_string(const char (&arr)[N]) noexcept { for (std::size_t i = 0; i < N; i++) data[i] = arr[i]; } }; } // namespace floormat::detail::fmt #endif namespace floormat { #ifndef _MSC_VER template<::floormat::detail::fmt::fmt_string s> consteval auto operator""_cf() noexcept { return FMT_COMPILE(s.data); } #else using namespace fmt::literals; #endif template std::size_t snformat(char(&buf)[N], Fmt&& fmt, Xs&&... args) { constexpr std::size_t n = N > 0 ? N - 1 : 0; auto result = fmt::format_to_n(buf, n, std::forward(fmt), std::forward(args)...); const auto len = std::min(n, result.size); if constexpr(N > 0) buf[len] = '\0'; return len; } } // namespace floormat