X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Fformat.h;h=ea5d5b070090c770671fc7821435a520e333321c;hp=9264b10bad1ec2b2f951065d3ee1562d8f033d27;hb=7be37ad97a2fd3494cb5d56badb45997353ff709;hpb=967785734be5c3fc6f75da122c2d93ebbb338271 diff --git a/source/strings/format.h b/source/strings/format.h index 9264b10..ea5d5b0 100644 --- a/source/strings/format.h +++ b/source/strings/format.h @@ -18,26 +18,53 @@ private: public: Formatter(const std::string &); + Formatter(const Formatter &); + Formatter &operator=(const Formatter &); /** Extracts the next conversion from the format string and formats the given value with it. Will throw if no more conversions are found. */ template Formatter &operator()(const T &a) { - result += lexical_cast(a, get_conversion()); + result += lexical_cast(a, get_conversion()); advance(); return *this; } +#if __cplusplus>=201103L + template + Formatter &operator()(const T &a, const Tail &... tail) + { + return (*this)(a)(tail...); + } +#endif + + /** Returns the result of the formatting operation. Will throw if not + enough values have been fed to the formatter. */ const std::string &str() const; + private: + /** Advances the iterator to the next conversion, adding literal characters + to the result. The iterator is left at the second character of the + conversion (i.e. after the %). */ void advance(); + + /** Reads the next conversion from the format string and returns a + corresponding Fmt object. */ Fmt get_conversion(); }; inline Formatter format(const std::string &f) { return Formatter(f); } +#if __cplusplus >= 201103L +template +inline std::string format(const std::string &f, const Args &... args) +{ + return Formatter(f)(args...).str(); +} + +#else template inline std::string format(const std::string &f, const A1 &a1) { return Formatter(f)(a1).str(); } @@ -57,6 +84,7 @@ inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, cons template inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5) { return Formatter(f)(a1)(a2)(a3)(a4)(a5).str(); } +#endif } // namespace Msp