3 This file is part of libmspstrings
4 Copyright © 2006-2008 Mikko Rasa
5 Distributed under the LGPL
8 #ifndef MSP_STRINGS_FMT_H_
9 #define MSP_STRINGS_FMT_H_
17 class format_error: public std::logic_error
20 format_error(const std::string &w): std::logic_error(w) { }
21 virtual ~format_error() throw() { }
26 Stores formatting information for converting variables into strings. Can be
27 applied to an std::ostream or fed to lexical_cast. Also used internally by
30 Formats can be constructed from printf-style conversion specifications, by
31 chaining calls to the various setter functions, or with a mixture of both.
33 Since type information for conversions is acquired through templates, the
34 meaning of the conversion specifier character is reduced to only specifying
35 what the conversion should look like. Of special note is the s conversion,
36 which will result in a default conversion for any data type. Size modifiers
37 are not supported and there is no difference between signed and unsigned
40 Some new conversions are supported:
42 b/B Binary integer conversion
43 P Uppercase pointer conversion (like %#X)
92 Fmt(const char *f) { reset(); parse(f); }
93 Fmt(const std::string &f) { reset(); parse(f.c_str()); }
96 void parse(const char *);
99 Fmt &width(unsigned w) { wd = w; return *this; }
100 Fmt &precision(unsigned p) { prec = p; return *this; }
101 Fmt &showpos(bool s=true) { spos = s; return *this; }
102 Fmt &fill(wchar_t f) { fillc = f; return *this; }
103 Fmt &fixed() { fmode = FIXED; return *this; }
104 Fmt &scientific() { fmode = SCI; return *this; }
105 Fmt &showpoint(bool s=true) { spoint = s; return *this; }
106 Fmt &showbase(bool s=true) { sbase = s; return *this; }
107 Fmt &left() { align = LEFT; return *this; }
108 Fmt &right() { align = RIGHT; return *this; }
109 Fmt &dec() { base = DEC; return *this; }
110 Fmt &hex() { base = HEX; return *this; }
111 Fmt &oct() { base = OCT; return *this; }
112 Fmt &bin() { base = BIN; return *this; }
113 Fmt &uppercase(bool u=true) { ucase = u; return *this; }
114 Fmt &numeric() { type = NUM; return *this; }
115 Fmt &character() { type = CHAR; return *this; }
116 Fmt &string() { type = STR; return *this; }
119 unsigned get_width() const { return wd; }
120 unsigned get_precision() const { return prec; }
121 bool get_showpos() const { return spos; }
122 wchar_t get_fill() const { return fillc; }
123 Base get_base() const { return base; }
124 bool get_showbase() const { return sbase; }
125 FloatMode get_floatmode() const { return fmode; }
126 bool get_showpoint() const { return spoint; }
127 Align get_align() const { return align; }
128 bool get_uppercase() const { return ucase; }
129 Type get_type() const { return type; }
131 void apply(std::ostream &) const;
134 inline std::ostream &operator<<(std::ostream &o, const Fmt &f)
135 { f.apply(o); return o; }