diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | include/fud_format.hpp | 171 | ||||
-rw-r--r-- | include/fud_print.hpp | 2 | ||||
-rw-r--r-- | include/fud_result.hpp | 6 | ||||
-rw-r--r-- | source/fud_assert.cpp | 1 | ||||
-rw-r--r-- | source/fud_print.cpp | 2 | ||||
-rw-r--r-- | test/test_format.cpp | 85 |
7 files changed, 126 insertions, 143 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 27aa6dd..a72b6ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ if(${CMAKE_VERSION} VERSION_LESS 3.12) endif() project(libfud - VERSION 0.43.0 + VERSION 0.44.0 DESCRIPTION "Library of FUD" LANGUAGES CXX) diff --git a/include/fud_format.hpp b/include/fud_format.hpp index 4536d69..bd44d26 100644 --- a/include/fud_format.hpp +++ b/include/fud_format.hpp @@ -20,8 +20,8 @@ // #include "fud_assert.hpp" #include "dragonbox/dragonbox.h" -#include "fud_drain.hpp" #include "fud_array.hpp" +#include "fud_drain.hpp" #include "fud_option.hpp" #include "fud_result.hpp" #include "fud_status.hpp" @@ -31,9 +31,9 @@ #include "fud_utf8.hpp" #include <cstdint> +#include <cstdio> #include <limits> #include <variant> -#include <cstdio> namespace fud { @@ -44,7 +44,7 @@ constexpr size_t maxIntCharCount = (bitsPerOctal * sizeof(uint64_t)) + 4; struct FormatString { template <size_t N> // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) - consteval FormatString(const utf8 (&input)[N]) : m_size{N - 1}, m_data{input} + consteval FormatString(const utf8 (&input)[N]) : m_size{N - 1}, m_data{input} { static_assert(N > 0); } @@ -279,86 +279,82 @@ using FormatResult = DrainResult; /* TODO : require concept of a sink that takes pushBack() -> FudStatus */ /* TODO : sink concept also requires drain() -> FudStatus */ -template <typename Sink> requires Drainable<Sink, StringView> -FormatResult format(Sink& sink, FormatCharMode formatMode, FormatString fmt); +template <typename Sink> + requires Drainable<Sink, StringView> +FormatResult format(Sink& sink, FormatString fmt); -template <typename Sink, typename... Args> requires Drainable<Sink, StringView> -FormatResult format(Sink& sink, FormatCharMode formatMode, FormatString fmt, Args&&... args); +template <typename Sink, typename... Args> + requires Drainable<Sink, StringView> +FormatResult format(Sink& sink, FormatString fmt, Args&&... args); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, bool arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, bool arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, char arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, char arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, utf8 arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, utf8 arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, int32_t arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, int32_t arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, uint32_t arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, uint32_t arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, int64_t arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, int64_t arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, uint64_t arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, uint64_t arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, float arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, float arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, double arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, double arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, long double arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, long double arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, const utf8* arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, const utf8* arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, const char* arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, const char* arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, StringView arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, StringView arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, const void* arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, const void* arg); template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, impl::FormatHandle arg); +FormatResult format(Sink& sink, const FormatSpec& formatSpec, impl::FormatHandle arg); namespace impl { template <typename Sink, size_t Size> -FormatResult vFormat(Sink& sink, FormatCharMode formatMode, FormatString fmt, const FormatArguments<Size>& args); +FormatResult vFormat(Sink& sink, FormatString fmt, const FormatArguments<Size>& args); size_t findSpec(StringView scanView); } // namespace impl -template <typename Sink, typename... Args> requires Drainable<Sink, StringView> -FormatResult format(Sink& sink, FormatCharMode formatMode, FormatString fmt, Args&&... args) +template <typename Sink, typename... Args> + requires Drainable<Sink, StringView> +FormatResult format(Sink& sink, FormatString fmt, Args&&... args) { - if (formatMode != FormatCharMode::Unchecked) { - return {0, FudStatus::NotImplemented}; - } - constexpr size_t numArgs = sizeof...(args); auto formatArguments{FormatArguments<numArgs>::makeFormatArguments(std::forward<Args>(args)...)}; - return impl::vFormat(sink, formatMode, fmt, formatArguments); + return impl::vFormat(sink, fmt, formatArguments); } -template <typename Sink> requires Drainable<Sink, StringView> -FormatResult format(Sink& sink, FormatCharMode formatMode, FormatString fmt) +template <typename Sink> + requires Drainable<Sink, StringView> +FormatResult format(Sink& sink, FormatString fmt) { - if (formatMode != FormatCharMode::Unchecked) { - return {0, FudStatus::NotImplemented}; - } - auto scanView = fmt.view(); auto specIndex = impl::findSpec(scanView); if (specIndex < scanView.length()) { @@ -398,7 +394,7 @@ FudStatus vFormatPrepareNonPositionalSpec( const uint32_t& argIndex); template <typename Sink, size_t Size> -FormatResult vFormat(Sink& sink, FormatCharMode formatMode, FormatString fmt, const FormatArguments<Size>& args) +FormatResult vFormat(Sink& sink, FormatString fmt, const FormatArguments<Size>& args) { FormatResult result{0, FudStatus::Success}; auto scanView = fmt.view(); @@ -448,7 +444,7 @@ FormatResult vFormat(Sink& sink, FormatCharMode formatMode, FormatString fmt, co return result; } auto argResult{std::visit( - [&](const auto& arg) -> FormatResult { return format(sink, formatMode, formatSpec, arg); }, + [&](const auto& arg) -> FormatResult { return format(sink, formatSpec, arg); }, args[formatArgIndex])}; if (argResult.status != FudStatus::Success) { result.status = argResult.status; @@ -801,9 +797,8 @@ StringView getSign(FormatSign formatSign, T arg) template <typename Sink, typename T> requires std::is_integral_v<T> and std::is_scalar_v<T> -[[nodiscard]] FormatResult formatIntegral(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, T arg) +[[nodiscard]] FormatResult formatIntegral(Sink& sink, const FormatSpec& formatSpec, T arg) { - static_cast<void>(formatMode); FormatResult result{0, FudStatus::Success}; if (formatSpec.takesPrecision || formatSpec.precision != FormatSpec::precisionUnspecified) { result.status = FudStatus::FormatInvalid; @@ -862,7 +857,6 @@ FudStatus fillIntegralBuffer( } } if (formatType == FormatType::Character) { - // return format(sink, formatMode, formatSpec, static_cast<utf8>(arg)); if constexpr (std::is_signed_v<T>) { if (arg < 0) { return FudStatus::FormatInvalid; @@ -1024,7 +1018,7 @@ FormatResult rightPad(Sink& sink, FormatAlign::Value align, size_t width, utf8 f [[nodiscard]] Result<bool, FudStatus> validateFloatFormatType(FormatType formatType); template <typename Sink> -[[nodiscard]] FormatResult formatNAN(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, bool negative) +[[nodiscard]] FormatResult formatNAN(Sink& sink, const FormatSpec& formatSpec, bool negative) { auto uppercaseResult = validateFloatFormatType(formatSpec.formatType); if (uppercaseResult.isError()) { @@ -1050,11 +1044,11 @@ template <typename Sink> FormatSpec newSpec{}; newSpec.width = formatSpec.width; newSpec.fill = formatSpec.fill; - return format(sink, formatMode, newSpec, output); + return format(sink, newSpec, output); } template <typename Sink> -[[nodiscard]] FormatResult formatINF(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, bool negative) +[[nodiscard]] FormatResult formatINF(Sink& sink, const FormatSpec& formatSpec, bool negative) { auto uppercaseResult = validateFloatFormatType(formatSpec.formatType); if (uppercaseResult.isError()) { @@ -1080,18 +1074,13 @@ template <typename Sink> FormatSpec newSpec{}; newSpec.width = formatSpec.width; newSpec.fill = formatSpec.fill; - return format(sink, formatMode, newSpec, output); + return format(sink, newSpec, output); } template <typename Sink> -[[nodiscard]] FormatResult formatZero( - Sink& sink, - FormatCharMode formatMode, - const FormatSpec& formatSpec, - bool negative) +[[nodiscard]] FormatResult formatZero(Sink& sink, const FormatSpec& formatSpec, bool negative) { FormatResult result{0, FudStatus::NotImplemented}; - static_cast<void>(formatMode); static_cast<void>(sink); static_cast<void>(formatSpec); static_cast<void>(negative); @@ -1135,9 +1124,7 @@ void fillScientificBuffer(IntCharArray& buffer, Significand significand, uint8_t } } - forEach(Span<utf8>{buffer.data(), bufferLength}, [&](uint8_t digit) { - return static_cast<uint8_t>(digit + '0'); - }); + forEach(Span<utf8>{buffer.data(), bufferLength}, [&](uint8_t digit) { return static_cast<uint8_t>(digit + '0'); }); for (size_t idx = 0; idx < bufferLength / 2; ++idx) { auto rhsIndex = bufferLength - idx - 1; @@ -1256,15 +1243,15 @@ template <typename Sink, typename DecimalRepr> template <typename Sink, typename T> requires std::is_floating_point_v<T> and std::is_scalar_v<T> -[[nodiscard]] FormatResult formatFloat(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, T arg) +[[nodiscard]] FormatResult formatFloat(Sink& sink, const FormatSpec& formatSpec, T arg) { switch (std::fpclassify(arg)) { case FP_INFINITE: - return formatINF(sink, formatMode, formatSpec, std::signbit(arg)); + return formatINF(sink, formatSpec, std::signbit(arg)); case FP_NAN: - return formatNAN(sink, formatMode, formatSpec, std::signbit(arg)); + return formatNAN(sink, formatSpec, std::signbit(arg)); case FP_ZERO: - return formatZero(sink, formatMode, formatSpec, std::signbit(arg)); + return formatZero(sink, formatSpec, std::signbit(arg)); default: break; } @@ -1320,7 +1307,7 @@ template <typename Sink, typename T> } // namespace impl template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, bool arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, bool arg) { FormatSpec boolSpec = formatSpec; if (formatSpec.formatType == FormatType::Unspecified || formatSpec.formatType == FormatType::String) { @@ -1328,65 +1315,64 @@ FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& for if (not arg) { view = StringView{"false"}; } - return format(sink, formatMode, boolSpec, view); + return format(sink, boolSpec, view); } boolSpec.formatType = FormatType::Unspecified; - return impl::formatIntegral(sink, formatMode, boolSpec, static_cast<uint8_t>(arg)); + return impl::formatIntegral(sink, boolSpec, static_cast<uint8_t>(arg)); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, utf8 arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, utf8 arg) { - return impl::formatIntegral(sink, formatMode, formatSpec, arg); + return impl::formatIntegral(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, char arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, char arg) { - return impl::formatIntegral(sink, formatMode, formatSpec, arg); + return impl::formatIntegral(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, int32_t arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, int32_t arg) { - return impl::formatIntegral(sink, formatMode, formatSpec, arg); + return impl::formatIntegral(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, uint32_t arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, uint32_t arg) { - return impl::formatIntegral(sink, formatMode, formatSpec, arg); + return impl::formatIntegral(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, int64_t arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, int64_t arg) { - return impl::formatIntegral(sink, formatMode, formatSpec, arg); + return impl::formatIntegral(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, uint64_t arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, uint64_t arg) { - return impl::formatIntegral(sink, formatMode, formatSpec, arg); + return impl::formatIntegral(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, float arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, float arg) { - return impl::formatFloat(sink, formatMode, formatSpec, arg); + return impl::formatFloat(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, double arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, double arg) { - return impl::formatFloat(sink, formatMode, formatSpec, arg); + return impl::formatFloat(sink, formatSpec, arg); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, long double arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, long double arg) { FormatResult result{0, FudStatus::NotImplemented}; - static_cast<void>(formatMode); static_cast<void>(sink); static_cast<void>(formatSpec); static_cast<void>(arg); @@ -1394,13 +1380,13 @@ FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& for } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, const utf8* arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, const utf8* arg) { - return format(sink, formatMode, formatSpec, std::bit_cast<const char*>(arg)); + return format(sink, formatSpec, std::bit_cast<const char*>(arg)); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, const char* arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, const char* arg) { if (arg == nullptr) { return {0, FudStatus::NullPointer}; @@ -1410,19 +1396,15 @@ FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& for return {0, FudStatus::StringInvalid}; } auto stringLength = static_cast<size_t>(stringLengthResult); - return format(sink, formatMode, formatSpec, StringView{stringLength, arg}); + return format(sink, formatSpec, StringView{stringLength, arg}); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, StringView arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, StringView arg) { /* TODO: implement unicode points, check with formatMode */ FormatResult result{0, FudStatus::Success}; - if (formatMode != FormatCharMode::Unchecked) { - result.status = FudStatus::NotSupported; - return result; - } if (formatSpec.formatType != FormatType::Unspecified && formatSpec.formatType != FormatType::String && formatSpec.formatType != FormatType::Escaped) { @@ -1457,8 +1439,6 @@ FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& for return result; } - // printf("From format(sink, mode, spec, stringview arg): Arg contents are %p %zu?\n\n", arg.c_str(), arg.length()); - // printf("From format(sink, mode, spec, stringview arg): What?\n%s\n", std::format("{}", std::string_view{arg.c_str(), arg.length()}).c_str()); auto drainViewResult = sink.drain(arg); result.bytesDrained += drainViewResult.bytesDrained; result.status = drainViewResult.status; @@ -1475,10 +1455,10 @@ FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& for } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, const void* arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, const void* arg) { auto pointerFormatSpec = formatSpec; - if (pointerFormatSpec.formatType == FormatType::Unspecified || + if (pointerFormatSpec.formatType == FormatType::Unspecified || pointerFormatSpec.formatType == FormatType::PointerLower) { pointerFormatSpec.formatType = FormatType::HexLower; } else if (pointerFormatSpec.formatType == FormatType::PointerUpper) { @@ -1492,19 +1472,18 @@ FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& for return DrainResult{0, FudStatus::FormatInvalid}; } pointerFormatSpec.alternateForm = true; - return impl::formatIntegral(sink, formatMode, pointerFormatSpec, std::bit_cast<uintptr_t>(arg)); + return impl::formatIntegral(sink, pointerFormatSpec, std::bit_cast<uintptr_t>(arg)); } template <typename Sink> -FormatResult format(Sink& sink, FormatCharMode formatMode, const FormatSpec& formatSpec, impl::FormatHandle arg) +FormatResult format(Sink& sink, const FormatSpec& formatSpec, impl::FormatHandle arg) { // FormatResult result{0, FudStatus::NotImplemented}; static_cast<void>(sink); - static_cast<void>(formatMode); static_cast<void>(formatSpec); static_cast<void>(arg); - return format(sink, formatMode, formatSpec, "not implemented"); + return format(sink, formatSpec, "not implemented"); } } // namespace fud diff --git a/include/fud_print.hpp b/include/fud_print.hpp index a8e61de..13b8a52 100644 --- a/include/fud_print.hpp +++ b/include/fud_print.hpp @@ -32,7 +32,7 @@ template <typename... Args> FormatResult print(FormatString fmt, Args&&... args) { StdOutSink outSink{}; - return format(outSink, FormatCharMode::Unchecked, fmt, std::forward<Args>(args)...); + return format(outSink, fmt, std::forward<Args>(args)...); } inline void debugPrint(FormatString fmt) diff --git a/include/fud_result.hpp b/include/fud_result.hpp index 4e08323..ad5509f 100644 --- a/include/fud_result.hpp +++ b/include/fud_result.hpp @@ -203,6 +203,12 @@ class [[nodiscard]] Result { return *std::bit_cast<const T*>(m_data.data()); } + [[nodiscard]] constexpr T& getMutOkay() & + { + fudAssert(isOkay()); + return *std::bit_cast<T*>(m_data.data()); + } + [[nodiscard]] constexpr const T& getOkayOr(const T& alternative) const& { if (!isOkay()) { diff --git a/source/fud_assert.cpp b/source/fud_assert.cpp index 64b3275..82230b9 100644 --- a/source/fud_assert.cpp +++ b/source/fud_assert.cpp @@ -63,7 +63,6 @@ void assertFailMessage(const char* assertion, const std::source_location sourceL } static_cast<void>(format( sink, - FormatCharMode::Unchecked, u8"{}:{}:{}: {}\n", fileName, functionName, diff --git a/source/fud_print.cpp b/source/fud_print.cpp index 6b7bac1..65041e9 100644 --- a/source/fud_print.cpp +++ b/source/fud_print.cpp @@ -45,7 +45,7 @@ DrainResult StdOutSink::drain(StringView source) FormatResult print(FormatString fmt) { StdOutSink outSink{}; - return format(outSink, FormatCharMode::Unchecked, fmt); + return outSink.drain(fmt.view()); } } // namespace fud diff --git a/test/test_format.cpp b/test/test_format.cpp index 0c5c520..d70db34 100644 --- a/test/test_format.cpp +++ b/test/test_format.cpp @@ -17,7 +17,7 @@ #include "fud_format.hpp" #include "fud_string_view.hpp" -#include "fud_print.hpp" +// #include "fud_print.hpp" #include "gtest/gtest.h" #include <format> @@ -418,13 +418,13 @@ TEST(FormatTest, NoArgFormatTest) { String sink{}; auto expected = std::format("Test"); - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"Test"); + auto formatResult = format(sink, u8"Test"); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format(""); - formatResult = format(sink, FormatCharMode::Unchecked, u8""); + formatResult = format(sink, u8""); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); } @@ -432,66 +432,66 @@ TEST(FormatTest, NoArgFormatTest) TEST(FormatTest, OneNumberFormatTest) { String sink{}; - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"Test {:}", 42U); + auto formatResult = format(sink, u8"Test {:}", 42U); EXPECT_TRUE(formatResult.isOkay()); ASSERT_EQ(sink.clear(), FudStatus::Success); auto expected = std::format("{:6}", 42U); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:6}", 42U); + formatResult = format(sink, u8"{:6}", 42U); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:*<6}", std::numeric_limits<uint64_t>::max()); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:*<6}", std::numeric_limits<uint64_t>::max()); + formatResult = format(sink, u8"{:*<6}", std::numeric_limits<uint64_t>::max()); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:*<6}", std::numeric_limits<int64_t>::min()); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:*<6}", std::numeric_limits<int64_t>::min()); + formatResult = format(sink, u8"{:*<6}", std::numeric_limits<int64_t>::min()); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:}", std::numeric_limits<int8_t>::min()); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:}", std::numeric_limits<int8_t>::min()); + formatResult = format(sink, u8"{:}", std::numeric_limits<int8_t>::min()); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:#X}", std::numeric_limits<int8_t>::min()); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:#X}", std::numeric_limits<int8_t>::min()); + formatResult = format(sink, u8"{:#X}", std::numeric_limits<int8_t>::min()); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:*<6}", 42U); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:*<6}", 42U); + formatResult = format(sink, u8"{:*<6}", 42U); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:*>6}", 42U); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:*>6}", 42U); + formatResult = format(sink, u8"{:*>6}", 42U); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:*^6}", 42U); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:*^6}", 42U); + formatResult = format(sink, u8"{:*^6}", 42U); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:*<6}", 'x'); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:*<6}", 'x'); + formatResult = format(sink, u8"{:*<6}", 'x'); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:6d}", 'x'); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:6d}", 'x'); + formatResult = format(sink, u8"{:6d}", 'x'); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); } @@ -502,7 +502,7 @@ TEST(FormatTest, OneBoolFormatTest) ASSERT_EQ(sink.clear(), FudStatus::Success); auto expected = std::format("{:6}", true); - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"{:6}", true); + auto formatResult = format(sink, u8"{:6}", true); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); } @@ -514,13 +514,13 @@ TEST(FormatTest, OneFloatFormatUnspecifiedTest) ASSERT_EQ(sink.clear(), FudStatus::Success); auto expected = std::format("{:}", 42.0); - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"{:}", 42.0); + auto formatResult = format(sink, u8"{:}", 42.0); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("{:1.0}", 42.0); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.0}", 42.0); + formatResult = format(sink, u8"{:1.0}", 42.0); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.0}", 42.0); @@ -538,73 +538,73 @@ TEST(FormatTest, OneFloatFormatScientificTest) ASSERT_EQ(sink.clear(), FudStatus::Success); auto expected = std::format("{:e}", 42.0); - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"{:e}", 42.0); + auto formatResult = format(sink, u8"{:e}", 42.0); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.2e}", 0.99); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.2e}", 0.99); + formatResult = format(sink, u8"{:1.2e}", 0.99); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.1e}", 0.99); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.1e}", 0.99); + formatResult = format(sink, u8"{:1.1e}", 0.99); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.0e}", 0.99); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.0e}", 0.99); + formatResult = format(sink, u8"{:1.0e}", 0.99); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.0e}", -0.99); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.0e}", -0.99); + formatResult = format(sink, u8"{:1.0e}", -0.99); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.0e}", 42.0); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.0e}", 42.0); + formatResult = format(sink, u8"{:1.0e}", 42.0); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.0e}", 4.20e-5); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.0e}", 4.20e-5); + formatResult = format(sink, u8"{:1.0e}", 4.20e-5); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("{:1.0e}", -4.20e-5); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"{:1.0e}", -4.20e-5); + formatResult = format(sink, u8"{:1.0e}", -4.20e-5); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:e}", 3.14); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:e}", 3.14); + formatResult = format(sink, u8"e {:e}", 3.14); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("E {:E}", 3.14); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"E {:E}", 3.14); + formatResult = format(sink, u8"E {:E}", 3.14); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:.0e}", 3.14); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:.0e}", 3.14); + formatResult = format(sink, u8"e {:.0e}", 3.14); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:+#010.0e}", 3.14); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:+#010.0e}", 3.14); + formatResult = format(sink, u8"e {:+#010.0e}", 3.14); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); @@ -613,31 +613,31 @@ TEST(FormatTest, OneFloatFormatScientificTest) expected = std::format("e {:.0e}", maxVal / 4); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:.0e}", maxVal / 4); + formatResult = format(sink, u8"e {:.0e}", maxVal / 4); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:.0e}", maxVal / 2); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:.0e}", maxVal / 2); + formatResult = format(sink, u8"e {:.0e}", maxVal / 2); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:.0e}", maxVal); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:.0e}", maxVal); + formatResult = format(sink, u8"e {:.0e}", maxVal); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:.0e}", std::numeric_limits<double>::min()); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:.0e}", std::numeric_limits<double>::min()); + formatResult = format(sink, u8"e {:.0e}", std::numeric_limits<double>::min()); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("e {:.0e}", subNormMin); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"e {:.0e}", subNormMin); + formatResult = format(sink, u8"e {:.0e}", subNormMin); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); @@ -645,7 +645,7 @@ TEST(FormatTest, OneFloatFormatScientificTest) expected = std::format("E#+ {:+#060.50E}", val); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"E#+ {:+#060.50E}", val); + formatResult = format(sink, u8"E#+ {:+#060.50E}", val); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); // Which is: "E#+ +0003.0000000000000000000000000000000000E+00" @@ -654,19 +654,19 @@ TEST(FormatTest, OneFloatFormatScientificTest) /* expected = std::format("E#+ {:Z>+#060.30E}", val); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"E#+ {:Z>+#060.30E}", val); + formatResult = format(sink, u8"E#+ {:Z>+#060.30E}", val); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("E#+ {:Z<+#060.30E}", val); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"E#+ {:Z<+#060.30E}", val); + formatResult = format(sink, u8"E#+ {:Z<+#060.30E}", val); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); expected = std::format("E#+ {:Z^+#060.30E}", val); ASSERT_EQ(sink.clear(), FudStatus::Success); - formatResult = format(sink, FormatCharMode::Unchecked, u8"E#+ {:Z^+#060.30E}", val); + formatResult = format(sink, u8"E#+ {:Z^+#060.30E}", val); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); */ @@ -701,13 +701,13 @@ TEST(FormatTest, TwoArgFormatTest) { String sink{}; auto expected = std::format("Test {:} {:}", 1U, false); - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"Test {:} {:}", 1U, false); + auto formatResult = format(sink, u8"Test {:} {:}", 1U, false); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); expected = std::format("Test {:} {:}", 1U, "Hello"); - formatResult = format(sink, FormatCharMode::Unchecked, u8"Test {:} {:}", 1U, u8"Hello"); + formatResult = format(sink, u8"Test {:} {:}", 1U, u8"Hello"); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); } @@ -716,14 +716,13 @@ TEST(FormatTest, StringView) { String sink{}; auto expected = std::format("Test {}", std::string_view{"Hello, World!"}); - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"Test {}", StringView{u8"Hello, World!"}); + auto formatResult = format(sink, u8"Test {}", StringView{u8"Hello, World!"}); EXPECT_TRUE(formatResult.isOkay()); EXPECT_STREQ(sink.c_str(), expected.c_str()); ASSERT_EQ(sink.clear(), FudStatus::Success); formatResult = fud::format( sink, - fud::FormatCharMode::Unchecked, u8"CREATE TABLE IF NOT EXISTS {} ({} {} {});", StringView{u8"AtomicSymbol"}.as_string_view(), StringView{u8"AtomicNumber INTEGER PRIMARY KEY"}.as_string_view(), @@ -742,7 +741,7 @@ TEST(FormatTest, StringView) TEST(FormatTest, NumArgs) { String sink{}; - auto formatResult = format(sink, FormatCharMode::Unchecked, u8"Test {} {} {}", StringView{u8"Hello, World!"}); + auto formatResult = format(sink, u8"Test {} {} {}", StringView{u8"Hello, World!"}); ASSERT_EQ(formatResult.status, FudStatus::FormatInvalid); } |