X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Ffmt.h;fp=source%2Fstrings%2Ffmt.h;h=ba75958802b7760b6f6b352827e4f313048e717f;hp=0000000000000000000000000000000000000000;hb=b42ed73a1b241c0e93ee03c43c4584b41c549bac;hpb=5b1368cb791cab043f0435628cacbaff36e39b7b diff --git a/source/strings/fmt.h b/source/strings/fmt.h new file mode 100644 index 0000000..ba75958 --- /dev/null +++ b/source/strings/fmt.h @@ -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 +#include + +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