From 00775aa16ffa28fcd822aa02ce5f99e626b7e874 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Mon, 27 Jul 2020 19:13:04 +0200 Subject: Make auto conversion specifiers indepented of actual data, to allow constexpr determining --- cxxformat.hpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'cxxformat.hpp') diff --git a/cxxformat.hpp b/cxxformat.hpp index 064efbe..a5ff4ca 100644 --- a/cxxformat.hpp +++ b/cxxformat.hpp @@ -60,7 +60,7 @@ struct FormatConvert struct AutoConversion { - static bool conversion(const From &) + static bool conversion() { throw FormatException{""}; } @@ -69,7 +69,7 @@ struct AutoConversion template struct SimpleAutoConversion { - static constexpr char conversion(const From &) + static constexpr char conversion() { return Conversion; } @@ -202,13 +202,13 @@ namespace detail using string_or_string_view = typename StringOrStringViewHelper::type; template - constexpr char autoConversionSpecifier(From &&from, std::size_t index = 0) + constexpr char autoConversionSpecifier(std::size_t index = 0) { try { if constexpr (!allowFallback) { - if constexpr(!std::is_same_v>::conversion(std::forward(from)))>) + if constexpr(!std::is_same_v>::conversion())>) { if constexpr (std::is_pointer_v) { @@ -224,7 +224,7 @@ namespace detail } } } - return AutoConversion>::conversion(std::forward(from)); + return AutoConversion>::conversion(); } catch (const FormatException &) { @@ -334,11 +334,11 @@ namespace detail std::string conversion{fmt[++i]}; if(conversion.front() == 'v') { - conversion = autoConversionSpecifier(std::forward(arg), argumentIndex); + conversion = autoConversionSpecifier(argumentIndex); } else if(conversion.front() == 'V') { - conversion = autoConversionSpecifier(std::forward(arg), argumentIndex); + conversion = autoConversionSpecifier(argumentIndex); } auto continueFormatting = [directiveStart, &args..., fmt, &specification, &fieldWidth, &precision, i, conversion, argumentIndex](auto length, auto converted) @@ -590,9 +590,9 @@ namespace detail } template - constexpr char checkReplaceAutoConversion(Arg &&arg) + constexpr char checkReplaceAutoConversion() { - if constexpr (conversion == 'v' || conversion == 'V') return autoConversionSpecifier(std::forward(arg), argumentIndex); + if constexpr (conversion == 'v' || conversion == 'V') return autoConversionSpecifier(argumentIndex); else return conversion; } @@ -628,7 +628,7 @@ namespace detail constexpr auto havePrecision = get(fmt) == '.'; constexpr size_t iAfterPrecision = [havePrecision, iAfterFieldWidth]() -> size_t { if constexpr (havePrecision) return getNumberEnd(); else return iAfterFieldWidth; }(); - constexpr char conversion = checkReplaceAutoConversion(fmt), argumentIndex>(std::forward(arg)); + constexpr char conversion = checkReplaceAutoConversion(fmt), argumentIndex, Arg>(); if constexpr (conversion == 'c') return substr<0, i>(fmt).s + strprintf(makeDirective().s, convert(std::forward(arg), "character", argumentIndex)) + format_s(fmt), 0, argumentIndex + 1>(std::forward(args)...); else if constexpr (conversion == 'd' || conversion == 'i') return substr<0, i>(fmt).s + strprintf(makeDirective().s, convert(std::forward(arg), "signed integer", argumentIndex)) + format_s(fmt), 0, argumentIndex + 1>(std::forward(args)...); -- cgit v1.2.3-54-g00ecf