#include <msp/debug/demangle.h>
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
#include "variant.h"
using namespace std;
--- /dev/null
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "format.h"
+
+using namespace std;
+
+namespace Msp {
+
+Formatter::Formatter(const string &f):
+ fmt(f),
+ pos(fmt.begin())
+{
+ advance();
+}
+
+/**
+Returns the result of the formatting operation. Will throw if not enough
+values have been fed to the formatter.
+*/
+const string &Formatter::str() const
+{
+ if(pos!=fmt.end())
+ throw Exception("Too few arguments for format");
+
+ return result;
+}
+
+/**
+Advances the pos 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 Formatter::advance()
+{
+ for(; pos!=fmt.end(); ++pos)
+ {
+ if(*pos=='%')
+ {
+ ++pos;
+ if(pos==fmt.end())
+ throw Exception("Malformed format string");
+ if(*pos!='%')
+ break;
+ }
+
+ result += *pos;
+ }
+}
+
+/**
+Reads the next conversion from the format string and returns a corresponding
+Fmt object.
+*/
+Fmt Formatter::get_conversion()
+{
+ if(pos==fmt.end())
+ throw Exception("Too many arguments for format");
+
+ string::iterator i = pos;
+ for(; i!=fmt.end(); ++i)
+ if(isalpha(*i))
+ break;
+
+ if(i==fmt.end())
+ throw Exception("Malformed format string");
+
+ ++i;
+ string c(pos, i);
+ pos = i;
+
+ return Fmt(c);
+}
+
+} // namespace Msp
--- /dev/null
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_FORMAT_H_
+#define MSP_STRINGS_FORMAT_H_
+
+#include <string>
+#include "lexicalcast.h"
+
+namespace Msp {
+
+/**
+Printf-like string formatter class.
+*/
+class Formatter
+{
+private:
+ std::string fmt;
+ std::string::iterator pos;
+ std::string result;
+
+public:
+ Formatter(const std::string &);
+
+ /** Extracts the next conversion from the format string and formats the
+ given value with it. Will throw if no more conversions are found. */
+ template<typename T>
+ Formatter &operator()(const T &a)
+ {
+ result += lexical_cast(a, get_conversion());
+ advance();
+ return *this;
+ }
+
+ const std::string &str() const;
+private:
+ void advance();
+ Fmt get_conversion();
+};
+
+inline Formatter format(const std::string &f)
+{ return Formatter(f); }
+
+template<typename A1>
+inline std::string format(const std::string &f, const A1 &a1)
+{ return Formatter(f)(a1).str(); }
+
+template<typename A1, typename A2>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2)
+{ return Formatter(f)(a1)(a2).str(); }
+
+template<typename A1, typename A2, typename A3>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3)
+{ return Formatter(f)(a1)(a2)(a3).str(); }
+
+template<typename A1, typename A2, typename A3, typename A4>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
+{ return Formatter(f)(a1)(a2)(a3)(a4).str(); }
+
+template<typename A1, typename A2, typename A3, typename A4, typename A5>
+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(); }
+
+} // namespace Msp
+
+#endif
+++ /dev/null
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "formatter.h"
-
-using namespace std;
-
-namespace Msp {
-
-Formatter::Formatter(const string &f):
- fmt(f),
- pos(fmt.begin())
-{
- advance();
-}
-
-/**
-Returns the result of the formatting operation. Will throw if not enough
-values have been fed to the formatter.
-*/
-const string &Formatter::str() const
-{
- if(pos!=fmt.end())
- throw Exception("Too few arguments for format");
-
- return result;
-}
-
-/**
-Advances the pos 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 Formatter::advance()
-{
- for(; pos!=fmt.end(); ++pos)
- {
- if(*pos=='%')
- {
- ++pos;
- if(pos==fmt.end())
- throw Exception("Malformed format string");
- if(*pos!='%')
- break;
- }
-
- result += *pos;
- }
-}
-
-/**
-Reads the next conversion from the format string and returns a corresponding
-Fmt object.
-*/
-Fmt Formatter::get_conversion()
-{
- if(pos==fmt.end())
- throw Exception("Too many arguments for format");
-
- string::iterator i = pos;
- for(; i!=fmt.end(); ++i)
- if(isalpha(*i))
- break;
-
- if(i==fmt.end())
- throw Exception("Malformed format string");
-
- ++i;
- string c(pos, i);
- pos = i;
-
- return Fmt(c);
-}
-
-} // namespace Msp
+++ /dev/null
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_FORMATTER_H_
-#define MSP_STRINGS_FORMATTER_H_
-
-#include <string>
-#include "lexicalcast.h"
-
-namespace Msp {
-
-/**
-Printf-like string formatter class.
-*/
-class Formatter
-{
-private:
- std::string fmt;
- std::string::iterator pos;
- std::string result;
-
-public:
- Formatter(const std::string &);
-
- /** Extracts the next conversion from the format string and formats the
- given value with it. Will throw if no more conversions are found. */
- template<typename T>
- Formatter &operator()(const T &a)
- {
- result += lexical_cast(a, get_conversion());
- advance();
- return *this;
- }
-
- const std::string &str() const;
-private:
- void advance();
- Fmt get_conversion();
-};
-
-inline Formatter format(const std::string &f)
-{ return Formatter(f); }
-
-template<typename A1>
-inline std::string format(const std::string &f, const A1 &a1)
-{ return Formatter(f)(a1).str(); }
-
-template<typename A1, typename A2>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2)
-{ return Formatter(f)(a1)(a2).str(); }
-
-template<typename A1, typename A2, typename A3>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3)
-{ return Formatter(f)(a1)(a2)(a3).str(); }
-
-template<typename A1, typename A2, typename A3, typename A4>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
-{ return Formatter(f)(a1)(a2)(a3)(a4).str(); }
-
-template<typename A1, typename A2, typename A3, typename A4, typename A5>
-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(); }
-
-} // namespace Msp
-
-#endif
#include <stack>
#include <limits>
#include <msp/core/except.h>
-#include "formatter.h"
+#include "format.h"
#include "regex.h"
using namespace std;