X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffmt.h;fp=source%2Ffmt.h;h=7dc605fd05086434d05def3a6165146033877f2b;hp=c4b46b5e3d86f599853c964ca02e5eb073e0e32d;hb=f5aa787e1a715867a8024816ccd58e9a4c7e23a4;hpb=08b94e4156f1444f196667a715bb0375ec97b931 diff --git a/source/fmt.h b/source/fmt.h index c4b46b5..7dc605f 100644 --- a/source/fmt.h +++ b/source/fmt.h @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspstrings -Copyright © 2006-2007 Mikko Rasa +Copyright © 2006-2008 Mikko Rasa Distributed under the LGPL */ @@ -23,43 +23,39 @@ 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. In particular, the d, i, u, c and s -conversions are no-ops. +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: - Fmt() { reset(); } - Fmt(const char *f) { reset(); parse(f); } - Fmt(const std::string &f) { reset(); parse(f.c_str()); } - 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 &uppercase(bool u=true) { ucase=u; return *this; } - Fmt &reset(); - void apply(std::ostream &) const; -private: + enum Type + { + NUM, + CHAR, + STR + }; + enum Base { - DEC, - HEX, - OCT + AUTOBASE = 0, + DEC = 10, + HEX = 16, + OCT = 8, + BIN = 2 }; enum FloatMode { FIXED, - EXP, + AUTOFLT, SCI }; @@ -69,6 +65,7 @@ private: RIGHT }; +private: unsigned wd; unsigned prec; bool spos; @@ -79,7 +76,47 @@ private: 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()); } + + 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; +private: void parse(const char *); };