Use fmt store instead of ToString fallback
Thanks to @jonathanpoelen for the idea
This commit is contained in:
parent
a741672a51
commit
ab8bac2575
|
|
@ -10,7 +10,7 @@
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
#include <Nazara/Core/Config.hpp>
|
#include <Nazara/Core/Config.hpp>
|
||||||
#include <Nazara/Core/Enums.hpp>
|
#include <Nazara/Core/Enums.hpp>
|
||||||
#include <Nazara/Core/ToString.hpp>
|
#include <Nazara/Core/Format.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if NAZARA_CORE_ENABLE_ASSERTS || defined(NAZARA_DEBUG)
|
#if NAZARA_CORE_ENABLE_ASSERTS || defined(NAZARA_DEBUG)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||||
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef NAZARA_CORE_FORMAT_HPP
|
||||||
|
#define NAZARA_CORE_FORMAT_HPP
|
||||||
|
|
||||||
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
|
#include <Nazara/Core/Config.hpp>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
template<typename... Args> std::string Format(std::string_view str, Args&&... args);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <Nazara/Core/Format.inl>
|
||||||
|
|
||||||
|
#endif // NAZARA_CORE_FORMAT_HPP
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||||
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
|
#ifdef NAZARA_BUILD
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <fmt/std.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <Nazara/Core/Debug.hpp>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
namespace Detail
|
||||||
|
{
|
||||||
|
NAZARA_CORE_API void ClearFormatStore();
|
||||||
|
template<typename T> void PushFormatArgImpl(const T& value);
|
||||||
|
template<typename T> void PushFormatArg(T&& value)
|
||||||
|
{
|
||||||
|
PushFormatArgImpl(static_cast<const std::decay_t<T>&>(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
NAZARA_CORE_API std::string FormatFromStore(std::string_view str);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ...Args>
|
||||||
|
std::string Format(std::string_view str, Args&&... args)
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_BUILD
|
||||||
|
return fmt::format(str, std::forward<Args>(args)...);
|
||||||
|
#else
|
||||||
|
Detail::ClearFormatStore();
|
||||||
|
(Detail::PushFormatArg(args), ...);
|
||||||
|
return Detail::FormatFromStore(str);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NAZARA_TO_STRING_STD_SPEC
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <Nazara/Core/DebugOff.hpp>
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
// This file is part of the "Nazara Engine - Core module"
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
#include <Nazara/Core/ToString.hpp>
|
#include <Nazara/Core/Format.hpp>
|
||||||
#include <Nazara/Core/Debug.hpp>
|
#include <Nazara/Core/Debug.hpp>
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
|
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
|
||||||
// This file is part of the "Nazara Engine - Core module"
|
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef NAZARA_CORE_TOSTRING_HPP
|
|
||||||
#define NAZARA_CORE_TOSTRING_HPP
|
|
||||||
|
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
|
||||||
#include <Nazara/Core/Config.hpp>
|
|
||||||
#include <NazaraUtils/Algorithm.hpp>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace Nz
|
|
||||||
{
|
|
||||||
template<typename... Args> std::string Format(std::string_view str, Args&&... args);
|
|
||||||
|
|
||||||
template<typename T> decltype(auto) ToString(T&& value);
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct ToStringFormatter
|
|
||||||
{
|
|
||||||
static_assert(AlwaysFalse<T>(), "ToStringFormatter is not implemented for this type");
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct NAZARA_CORE_API ToStringFormatter<std::filesystem::path>
|
|
||||||
{
|
|
||||||
static std::string Format(const std::filesystem::path& path);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct ToStringFormatter<std::string>
|
|
||||||
{
|
|
||||||
static const std::string& Format(const std::string& value);
|
|
||||||
static std::string Format(std::string&& value);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct ToStringFormatter<std::string_view>
|
|
||||||
{
|
|
||||||
static std::string Format(std::string_view value);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct ToStringFormatter<const char*>
|
|
||||||
{
|
|
||||||
static std::string_view Format(const char* value);
|
|
||||||
template<std::size_t N> static std::string_view Format(const char(&str)[N]);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Specializations declared in .inl
|
|
||||||
#define NAZARA_TO_STRING_INLINE_SPEC(Type) \
|
|
||||||
template<> \
|
|
||||||
struct ToStringFormatter<Type> \
|
|
||||||
{ \
|
|
||||||
static std::string Format(Type value); \
|
|
||||||
}
|
|
||||||
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(short);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(int);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(long);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(long long);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(unsigned short);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(unsigned int);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(unsigned long);
|
|
||||||
NAZARA_TO_STRING_INLINE_SPEC(unsigned long long);
|
|
||||||
|
|
||||||
#undef NAZARA_TO_STRING_INLINE_SPEC
|
|
||||||
|
|
||||||
// Specializations declared in .cpp
|
|
||||||
#define NAZARA_TO_STRING_CPP_SPEC(Type) \
|
|
||||||
template<> \
|
|
||||||
struct NAZARA_CORE_API ToStringFormatter<Type> \
|
|
||||||
{ \
|
|
||||||
static std::string Format(Type value); \
|
|
||||||
}
|
|
||||||
|
|
||||||
NAZARA_TO_STRING_CPP_SPEC(float);
|
|
||||||
NAZARA_TO_STRING_CPP_SPEC(double);
|
|
||||||
NAZARA_TO_STRING_CPP_SPEC(long double);
|
|
||||||
|
|
||||||
#undef NAZARA_TO_STRING_CPP_SPEC
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <Nazara/Core/ToString.inl>
|
|
||||||
|
|
||||||
#endif // NAZARA_CORE_TOSTRING_HPP
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
|
||||||
// This file is part of the "Nazara Engine - Core module"
|
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
|
||||||
|
|
||||||
#ifdef NAZARA_BUILD
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <fmt/std.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <Nazara/Core/Debug.hpp>
|
|
||||||
|
|
||||||
namespace Nz
|
|
||||||
{
|
|
||||||
namespace Detail
|
|
||||||
{
|
|
||||||
NAZARA_CORE_API std::string FormatFallback(std::string_view str);
|
|
||||||
NAZARA_CORE_API std::string FormatFallback(std::string_view str, std::string_view param1);
|
|
||||||
NAZARA_CORE_API std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2);
|
|
||||||
NAZARA_CORE_API std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2, std::string_view param3);
|
|
||||||
NAZARA_CORE_API std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2, std::string_view param3, std::string_view param4);
|
|
||||||
NAZARA_CORE_API std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2, std::string_view param3, std::string_view param4, std::string_view param5);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ...Args>
|
|
||||||
std::string Format(std::string_view str, Args&&... args)
|
|
||||||
{
|
|
||||||
#ifdef NAZARA_BUILD
|
|
||||||
return fmt::format(str, std::forward<Args>(args)...);
|
|
||||||
#else
|
|
||||||
return Detail::FormatFallback(str, ToString(args)...);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
decltype(auto) ToString(T&& value)
|
|
||||||
{
|
|
||||||
return ToStringFormatter<std::decay_t<T>>::Format(std::forward<T>(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline const std::string& ToStringFormatter<std::string>::Format(const std::string& value)
|
|
||||||
{
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string ToStringFormatter<std::string>::Format(std::string&& value)
|
|
||||||
{
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline std::string ToStringFormatter<std::string_view>::Format(std::string_view value)
|
|
||||||
{
|
|
||||||
return std::string(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline std::string_view ToStringFormatter<const char*>::Format(const char* value)
|
|
||||||
{
|
|
||||||
return std::string_view(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<std::size_t N>
|
|
||||||
inline std::string_view ToStringFormatter<const char*>::Format(const char(&str)[N])
|
|
||||||
{
|
|
||||||
return std::string_view(str, N);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define NAZARA_TO_STRING_STD_SPEC(Type) \
|
|
||||||
inline std::string ToStringFormatter<Type>::Format(Type value) \
|
|
||||||
{ \
|
|
||||||
return std::to_string(value); \
|
|
||||||
}
|
|
||||||
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(short);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(int);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(long);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(long long);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(unsigned short);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(unsigned int);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(unsigned long);
|
|
||||||
NAZARA_TO_STRING_STD_SPEC(unsigned long long);
|
|
||||||
|
|
||||||
#undef NAZARA_TO_STRING_STD_SPEC
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <Nazara/Core/DebugOff.hpp>
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||||
|
// This file is part of the "Nazara Engine - Core module"
|
||||||
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
|
#include <Nazara/Core/Format.hpp>
|
||||||
|
#include <fmt/args.h>
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <fmt/std.h>
|
||||||
|
#include <Nazara/Core/Debug.hpp>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
namespace Detail
|
||||||
|
{
|
||||||
|
thread_local fmt::dynamic_format_arg_store<fmt::format_context> s_formatStore;
|
||||||
|
|
||||||
|
void ClearFormatStore()
|
||||||
|
{
|
||||||
|
s_formatStore.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string FormatFromStore(std::string_view str)
|
||||||
|
{
|
||||||
|
return fmt::vformat(str, s_formatStore);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NAZARA_FORMAT_IMPLEM(Type) \
|
||||||
|
template<> NAZARA_CORE_API void PushFormatArgImpl(Type const& value) \
|
||||||
|
{ \
|
||||||
|
s_formatStore.push_back(value); \
|
||||||
|
}
|
||||||
|
|
||||||
|
NAZARA_FORMAT_IMPLEM(std::filesystem::path);
|
||||||
|
NAZARA_FORMAT_IMPLEM(std::string);
|
||||||
|
NAZARA_FORMAT_IMPLEM(std::string_view);
|
||||||
|
NAZARA_FORMAT_IMPLEM(const char*);
|
||||||
|
NAZARA_FORMAT_IMPLEM(short);
|
||||||
|
NAZARA_FORMAT_IMPLEM(int);
|
||||||
|
NAZARA_FORMAT_IMPLEM(long);
|
||||||
|
NAZARA_FORMAT_IMPLEM(long long);
|
||||||
|
NAZARA_FORMAT_IMPLEM(unsigned short);
|
||||||
|
NAZARA_FORMAT_IMPLEM(unsigned int);
|
||||||
|
NAZARA_FORMAT_IMPLEM(unsigned long);
|
||||||
|
NAZARA_FORMAT_IMPLEM(unsigned long long);
|
||||||
|
NAZARA_FORMAT_IMPLEM(float);
|
||||||
|
NAZARA_FORMAT_IMPLEM(double);
|
||||||
|
NAZARA_FORMAT_IMPLEM(long double);
|
||||||
|
|
||||||
|
#undef NAZARA_FORMAT_IMPLEM
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NAZARA_TO_STRING_CPP_SPEC
|
||||||
|
}
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
|
||||||
// This file is part of the "Nazara Engine - Core module"
|
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
|
||||||
|
|
||||||
#include <Nazara/Core/ToString.hpp>
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <fmt/std.h>
|
|
||||||
#include <Nazara/Core/Debug.hpp>
|
|
||||||
|
|
||||||
namespace Nz
|
|
||||||
{
|
|
||||||
namespace Detail
|
|
||||||
{
|
|
||||||
std::string FormatFallback(std::string_view str)
|
|
||||||
{
|
|
||||||
return fmt::format(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string FormatFallback(std::string_view str, std::string_view param1)
|
|
||||||
{
|
|
||||||
return fmt::format(str, param1);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2)
|
|
||||||
{
|
|
||||||
return fmt::format(str, param1, param2);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2, std::string_view param3)
|
|
||||||
{
|
|
||||||
return fmt::format(str, param1, param2, param3);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2, std::string_view param3, std::string_view param4)
|
|
||||||
{
|
|
||||||
return fmt::format(str, param1, param2, param3, param4);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string FormatFallback(std::string_view str, std::string_view param1, std::string_view param2, std::string_view param3, std::string_view param4, std::string_view param5)
|
|
||||||
{
|
|
||||||
return fmt::format(str, param1, param2, param3, param4, param5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ToStringFormatter<std::filesystem::path>::Format(const std::filesystem::path& path)
|
|
||||||
{
|
|
||||||
return path.generic_u8string();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define NAZARA_TO_STRING_FMT_SPEC(Type) \
|
|
||||||
std::string ToStringFormatter<Type>::Format(Type value) \
|
|
||||||
{ \
|
|
||||||
return fmt::format("{}", value); \
|
|
||||||
}
|
|
||||||
|
|
||||||
NAZARA_TO_STRING_FMT_SPEC(float);
|
|
||||||
NAZARA_TO_STRING_FMT_SPEC(double);
|
|
||||||
NAZARA_TO_STRING_FMT_SPEC(long double);
|
|
||||||
|
|
||||||
#undef NAZARA_TO_STRING_CPP_SPEC
|
|
||||||
}
|
|
||||||
|
|
@ -495,7 +495,6 @@ namespace Nz
|
||||||
|
|
||||||
bool VulkanSwapchain::SetupRenderPass()
|
bool VulkanSwapchain::SetupRenderPass()
|
||||||
{
|
{
|
||||||
NazaraError("Test");
|
|
||||||
std::optional<PixelFormat> colorFormat = FromVulkan(m_surfaceFormat.format);
|
std::optional<PixelFormat> colorFormat = FromVulkan(m_surfaceFormat.format);
|
||||||
if (!colorFormat)
|
if (!colorFormat)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ SCENARIO("Error", "[CORE][ERROR]")
|
||||||
Nz::Error::Trigger(Nz::ErrorType::Internal, 2, "Error.cpp", "2nd place Internal", "ErrorType::{0}", "Internal");
|
Nz::Error::Trigger(Nz::ErrorType::Internal, 2, "Error.cpp", "2nd place Internal", "ErrorType::{0}", "Internal");
|
||||||
REQUIRE("ErrorType::Internal" == Nz::Error::GetLastError());
|
REQUIRE("ErrorType::Internal" == Nz::Error::GetLastError());
|
||||||
Nz::Error::Trigger(Nz::ErrorType::Normal, "ErrorType::{1}{0}", "mal", "Nor");
|
Nz::Error::Trigger(Nz::ErrorType::Normal, "ErrorType::{1}{0}", "mal", "Nor");
|
||||||
Nz::Error::Trigger(Nz::ErrorType::Normal, 2, "Error.cpp", "2nd place Normal", "ErrorType::{1}{0}", "rmal", "Nor");
|
Nz::Error::Trigger(Nz::ErrorType::Normal, 2, "Error.cpp", "2nd place Normal", "ErrorType::{1}{0}", "mal", "Nor");
|
||||||
REQUIRE("ErrorType::Normal" == Nz::Error::GetLastError());
|
REQUIRE("ErrorType::Normal" == Nz::Error::GetLastError());
|
||||||
Nz::Error::Trigger(Nz::ErrorType::Warning, "ErrorType::Warning");
|
Nz::Error::Trigger(Nz::ErrorType::Warning, "ErrorType::Warning");
|
||||||
Nz::Error::Trigger(Nz::ErrorType::Warning, "ErrorType::Warning", 2, "Error.cpp", "2nd place Warning");
|
Nz::Error::Trigger(Nz::ErrorType::Warning, "ErrorType::Warning", 2, "Error.cpp", "2nd place Warning");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue