From 31c220c7178f3a8ae7a803e46d3d568d7ff56848 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Wed, 24 Apr 2024 20:47:57 +0200 Subject: Reword custom formatter to be simpler --- deimos/core/format.h | 29 ++++++++++++++++------------- deimos/core/log.h | 6 +++--- deimos/core/status.cpp | 3 +-- deimos/core/status.h | 7 +------ deimos/vulkan/vulkan_entry_functions.inc | 2 ++ main/main.cpp | 10 +++++----- 6 files changed, 28 insertions(+), 29 deletions(-) diff --git a/deimos/core/format.h b/deimos/core/format.h index ba1a3e2..8a2c850 100644 --- a/deimos/core/format.h +++ b/deimos/core/format.h @@ -15,6 +15,12 @@ struct CustomFormatter Callback callback; }; +template +concept CustomFormattable = requires(IWriter* writer, const T& value) +{ + DeimosFormat(writer, value); +}; + struct FormatArg { enum Type : uint8_t @@ -50,29 +56,26 @@ struct FormatArg string{value} {} - template - constexpr explicit FormatArg(const T& payload, CustomFormatter::Callback callback) : + template + constexpr explicit FormatArg(const T& payload) : type{kCustom}, - custom{CustomFormatter{&payload, callback}} - {} + custom{CustomFormatter{&payload, [](IWriter* writer, const void* raw) + { + DeimosFormat(writer, *(const T*)raw); + }}} + { + } }; template -deimos::FormatArg DeimosMakeFormatArg(T&& value) - requires std::is_constructible_v -{ - return deimos::FormatArg(value); -} - -template -concept Formattable = std::same_as()))>; +concept Formattable = std::is_constructible_v; void FormatVa(IWriter*, gsl::czstring fmt, Span); template void Format(IWriter* writer, gsl::czstring fmt, Args&&... args) { - FormatVa(writer, fmt, { DeimosMakeFormatArg(std::forward(args))... }); + FormatVa(writer, fmt, { FormatArg(std::forward(args))... }); } } // namespace deimos diff --git a/deimos/core/log.h b/deimos/core/log.h index 260d9a4..9bb4dbb 100644 --- a/deimos/core/log.h +++ b/deimos/core/log.h @@ -50,19 +50,19 @@ public: template void LogInfo(const LogSourceLocation& fmt_source_location, Args&&... args) { - LogVa(LogSeverity::kInfo, fmt_source_location.source_location, fmt_source_location.fmt, { DeimosMakeFormatArg(std::forward(args))... }); + LogVa(LogSeverity::kInfo, fmt_source_location.source_location, fmt_source_location.fmt, { FormatArg(std::forward(args))... }); } template void LogDebug(const LogSourceLocation& fmt_source_location, Args&&... args) { - LogVa(LogSeverity::kDebug, fmt_source_location.source_location, fmt_source_location.fmt, { DeimosMakeFormatArg(std::forward(args))... }); + LogVa(LogSeverity::kDebug, fmt_source_location.source_location, fmt_source_location.fmt, { FormatArg(std::forward(args))... }); } template void LogError(const LogSourceLocation& fmt_source_location, Args&&... args) { - LogVa(LogSeverity::kError, fmt_source_location.source_location, fmt_source_location.fmt, { DeimosMakeFormatArg(std::forward(args))... }); + LogVa(LogSeverity::kError, fmt_source_location.source_location, fmt_source_location.fmt, { FormatArg(std::forward(args))... }); } }; diff --git a/deimos/core/status.cpp b/deimos/core/status.cpp index efdd6df..10965bc 100644 --- a/deimos/core/status.cpp +++ b/deimos/core/status.cpp @@ -86,9 +86,8 @@ void Status::Unref() const } } -void Status::FormatStatus(IWriter* writer, const void* payload) +void DeimosFormat(IWriter* writer, const Status& status) { - const auto& status = *(const Status*)payload; // NOLINT if (status.IsInline()) { Format(writer, "[$]", StatusCodeToString(status.code())); diff --git a/deimos/core/status.h b/deimos/core/status.h index 7350cc5..6601ad7 100644 --- a/deimos/core/status.h +++ b/deimos/core/status.h @@ -83,12 +83,7 @@ public: return RepCode(); } - static void FormatStatus(IWriter* writer, const void* payload); - - friend constexpr deimos::FormatArg DeimosMakeFormatArg(const Status& status) - { - return deimos::FormatArg(status, FormatStatus); - } + friend void DeimosFormat(IWriter*, const Status&); }; inline Status UnknownError(StringView message = {}) diff --git a/deimos/vulkan/vulkan_entry_functions.inc b/deimos/vulkan/vulkan_entry_functions.inc index 97584c4..fe5f9ea 100644 --- a/deimos/vulkan/vulkan_entry_functions.inc +++ b/deimos/vulkan/vulkan_entry_functions.inc @@ -1,2 +1,4 @@ +// NOLINTBEGIN FN(GetInstanceProcAddr) FN(CreateInstance) +// NOLINTEND diff --git a/main/main.cpp b/main/main.cpp index 00e7d71..4fa058c 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -11,7 +11,7 @@ static LogApi* log_api; [[nodiscard]] Status CreateInstance(VulkanApi* vk, VkInstance* instance) { - VkApplicationInfo application_info{ + const VkApplicationInfo application_info{ .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pNext = nullptr, .pApplicationName = "Deimos game", @@ -23,7 +23,7 @@ Status CreateInstance(VulkanApi* vk, VkInstance* instance) const char* extensions[]{ "VK_KHR_surface", - "VK_KHR_win32_surfaceu", + "VK_KHR_win32_surface", }; const char* layers[]{ @@ -31,7 +31,7 @@ Status CreateInstance(VulkanApi* vk, VkInstance* instance) "VK_LAYER_LUNARG_monitor", }; - VkInstanceCreateInfo create_info{ + const VkInstanceCreateInfo create_info{ .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, .pNext = nullptr, .flags = 0, @@ -42,7 +42,7 @@ Status CreateInstance(VulkanApi* vk, VkInstance* instance) .ppEnabledExtensionNames = extensions, }; - VkResult res = vk->CreateInstance(&create_info, nullptr, instance); + const VkResult res = vk->CreateInstance(&create_info, nullptr, instance); if (res != VK_SUCCESS) { return UnknownError(); @@ -62,7 +62,7 @@ int main(int /* argc */, char* /* argv */[]) auto* vk = vulkan_loader_api->LoadEntry(); VkInstance instance{}; - Status s = CreateInstance(vk, &instance); + const Status s = CreateInstance(vk, &instance); if (!s.ok()) { log_api->LogError("Couldn't create Vulkan instance: $", s); -- cgit