]> git.tdb.fi Git - libs/core.git/blobdiff - source/strings/fmt.h
Move files around to prepare for assimilation into core
[libs/core.git] / source / strings / fmt.h
diff --git a/source/strings/fmt.h b/source/strings/fmt.h
new file mode 100644 (file)
index 0000000..ba75958
--- /dev/null
@@ -0,0 +1,130 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_FMT_H_
+#define MSP_STRINGS_FMT_H_
+
+#include <ostream>
+#include <string>
+
+namespace Msp {
+
+/**
+Stores formatting information for converting variables into strings.  Can be
+applied to an std::ostream or fed to lexical_cast.  Also used internally by
+Formatter.
+
+Formats can be constructed from printf-style conversion specifications, by
+chaining calls to the various setter functions, or with a mixture of both.
+
+Since type information for conversions is acquired through templates, the
+meaning of the conversion specifier character is reduced to only specifying
+what the conversion should look like.  Of special note is the s conversion,
+which will result in a default conversion for any data type.  Size modifiers
+are not supported and there is no difference between signed and unsigned
+conversions.
+
+Some new conversions are supported:
+
+  b/B  Binary integer conversion
+  P    Uppercase pointer conversion (like %#X)
+*/
+class Fmt
+{
+public:
+       enum Type
+       {
+               NUM,
+               CHAR,
+               STR
+       };
+
+       enum Base
+       {
+               AUTOBASE = 0,
+               DEC = 10,
+               HEX = 16,
+               OCT = 8,
+               BIN = 2
+       };
+
+       enum FloatMode
+       {
+               FIXED,
+               AUTOFLT,
+               SCI
+       };
+
+       enum Align
+       {
+               LEFT,
+               RIGHT
+       };
+
+private:
+       unsigned wd;
+       unsigned prec;
+       bool spos;
+       wchar_t fillc;
+       Base base;
+       bool sbase;
+       FloatMode fmode;
+       bool spoint;
+       Align align;
+       bool ucase;
+       Type type;
+
+public:
+       Fmt() { reset(); }
+       Fmt(const char *f) { reset(); parse(f); }
+       Fmt(const std::string &f) { reset(); parse(f.c_str()); }
+
+private:
+       void parse(const char *);
+
+public:
+       Fmt &width(unsigned w) { wd = w; return *this; }
+       Fmt &precision(unsigned p) { prec = p; return *this; }
+       Fmt &showpos(bool s=true) { spos = s; return *this; }
+       Fmt &fill(wchar_t f) { fillc = f; return *this; }
+       Fmt &fixed() { fmode = FIXED; return *this; }
+       Fmt &scientific() { fmode = SCI; return *this; }
+       Fmt &showpoint(bool s=true) { spoint = s; return *this; }
+       Fmt &showbase(bool s=true) { sbase = s; return *this; }
+       Fmt &left() { align = LEFT; return *this; }
+       Fmt &right() { align = RIGHT; return *this; }
+       Fmt &dec() { base = DEC; return *this; }
+       Fmt &hex() { base = HEX; return *this; }
+       Fmt &oct() { base = OCT; return *this; }
+       Fmt &bin() { base = BIN; return *this; }
+       Fmt &uppercase(bool u=true) { ucase = u; return *this; }
+       Fmt &numeric() { type = NUM; return *this; }
+       Fmt &character() { type = CHAR; return *this; }
+       Fmt &string() { type = STR; return *this; }
+       Fmt &reset();
+
+       unsigned get_width() const { return wd; }
+       unsigned get_precision() const { return prec; }
+       bool get_showpos() const { return spos; }
+       wchar_t get_fill() const { return fillc; }
+       Base get_base() const { return base; }
+       bool get_showbase() const { return sbase; }
+       FloatMode get_floatmode() const { return fmode; }
+       bool get_showpoint() const { return spoint; }
+       Align get_align() const { return align; }
+       bool get_uppercase() const { return ucase; }
+       Type get_type() const { return type; }
+
+       void apply(std::ostream &) const;
+};
+
+inline std::ostream &operator<<(std::ostream &o, const Fmt &f)
+{ f.apply(o); return o; }
+
+} // namespace Msp
+
+#endif