summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2019-12-05 16:16:03 +0100
committerMarkus Mittendrein <git@maxmitti.tk>2019-12-05 16:16:03 +0100
commit637105947a6902813bdf829abb39077312b99f36 (patch)
treeaf46533b196b58e45e3d3c7b8354713cea289b06
parent1fd208995b70f943edc324e7f89ca57a402fa85a (diff)
downloadcxxformat-637105947a6902813bdf829abb39077312b99f36.tar.gz
cxxformat-637105947a6902813bdf829abb39077312b99f36.zip
Fix handling of multiple flags
-rw-r--r--cxxformat.hpp36
1 files changed, 19 insertions, 17 deletions
diff --git a/cxxformat.hpp b/cxxformat.hpp
index 1dd919e..79f16e5 100644
--- a/cxxformat.hpp
+++ b/cxxformat.hpp
@@ -287,20 +287,24 @@ namespace detail
checkFmtLength();
std::string specification{"%"};
- const auto flag = fmt[++i];
- if (flag == '%') // handle %% here
+ if (fmt[i + 1] == '%') // handle %% here
{
return std::string{fmt.substr(0, directiveStart + 1)} + format(fmt.substr(i + 1), argumentIndex, std::forward<Arg>(arg), std::forward<Args>(args)...);
}
- switch (flag)
+ while(i < fmtSize - 1)
{
- case '#': case '0': case '-': case ' ': case '+':
- specification.push_back(flag);
- checkFmtLength();
- break;
- default:
- --i;
+ switch (const auto flag = fmt[++i])
+ {
+ case '#': case '0': case '-': case ' ': case '+':
+ specification.push_back(flag);
+ checkFmtLength();
+ break;
+ default:
+ --i;
+ goto afterFlagLoop;
+ }
}
+ afterFlagLoop:
std::string tempNumber;
// field width
@@ -570,12 +574,12 @@ namespace detail
else return format_s<fmt, i + 1, argumentIndex>();
}
- template<auto fmt, size_t i>
- constexpr std::pair<char, size_t> getFlag()
+ template<auto fmt, size_t i, size_t offset = 0>
+ constexpr size_t getFlagEnd()
{
- constexpr char next = get<i>(fmt);
- if constexpr (next == '#' || next == '0' || next == '-' || next == ' ' || next == '+') return {next, i + 1};
- else return {0, i};
+ constexpr char next = get<i + offset>(fmt);
+ if constexpr (next == '#' || next == '0' || next == '-' || next == ' ' || next == '+') return getFlagEnd<fmt, i, offset + 1>();
+ else return i + offset;
}
template<auto fmt, size_t i>
@@ -618,9 +622,7 @@ namespace detail
{
if constexpr (get<i + 1>(fmt) == '%') return substr<0, i, true>(fmt).s + format_s<substr<i + 2>(fmt), 0, argumentIndex>(std::forward<Arg>(arg), std::forward<Args>(args)...);
- constexpr auto flagData = getFlag<fmt, i + 1>();
- constexpr char flag = flagData.first;
- constexpr char iAfterFlag = flagData.second;
+ constexpr char iAfterFlag = getFlagEnd<fmt, i + 1>();
constexpr size_t iAfterFieldWidth = getNumberEnd<fmt, iAfterFlag>();
constexpr auto havePrecision = get<iAfterFieldWidth>(fmt) == '.';