|
|
|
@ -495,7 +495,11 @@ namespace detail {
@@ -495,7 +495,11 @@ namespace detail {
|
|
|
|
|
class FormatArg |
|
|
|
|
{ |
|
|
|
|
public: |
|
|
|
|
FormatArg() {} |
|
|
|
|
FormatArg() |
|
|
|
|
: m_value(nullptr), |
|
|
|
|
m_formatImpl(nullptr), |
|
|
|
|
m_toIntImpl(nullptr) |
|
|
|
|
{ } |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
explicit FormatArg(const T& value) |
|
|
|
@ -507,11 +511,15 @@ class FormatArg
@@ -507,11 +511,15 @@ class FormatArg
|
|
|
|
|
void format(std::ostream& out, const char* fmtBegin, |
|
|
|
|
const char* fmtEnd, int ntrunc) const |
|
|
|
|
{ |
|
|
|
|
assert(m_value); |
|
|
|
|
assert(m_formatImpl); |
|
|
|
|
m_formatImpl(out, fmtBegin, fmtEnd, ntrunc, m_value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int toInt() const |
|
|
|
|
{ |
|
|
|
|
assert(m_value); |
|
|
|
|
assert(m_toIntImpl); |
|
|
|
|
return m_toIntImpl(m_value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -712,23 +720,27 @@ inline const char* streamStateFromFormat(std::ostream& out, bool& spacePadPositi
@@ -712,23 +720,27 @@ inline const char* streamStateFromFormat(std::ostream& out, bool& spacePadPositi
|
|
|
|
|
break; |
|
|
|
|
case 'X': |
|
|
|
|
out.setf(std::ios::uppercase); |
|
|
|
|
// Falls through
|
|
|
|
|
case 'x': case 'p': |
|
|
|
|
out.setf(std::ios::hex, std::ios::basefield); |
|
|
|
|
intConversion = true; |
|
|
|
|
break; |
|
|
|
|
case 'E': |
|
|
|
|
out.setf(std::ios::uppercase); |
|
|
|
|
// Falls through
|
|
|
|
|
case 'e': |
|
|
|
|
out.setf(std::ios::scientific, std::ios::floatfield); |
|
|
|
|
out.setf(std::ios::dec, std::ios::basefield); |
|
|
|
|
break; |
|
|
|
|
case 'F': |
|
|
|
|
out.setf(std::ios::uppercase); |
|
|
|
|
// Falls through
|
|
|
|
|
case 'f': |
|
|
|
|
out.setf(std::ios::fixed, std::ios::floatfield); |
|
|
|
|
break; |
|
|
|
|
case 'G': |
|
|
|
|
out.setf(std::ios::uppercase); |
|
|
|
|
// Falls through
|
|
|
|
|
case 'g': |
|
|
|
|
out.setf(std::ios::dec, std::ios::basefield); |
|
|
|
|
// As in boost::format, let stream decide float format.
|
|
|
|
|