From b5206ebdb7d39a007b225cbd65de42396e28ec2f Mon Sep 17 00:00:00 2001 From: SirLynix Date: Tue, 13 Jun 2023 19:39:28 +0200 Subject: [PATCH] Utility/STBSaver: Replace static map by constexpr unordered_map --- src/Nazara/Utility/Formats/STBSaver.cpp | 99 +++++++++++++------------ 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/src/Nazara/Utility/Formats/STBSaver.cpp b/src/Nazara/Utility/Formats/STBSaver.cpp index c65cdad4c..78ab4ee66 100644 --- a/src/Nazara/Utility/Formats/STBSaver.cpp +++ b/src/Nazara/Utility/Formats/STBSaver.cpp @@ -6,7 +6,8 @@ #include #include #include -#include +#include +#include #include #define STB_IMAGE_WRITE_IMPLEMENTATION #include @@ -14,12 +15,10 @@ namespace Nz { - namespace + namespace NAZARA_ANONYMOUS_NAMESPACE { using FormatHandler = bool(*)(const Image& image, const ImageParams& parameters, Stream& stream); - std::map s_formatHandlers; - int ConvertToFloatFormat(Image& image) { switch (image.GetFormat()) @@ -105,43 +104,6 @@ namespace Nz throw std::runtime_error("Failed to write to stream"); } - bool FormatQuerier(const std::string_view& extension) - { - return s_formatHandlers.find(extension) != s_formatHandlers.end(); - } - - bool SaveToStream(const Image& image, const std::string& format, Stream& stream, const ImageParams& parameters) - { - NazaraUnused(parameters); - - if (!image.IsValid()) - { - NazaraError("Invalid image"); - return false; - } - - ImageType type = image.GetType(); - if (type != ImageType::E1D && type != ImageType::E2D) - { - NazaraError("Image type 0x" + NumberToString(UnderlyingCast(type), 16) + " is not in a supported format"); - return false; - } - - auto it = s_formatHandlers.find(format); - NazaraAssert(it != s_formatHandlers.end(), "Invalid handler"); - - const FormatHandler& handler = it->second; - try - { - return handler(image, parameters, stream); - } - catch (const std::exception& e) - { - NazaraError(e.what()); - return false; - } - } - bool SaveBMP(const Image& image, const ImageParams& parameters, Stream& stream) { NazaraUnused(parameters); @@ -256,18 +218,61 @@ namespace Nz return true; } + + constexpr FormatHandler test = &SaveBMP; + + constexpr frozen::unordered_map s_formatHandlers = frozen::make_unordered_map({ + { ".bmp", &SaveBMP }, + { ".hdr", &SaveHDR }, + { ".jpg", &SaveJPEG }, + { ".jpeg", &SaveJPEG }, + { ".png", &SavePNG }, + { ".tga", &SaveTGA } + }); + + bool FormatQuerier(const std::string_view& extension) + { + return s_formatHandlers.find(extension) != s_formatHandlers.end(); + } + + bool SaveToStream(const Image& image, const std::string& format, Stream& stream, const ImageParams& parameters) + { + NazaraUnused(parameters); + + if (!image.IsValid()) + { + NazaraError("Invalid image"); + return false; + } + + ImageType type = image.GetType(); + if (type != ImageType::E1D && type != ImageType::E2D) + { + NazaraError("Image type 0x" + NumberToString(UnderlyingCast(type), 16) + " is not in a supported format"); + return false; + } + + auto it = s_formatHandlers.find(std::string_view(format)); + NazaraAssert(it != s_formatHandlers.end(), "Invalid handler"); + + const FormatHandler& handler = it->second; + try + { + return handler(image, parameters, stream); + } + catch (const std::exception& e) + { + NazaraError(e.what()); + return false; + } + } } namespace Loaders { ImageSaver::Entry GetImageSaver_STB() { - s_formatHandlers[".bmp"] = &SaveBMP; - s_formatHandlers[".hdr"] = &SaveHDR; - s_formatHandlers[".jpg"] = &SaveJPEG; - s_formatHandlers[".jpeg"] = &SaveJPEG; - s_formatHandlers[".png"] = &SavePNG; - s_formatHandlers[".tga"] = &SaveTGA; + NAZARA_USE_ANONYMOUS_NAMESPACE ImageSaver::Entry entry; entry.formatSupport = FormatQuerier;