From: Phil Willoughby Date: Tue, 7 Feb 2017 08:44:56 +0000 (-0800) Subject: Run clang-format over Format*.h X-Git-Tag: v2017.03.06.00~52 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9773e441c61fd246829aeb8f371968fc7866aa8c;p=folly.git Run clang-format over Format*.h Summary: Changes are planned, this will make it easier for the new code to look good without making the older code look weird. Reviewed By: yfeldblum Differential Revision: D4514839 fbshipit-source-id: 43f8cd7d85901e1915cc434a0f4b5fd6bce1ec7a --- diff --git a/folly/Format-inl.h b/folly/Format-inl.h index deb8bdaa..1b998dec 100644 --- a/folly/Format-inl.h +++ b/folly/Format-inl.h @@ -60,8 +60,8 @@ const size_t kMaxBinaryLength = 8 * sizeof(uintmax_t); * [buf+begin, buf+bufLen). */ template -size_t uintToHex(char* buffer, size_t bufLen, Uint v, - const char (&repr)[256][2]) { +size_t +uintToHex(char* buffer, size_t bufLen, Uint v, const char (&repr)[256][2]) { // 'v >>= 7, v >>= 1' is no more than a work around to get rid of shift size // warning when Uint = uint8_t (it's false as v >= 256 implies sizeof(v) > 1). for (; !less_than(v); v >>= 7, v >>= 1) { @@ -151,26 +151,28 @@ size_t uintToBinary(char* buffer, size_t bufLen, Uint v) { return bufLen; } -} // namespace detail +} // namespace detail template -BaseFormatter::BaseFormatter(StringPiece str, - Args&&... args) +BaseFormatter::BaseFormatter( + StringPiece str, + Args&&... args) : str_(str), values_(FormatValue::type>( std::forward(args))...) { - static_assert(!containerMode || sizeof...(Args) == 1, - "Exactly one argument required in container mode"); + static_assert( + !containerMode || sizeof...(Args) == 1, + "Exactly one argument required in container mode"); } template template -void BaseFormatter::operator()(Output& out) - const { +void BaseFormatter::operator()( + Output& out) const { // Copy raw string (without format specifiers) to output; // not as simple as we'd like, as we still need to translate "}}" to "}" // and throw if we see any lone "}" - auto outputString = [&out] (StringPiece s) { + auto outputString = [&out](StringPiece s) { auto p = s.begin(); auto end = s.end(); while (p != end) { @@ -225,10 +227,11 @@ void BaseFormatter::operator()(Output& out) p = q + 1; int argIndex = 0; - auto piece = arg.splitKey(); // empty key component is okay - if (containerMode) { // static - arg.enforce(arg.width != FormatArg::kDynamicWidth, - "dynamic field width not supported in vformat()"); + auto piece = arg.splitKey(); // empty key component is okay + if (containerMode) { // static + arg.enforce( + arg.width != FormatArg::kDynamicWidth, + "dynamic field width not supported in vformat()"); if (piece.empty()) { arg.setNextIntKey(nextArg++); hasDefaultArgIndex = true; @@ -239,8 +242,9 @@ void BaseFormatter::operator()(Output& out) } else { if (piece.empty()) { if (arg.width == FormatArg::kDynamicWidth) { - arg.enforce(arg.widthIndex == FormatArg::kNoIndex, - "cannot provide width arg index without value arg index"); + arg.enforce( + arg.widthIndex == FormatArg::kNoIndex, + "cannot provide width arg index without value arg index"); int sizeArg = nextArg++; arg.width = getSizeArg(size_t(sizeArg), arg); } @@ -249,8 +253,9 @@ void BaseFormatter::operator()(Output& out) hasDefaultArgIndex = true; } else { if (arg.width == FormatArg::kDynamicWidth) { - arg.enforce(arg.widthIndex != FormatArg::kNoIndex, - "cannot provide value arg index without width arg index"); + arg.enforce( + arg.widthIndex != FormatArg::kNoIndex, + "cannot provide value arg index without width arg index"); arg.width = getSizeArg(size_t(arg.widthIndex), arg); } @@ -274,9 +279,10 @@ void BaseFormatter::operator()(Output& out) } template -void writeTo(FILE* fp, - const BaseFormatter& formatter) { - auto writer = [fp] (StringPiece sp) { +void writeTo( + FILE* fp, + const BaseFormatter& formatter) { + auto writer = [fp](StringPiece sp) { size_t n = fwrite(sp.data(), 1, sp.size(), fp); if (n < sp.size()) { throwSystemError("Formatter writeTo", "fwrite failed"); @@ -309,7 +315,7 @@ void formatString(StringPiece val, FormatArg& arg, FormatCallback& cb) { char padBuf[padBufSize]; // Output padding, no more than padBufSize at once - auto pad = [&padBuf, &cb, padBufSize] (int chars) { + auto pad = [&padBuf, &cb, padBufSize](int chars) { while (chars) { int n = std::min(chars, padBufSize); cb(StringPiece(padBuf, size_t(n))); @@ -321,25 +327,25 @@ void formatString(StringPiece val, FormatArg& arg, FormatCallback& cb) { if (arg.width != FormatArg::kDefaultWidth && val.size() < static_cast(arg.width)) { char fill = arg.fill == FormatArg::kDefaultFill ? ' ' : arg.fill; - int padChars = static_cast (arg.width - val.size()); + int padChars = static_cast(arg.width - val.size()); memset(padBuf, fill, size_t(std::min(padBufSize, padChars))); switch (arg.align) { - case FormatArg::Align::DEFAULT: - case FormatArg::Align::LEFT: - padRemaining = padChars; - break; - case FormatArg::Align::CENTER: - pad(padChars / 2); - padRemaining = padChars - padChars / 2; - break; - case FormatArg::Align::RIGHT: - case FormatArg::Align::PAD_AFTER_SIGN: - pad(padChars); - break; - default: - abort(); - break; + case FormatArg::Align::DEFAULT: + case FormatArg::Align::LEFT: + padRemaining = padChars; + break; + case FormatArg::Align::CENTER: + pad(padChars / 2); + padRemaining = padChars - padChars / 2; + break; + case FormatArg::Align::RIGHT: + case FormatArg::Align::PAD_AFTER_SIGN: + pad(padChars); + break; + default: + abort(); + break; } } @@ -351,8 +357,11 @@ void formatString(StringPiece val, FormatArg& arg, FormatCallback& cb) { } template -void formatNumber(StringPiece val, int prefixLen, FormatArg& arg, - FormatCallback& cb) { +void formatNumber( + StringPiece val, + int prefixLen, + FormatArg& arg, + FormatCallback& cb) { // precision means something different for numbers arg.precision = FormatArg::kDefaultPrecision; if (arg.align == FormatArg::Align::DEFAULT) { @@ -366,10 +375,11 @@ void formatNumber(StringPiece val, int prefixLen, FormatArg& arg, format_value::formatString(val, arg, cb); } -template +template < + class FormatCallback, + class Derived, + bool containerMode, + class... Args> void formatFormatter( const BaseFormatter& formatter, FormatArg& arg, @@ -378,13 +388,14 @@ void formatFormatter( arg.precision == FormatArg::kDefaultPrecision) { // nothing to do formatter(cb); - } else if (arg.align != FormatArg::Align::LEFT && - arg.align != FormatArg::Align::DEFAULT) { + } else if ( + arg.align != FormatArg::Align::LEFT && + arg.align != FormatArg::Align::DEFAULT) { // We can only avoid creating a temporary string if we align left, // as we'd need to know the size beforehand otherwise format_value::formatString(formatter.fbstr(), arg, cb); } else { - auto fn = [&arg, &cb] (StringPiece sp) mutable { + auto fn = [&arg, &cb](StringPiece sp) mutable { int sz = static_cast(sp.size()); if (arg.precision != FormatArg::kDefaultPrecision) { sz = std::min(arg.precision, sz); @@ -406,19 +417,18 @@ void formatFormatter( } } -} // namespace format_value +} // namespace format_value // Definitions for default FormatValue classes // Integral types (except bool) template class FormatValue< - T, typename std::enable_if< - std::is_integral::value && - !std::is_same::value>::type> - { + T, + typename std::enable_if< + std::is_integral::value && !std::is_same::value>::type> { public: - explicit FormatValue(T val) : val_(val) { } + explicit FormatValue(T val) : val_(val) {} T getValue() const { return val_; @@ -449,23 +459,24 @@ class FormatValue< } else { uval = static_cast(val_); switch (arg.sign) { - case FormatArg::Sign::PLUS_OR_MINUS: - sign = '+'; - break; - case FormatArg::Sign::SPACE_OR_MINUS: - sign = ' '; - break; - default: - sign = '\0'; - break; + case FormatArg::Sign::PLUS_OR_MINUS: + sign = '+'; + break; + case FormatArg::Sign::SPACE_OR_MINUS: + sign = ' '; + break; + default: + sign = '\0'; + break; } } } else { uval = static_cast(val_); sign = '\0'; - arg.enforce(arg.sign == FormatArg::Sign::DEFAULT, - "sign specifications not allowed for unsigned values"); + arg.enforce( + arg.sign == FormatArg::Sign::DEFAULT, + "sign specifications not allowed for unsigned values"); } // max of: @@ -482,109 +493,131 @@ class FormatValue< int prefixLen = 0; switch (presentation) { - case 'n': { - arg.enforce(!arg.basePrefix, - "base prefix not allowed with '", presentation, - "' specifier"); - - arg.enforce(!arg.thousandsSeparator, - "cannot use ',' with the '", presentation, - "' specifier"); - - valBufBegin = valBuf + 3; // room for sign and base prefix + case 'n': { + arg.enforce( + !arg.basePrefix, + "base prefix not allowed with '", + presentation, + "' specifier"); + + arg.enforce( + !arg.thousandsSeparator, + "cannot use ',' with the '", + presentation, + "' specifier"); + + valBufBegin = valBuf + 3; // room for sign and base prefix #if defined(__ANDROID__) - int len = snprintf(valBufBegin, (valBuf + valBufSize) - valBufBegin, - "%" PRIuMAX, static_cast(uval)); + int len = snprintf( + valBufBegin, + (valBuf + valBufSize) - valBufBegin, + "%" PRIuMAX, + static_cast(uval)); #else - int len = snprintf( - valBufBegin, - size_t((valBuf + valBufSize) - valBufBegin), - "%ju", - static_cast(uval)); + int len = snprintf( + valBufBegin, + size_t((valBuf + valBufSize) - valBufBegin), + "%ju", + static_cast(uval)); #endif - // valBufSize should always be big enough, so this should never - // happen. - assert(len < valBuf + valBufSize - valBufBegin); - valBufEnd = valBufBegin + len; - break; - } - case 'd': - arg.enforce(!arg.basePrefix, - "base prefix not allowed with '", presentation, - "' specifier"); - valBufBegin = valBuf + 3; // room for sign and base prefix - - // Use uintToBuffer, faster than sprintf - valBufEnd = valBufBegin + uint64ToBufferUnsafe(uval, valBufBegin); - if (arg.thousandsSeparator) { - detail::insertThousandsGroupingUnsafe(valBufBegin, &valBufEnd); - } - break; - case 'c': - arg.enforce(!arg.basePrefix, - "base prefix not allowed with '", presentation, - "' specifier"); - arg.enforce(!arg.thousandsSeparator, - "thousands separator (',') not allowed with '", - presentation, "' specifier"); - valBufBegin = valBuf + 3; - *valBufBegin = static_cast(uval); - valBufEnd = valBufBegin + 1; - break; - case 'o': - case 'O': - arg.enforce(!arg.thousandsSeparator, - "thousands separator (',') not allowed with '", - presentation, "' specifier"); - valBufEnd = valBuf + valBufSize - 1; - valBufBegin = valBuf + detail::uintToOctal(valBuf, valBufSize - 1, uval); - if (arg.basePrefix) { - *--valBufBegin = '0'; - prefixLen = 1; - } - break; - case 'x': - arg.enforce(!arg.thousandsSeparator, - "thousands separator (',') not allowed with '", - presentation, "' specifier"); - valBufEnd = valBuf + valBufSize - 1; - valBufBegin = valBuf + detail::uintToHexLower(valBuf, valBufSize - 1, - uval); - if (arg.basePrefix) { - *--valBufBegin = 'x'; - *--valBufBegin = '0'; - prefixLen = 2; - } - break; - case 'X': - arg.enforce(!arg.thousandsSeparator, - "thousands separator (',') not allowed with '", - presentation, "' specifier"); - valBufEnd = valBuf + valBufSize - 1; - valBufBegin = valBuf + detail::uintToHexUpper(valBuf, valBufSize - 1, - uval); - if (arg.basePrefix) { - *--valBufBegin = 'X'; - *--valBufBegin = '0'; - prefixLen = 2; - } - break; - case 'b': - case 'B': - arg.enforce(!arg.thousandsSeparator, - "thousands separator (',') not allowed with '", - presentation, "' specifier"); - valBufEnd = valBuf + valBufSize - 1; - valBufBegin = valBuf + detail::uintToBinary(valBuf, valBufSize - 1, - uval); - if (arg.basePrefix) { - *--valBufBegin = presentation; // 0b or 0B - *--valBufBegin = '0'; - prefixLen = 2; + // valBufSize should always be big enough, so this should never + // happen. + assert(len < valBuf + valBufSize - valBufBegin); + valBufEnd = valBufBegin + len; + break; } - break; - default: - arg.error("invalid specifier '", presentation, "'"); + case 'd': + arg.enforce( + !arg.basePrefix, + "base prefix not allowed with '", + presentation, + "' specifier"); + valBufBegin = valBuf + 3; // room for sign and base prefix + + // Use uintToBuffer, faster than sprintf + valBufEnd = valBufBegin + uint64ToBufferUnsafe(uval, valBufBegin); + if (arg.thousandsSeparator) { + detail::insertThousandsGroupingUnsafe(valBufBegin, &valBufEnd); + } + break; + case 'c': + arg.enforce( + !arg.basePrefix, + "base prefix not allowed with '", + presentation, + "' specifier"); + arg.enforce( + !arg.thousandsSeparator, + "thousands separator (',') not allowed with '", + presentation, + "' specifier"); + valBufBegin = valBuf + 3; + *valBufBegin = static_cast(uval); + valBufEnd = valBufBegin + 1; + break; + case 'o': + case 'O': + arg.enforce( + !arg.thousandsSeparator, + "thousands separator (',') not allowed with '", + presentation, + "' specifier"); + valBufEnd = valBuf + valBufSize - 1; + valBufBegin = + valBuf + detail::uintToOctal(valBuf, valBufSize - 1, uval); + if (arg.basePrefix) { + *--valBufBegin = '0'; + prefixLen = 1; + } + break; + case 'x': + arg.enforce( + !arg.thousandsSeparator, + "thousands separator (',') not allowed with '", + presentation, + "' specifier"); + valBufEnd = valBuf + valBufSize - 1; + valBufBegin = + valBuf + detail::uintToHexLower(valBuf, valBufSize - 1, uval); + if (arg.basePrefix) { + *--valBufBegin = 'x'; + *--valBufBegin = '0'; + prefixLen = 2; + } + break; + case 'X': + arg.enforce( + !arg.thousandsSeparator, + "thousands separator (',') not allowed with '", + presentation, + "' specifier"); + valBufEnd = valBuf + valBufSize - 1; + valBufBegin = + valBuf + detail::uintToHexUpper(valBuf, valBufSize - 1, uval); + if (arg.basePrefix) { + *--valBufBegin = 'X'; + *--valBufBegin = '0'; + prefixLen = 2; + } + break; + case 'b': + case 'B': + arg.enforce( + !arg.thousandsSeparator, + "thousands separator (',') not allowed with '", + presentation, + "' specifier"); + valBufEnd = valBuf + valBufSize - 1; + valBufBegin = + valBuf + detail::uintToBinary(valBuf, valBufSize - 1, uval); + if (arg.basePrefix) { + *--valBufBegin = presentation; // 0b or 0B + *--valBufBegin = '0'; + prefixLen = 2; + } + break; + default: + arg.error("invalid specifier '", presentation, "'"); } if (sign) { @@ -592,8 +625,8 @@ class FormatValue< ++prefixLen; } - format_value::formatNumber(StringPiece(valBufBegin, valBufEnd), prefixLen, - arg, cb); + format_value::formatNumber( + StringPiece(valBufBegin, valBufEnd), prefixLen, arg, cb); } private: @@ -604,14 +637,14 @@ class FormatValue< template <> class FormatValue { public: - explicit FormatValue(bool val) : val_(val) { } + explicit FormatValue(bool val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { if (arg.presentation == FormatArg::kDefaultPresentation) { arg.validate(FormatArg::Type::OTHER); format_value::formatString(val_ ? "true" : "false", arg, cb); - } else { // number + } else { // number FormatValue(val_).format(arg, cb); } } @@ -624,7 +657,7 @@ class FormatValue { template <> class FormatValue { public: - explicit FormatValue(double val) : val_(val) { } + explicit FormatValue(double val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { @@ -644,7 +677,7 @@ class FormatValue { template <> class FormatValue { public: - explicit FormatValue(float val) : val_(val) { } + explicit FormatValue(float val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { @@ -658,22 +691,27 @@ class FormatValue { // Sring-y types (implicitly convertible to StringPiece, except char*) template class FormatValue< - T, typename std::enable_if< - (!std::is_pointer::value || - !std::is_same::type>::type>::value) && - std::is_convertible::value>::type> - { + T, + typename std::enable_if< + (!std::is_pointer::value || + !std::is_same< + char, + typename std::decay::type>::type>:: + value) && + std::is_convertible::value>::type> { public: - explicit FormatValue(StringPiece val) : val_(val) { } + explicit FormatValue(StringPiece val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { if (arg.keyEmpty()) { arg.validate(FormatArg::Type::OTHER); - arg.enforce(arg.presentation == FormatArg::kDefaultPresentation || - arg.presentation == 's', - "invalid specifier '", arg.presentation, "'"); + arg.enforce( + arg.presentation == FormatArg::kDefaultPresentation || + arg.presentation == 's', + "invalid specifier '", + arg.presentation, + "'"); format_value::formatString(val_, arg, cb); } else { FormatValue(val_.at(size_t(arg.splitIntKey()))).format(arg, cb); @@ -688,13 +726,16 @@ class FormatValue< template <> class FormatValue { public: - explicit FormatValue(std::nullptr_t) { } + explicit FormatValue(std::nullptr_t) {} template void format(FormatArg& arg, FormatCallback& cb) const { arg.validate(FormatArg::Type::OTHER); - arg.enforce(arg.presentation == FormatArg::kDefaultPresentation, - "invalid specifier '", arg.presentation, "'"); + arg.enforce( + arg.presentation == FormatArg::kDefaultPresentation, + "invalid specifier '", + arg.presentation, + "'"); format_value::formatString("(null)", arg, cb); } }; @@ -702,12 +743,11 @@ class FormatValue { // Partial specialization of FormatValue for char* template class FormatValue< - T*, - typename std::enable_if< - std::is_same::type>::value>::type> - { + T*, + typename std::enable_if< + std::is_same::type>::value>::type> { public: - explicit FormatValue(T* val) : val_(val) { } + explicit FormatValue(T* val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { @@ -718,8 +758,8 @@ class FormatValue< FormatValue(val_).format(arg, cb); } } else { - FormatValue::type>( - val_[arg.splitIntKey()]).format(arg, cb); + FormatValue::type>(val_[arg.splitIntKey()]) + .format(arg, cb); } } @@ -730,12 +770,11 @@ class FormatValue< // Partial specialization of FormatValue for void* template class FormatValue< - T*, - typename std::enable_if< - std::is_same::type>::value>::type> - { + T*, + typename std::enable_if< + std::is_same::type>::value>::type> { public: - explicit FormatValue(T* val) : val_(val) { } + explicit FormatValue(T* val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { @@ -744,15 +783,18 @@ class FormatValue< } else { // Print as a pointer, in hex. arg.validate(FormatArg::Type::OTHER); - arg.enforce(arg.presentation == FormatArg::kDefaultPresentation, - "invalid specifier '", arg.presentation, "'"); + arg.enforce( + arg.presentation == FormatArg::kDefaultPresentation, + "invalid specifier '", + arg.presentation, + "'"); arg.basePrefix = true; arg.presentation = 'x'; if (arg.align == FormatArg::Align::DEFAULT) { arg.align = FormatArg::Align::LEFT; } - FormatValue( - reinterpret_cast(val_)).doFormat(arg, cb); + FormatValue(reinterpret_cast(val_)) + .doFormat(arg, cb); } } @@ -764,19 +806,17 @@ template class TryFormatValue { public: template - static void formatOrFail(T& /* value */, - FormatArg& arg, - FormatCallback& /* cb */) { + static void + formatOrFail(T& /* value */, FormatArg& arg, FormatCallback& /* cb */) { arg.error("No formatter available for this type"); } }; template class TryFormatValue< - T, - typename std::enable_if< - 0 < sizeof(FormatValue::type>)>::type> - { + T, + typename std::enable_if< + 0 < sizeof(FormatValue::type>)>::type> { public: template static void formatOrFail(T& value, FormatArg& arg, FormatCallback& cb) { @@ -787,13 +827,12 @@ class TryFormatValue< // Partial specialization of FormatValue for other pointers template class FormatValue< - T*, - typename std::enable_if< - !std::is_same::type>::value && - !std::is_same::type>::value>::type> - { + T*, + typename std::enable_if< + !std::is_same::type>::value && + !std::is_same::type>::value>::type> { public: - explicit FormatValue(T* val) : val_(val) { } + explicit FormatValue(T* val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { @@ -803,6 +842,7 @@ class FormatValue< TryFormatValue::formatOrFail(val_[arg.splitIntKey()], arg, cb); } } + private: T* val_; }; @@ -812,53 +852,46 @@ namespace detail { // std::array template struct IndexableTraits> - : public IndexableTraitsSeq> { -}; + : public IndexableTraitsSeq> {}; // std::vector template struct IndexableTraits> - : public IndexableTraitsSeq> { -}; + : public IndexableTraitsSeq> {}; // std::deque template struct IndexableTraits> - : public IndexableTraitsSeq> { -}; + : public IndexableTraitsSeq> {}; // std::map with integral keys template struct IndexableTraits< - std::map, - typename std::enable_if::value>::type> - : public IndexableTraitsAssoc> { -}; + std::map, + typename std::enable_if::value>::type> + : public IndexableTraitsAssoc> {}; // std::unordered_map with integral keys template struct IndexableTraits< - std::unordered_map, - typename std::enable_if::value>::type> - : public IndexableTraitsAssoc> { -}; + std::unordered_map, + typename std::enable_if::value>::type> + : public IndexableTraitsAssoc> {}; -} // namespace detail +} // namespace detail // Partial specialization of FormatValue for integer-indexable containers template -class FormatValue< - T, - typename detail::IndexableTraits::enabled> { +class FormatValue::enabled> { public: - explicit FormatValue(const T& val) : val_(val) { } + explicit FormatValue(const T& val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { FormatValue::value_type>::type>( - detail::IndexableTraits::at( - val_, arg.splitIntKey())).format(arg, cb); + typename detail::IndexableTraits::value_type>::type>( + detail::IndexableTraits::at(val_, arg.splitIntKey())) + .format(arg, cb); } private: @@ -867,20 +900,19 @@ class FormatValue< template class FormatValue< - detail::DefaultValueWrapper, - typename detail::IndexableTraits::enabled> { + detail::DefaultValueWrapper, + typename detail::IndexableTraits::enabled> { public: explicit FormatValue(const detail::DefaultValueWrapper& val) - : val_(val) { } + : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { FormatValue::value_type>::type>( - detail::IndexableTraits::at( - val_.container, - arg.splitIntKey(), - val_.defaultValue)).format(arg, cb); + typename detail::IndexableTraits::value_type>::type>( + detail::IndexableTraits::at( + val_.container, arg.splitIntKey(), val_.defaultValue)) + .format(arg, cb); } private: @@ -891,7 +923,8 @@ namespace detail { // Define enabled, key_type, convert from StringPiece to the key types // that we support -template struct KeyFromStringPiece; +template +struct KeyFromStringPiece; // std::string template <> @@ -922,14 +955,15 @@ struct KeyFromStringPiece : public FormatTraitsBase { }; // Base class for associative types keyed by strings -template struct KeyableTraitsAssoc : public FormatTraitsBase { +template +struct KeyableTraitsAssoc : public FormatTraitsBase { typedef typename T::key_type key_type; typedef typename T::value_type::second_type value_type; static const value_type& at(const T& map, StringPiece key) { return map.at(KeyFromStringPiece::convert(key)); } - static const value_type& at(const T& map, StringPiece key, - const value_type& dflt) { + static const value_type& + at(const T& map, StringPiece key, const value_type& dflt) { auto pos = map.find(KeyFromStringPiece::convert(key)); return pos != map.end() ? pos->second : dflt; } @@ -937,40 +971,37 @@ template struct KeyableTraitsAssoc : public FormatTraitsBase { // Define enabled, key_type, value_type, at() for supported string-keyed // types -template struct KeyableTraits; +template +struct KeyableTraits; // std::map with string key template struct KeyableTraits< - std::map, - typename KeyFromStringPiece::enabled> - : public KeyableTraitsAssoc> { -}; + std::map, + typename KeyFromStringPiece::enabled> + : public KeyableTraitsAssoc> {}; // std::unordered_map with string key template struct KeyableTraits< - std::unordered_map, - typename KeyFromStringPiece::enabled> - : public KeyableTraitsAssoc> { -}; + std::unordered_map, + typename KeyFromStringPiece::enabled> + : public KeyableTraitsAssoc> {}; -} // namespace detail +} // namespace detail // Partial specialization of FormatValue for string-keyed containers template -class FormatValue< - T, - typename detail::KeyableTraits::enabled> { +class FormatValue::enabled> { public: - explicit FormatValue(const T& val) : val_(val) { } + explicit FormatValue(const T& val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { FormatValue::value_type>::type>( - detail::KeyableTraits::at( - val_, arg.splitKey())).format(arg, cb); + typename detail::KeyableTraits::value_type>::type>( + detail::KeyableTraits::at(val_, arg.splitKey())) + .format(arg, cb); } private: @@ -979,20 +1010,19 @@ class FormatValue< template class FormatValue< - detail::DefaultValueWrapper, - typename detail::KeyableTraits::enabled> { + detail::DefaultValueWrapper, + typename detail::KeyableTraits::enabled> { public: explicit FormatValue(const detail::DefaultValueWrapper& val) - : val_(val) { } + : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { FormatValue::value_type>::type>( - detail::KeyableTraits::at( - val_.container, - arg.splitKey(), - val_.defaultValue)).format(arg, cb); + typename detail::KeyableTraits::value_type>::type>( + detail::KeyableTraits::at( + val_.container, arg.splitKey(), val_.defaultValue)) + .format(arg, cb); } private: @@ -1003,20 +1033,20 @@ class FormatValue< template class FormatValue> { public: - explicit FormatValue(const std::pair& val) : val_(val) { } + explicit FormatValue(const std::pair& val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { int key = arg.splitIntKey(); switch (key) { - case 0: - FormatValue::type>(val_.first).format(arg, cb); - break; - case 1: - FormatValue::type>(val_.second).format(arg, cb); - break; - default: - arg.error("invalid index for pair"); + case 0: + FormatValue::type>(val_.first).format(arg, cb); + break; + case 1: + FormatValue::type>(val_.second).format(arg, cb); + break; + default: + arg.error("invalid index for pair"); } } @@ -1028,8 +1058,9 @@ class FormatValue> { template class FormatValue> { typedef std::tuple Tuple; + public: - explicit FormatValue(const Tuple& val) : val_(val) { } + explicit FormatValue(const Tuple& val) : val_(val) {} template void format(FormatArg& arg, FormatCallback& cb) const { @@ -1042,8 +1073,8 @@ class FormatValue> { static constexpr size_t valueCount = std::tuple_size::value; template - typename std::enable_if::type doFormatFrom( - size_t i, FormatArg& arg, Callback& /* cb */) const { + typename std::enable_if::type + doFormatFrom(size_t i, FormatArg& arg, Callback& /* cb */) const { arg.enforce("tuple index out of range, max=", i); } @@ -1052,10 +1083,10 @@ class FormatValue> { doFormatFrom(size_t i, FormatArg& arg, Callback& cb) const { if (i == K) { FormatValue::type>::type>( - std::get(val_)).format(arg, cb); + typename std::tuple_element::type>::type>(std::get(val_)) + .format(arg, cb); } else { - doFormatFrom(i, arg, cb); + doFormatFrom(i, arg, cb); } } @@ -1068,20 +1099,21 @@ class FormatValue> { }; // Partial specialization of FormatValue for nested Formatters -template class F> -class FormatValue, - typename std::enable_if>::value>::type> { +template class F> +class FormatValue< + F, + typename std::enable_if< + detail::IsFormatter>::value>::type> { typedef typename F::BaseType FormatterValue; public: - explicit FormatValue(const FormatterValue& f) : f_(f) { } + explicit FormatValue(const FormatterValue& f) : f_(f) {} template void format(FormatArg& arg, FormatCallback& cb) const { format_value::formatFormatter(f_, arg, cb); } + private: const FormatterValue& f_; }; @@ -1092,10 +1124,11 @@ class FormatValue, */ template typename std::enable_if::value>::type toAppend( - const BaseFormatter& value, Tgt* result) { + const BaseFormatter& value, + Tgt* result) { value.appendTo(*result); } -} // namespace folly +} // namespace folly #pragma GCC diagnostic pop diff --git a/folly/Format.h b/folly/Format.h index 7601ae52..f87d90a9 100644 --- a/folly/Format.h +++ b/folly/Format.h @@ -22,10 +22,10 @@ #include #include +#include #include -#include #include -#include +#include // Ignore shadowing warnings within this file, so includers can use -Wshadow. #pragma GCC diagnostic push @@ -34,12 +34,14 @@ namespace folly { // forward declarations -template class Formatter; +template +class Formatter; template Formatter format(StringPiece fmt, Args&&... args); template Formatter vformat(StringPiece fmt, C&& container); -template class FormatValue; +template +class FormatValue; // meta-attribute to identify formatters in this sea of template weirdness namespace detail { @@ -71,9 +73,9 @@ class BaseFormatter { * Append to a string. */ template - typename std::enable_if::value>::type - appendTo(Str& str) const { - auto appender = [&str] (StringPiece s) { str.append(s.data(), s.size()); }; + typename std::enable_if::value>::type appendTo( + Str& str) const { + auto appender = [&str](StringPiece s) { str.append(s.data(), s.size()); }; (*this)(appender); } @@ -102,8 +104,8 @@ class BaseFormatter { typedef BaseFormatter BaseType; private: - typedef std::tuple::type>...> ValueTuple; + typedef std::tuple::type>...> + ValueTuple; static constexpr size_t valueCount = std::tuple_size::value; template @@ -118,7 +120,7 @@ class BaseFormatter { if (i == K) { static_cast(this)->template doFormatArg(arg, cb); } else { - doFormatFrom(i, arg, cb); + doFormatFrom(i, arg, cb); } } @@ -128,32 +130,36 @@ class BaseFormatter { } template - typename std::enable_if::type - getSizeArgFrom(size_t i, const FormatArg& arg) const { + typename std::enable_if::type getSizeArgFrom( + size_t i, + const FormatArg& arg) const { arg.error("argument index out of range, max=", i); } template - typename std::enable_if::value && - !std::is_same::value, int>::type + typename std::enable_if< + std::is_integral::value && !std::is_same::value, + int>::type getValue(const FormatValue& format, const FormatArg&) const { return static_cast(format.getValue()); } template - typename std::enable_if::value || - std::is_same::value, int>::type + typename std::enable_if< + !std::is_integral::value || std::is_same::value, + int>::type getValue(const FormatValue&, const FormatArg& arg) const { arg.error("dynamic field width argument must be integral"); } template - typename std::enable_if::type - getSizeArgFrom(size_t i, const FormatArg& arg) const { + typename std::enable_if < + K::type getSizeArgFrom(size_t i, const FormatArg& arg) + const { if (i == K) { return getValue(std::get(values_), arg); } - return getSizeArgFrom(i, arg); + return getSizeArgFrom(i, arg); } int getSizeArg(size_t i, const FormatArg& arg) const { @@ -181,23 +187,26 @@ class BaseFormatter { }; template -class Formatter : public BaseFormatter, - containerMode, - Args...> { +class Formatter : public BaseFormatter< + Formatter, + containerMode, + Args...> { private: explicit Formatter(StringPiece& str, Args&&... args) - : BaseFormatter, - containerMode, - Args...>(str, std::forward(args)...) {} + : BaseFormatter< + Formatter, + containerMode, + Args...>(str, std::forward(args)...) {} template void doFormatArg(FormatArg& arg, Callback& cb) const { std::get(this->values_).format(arg, cb); } - friend class BaseFormatter, - containerMode, - Args...>; + friend class BaseFormatter< + Formatter, + containerMode, + Args...>; template friend Formatter format(StringPiece fmt, A&&... arg); @@ -208,9 +217,10 @@ class Formatter : public BaseFormatter, /** * Formatter objects can be written to streams. */ -template -std::ostream& operator<<(std::ostream& out, - const Formatter& formatter) { +template +std::ostream& operator<<( + std::ostream& out, + const Formatter& formatter) { auto writer = [&out](StringPiece sp) { out.write(sp.data(), std::streamsize(sp.size())); }; @@ -222,8 +232,9 @@ std::ostream& operator<<(std::ostream& out, * Formatter objects can be written to stdio FILEs. */ template -void writeTo(FILE* fp, - const BaseFormatter& formatter); +void writeTo( + FILE* fp, + const BaseFormatter& formatter); /** * Create a formatter object. @@ -234,8 +245,7 @@ void writeTo(FILE* fp, */ template Formatter format(StringPiece fmt, Args&&... args) { - return Formatter( - fmt, std::forward(args)...); + return Formatter(fmt, std::forward(args)...); } /** @@ -262,8 +272,7 @@ inline std::string sformat(StringPiece fmt, Args&&... args) { */ template Formatter vformat(StringPiece fmt, Container&& container) { - return Formatter( - fmt, std::forward(container)); + return Formatter(fmt, std::forward(container)); } /** @@ -283,20 +292,20 @@ inline std::string svformat(StringPiece fmt, Container&& container) { * format("[no_such_key"], defaulted(map, 42)) -> 42 */ namespace detail { -template struct DefaultValueWrapper { +template +struct DefaultValueWrapper { DefaultValueWrapper(const Container& container, const Value& defaultValue) - : container(container), - defaultValue(defaultValue) { - } + : container(container), defaultValue(defaultValue) {} const Container& container; const Value& defaultValue; }; -} // namespace +} // namespace template -detail::DefaultValueWrapper -defaulted(const Container& c, const Value& v) { +detail::DefaultValueWrapper defaulted( + const Container& c, + const Value& v) { return detail::DefaultValueWrapper(c, v); } @@ -345,25 +354,28 @@ void formatString(StringPiece val, FormatArg& arg, FormatCallback& cb); * field width") */ template -void formatNumber(StringPiece val, int prefixLen, FormatArg& arg, - FormatCallback& cb); - +void formatNumber( + StringPiece val, + int prefixLen, + FormatArg& arg, + FormatCallback& cb); /** * Format a Formatter object recursively. Behaves just like * formatString(fmt.str(), arg, cb); but avoids creating a temporary * string if possible. */ -template +template < + class FormatCallback, + class Derived, + bool containerMode, + class... Args> void formatFormatter( const BaseFormatter& formatter, FormatArg& arg, FormatCallback& cb); -} // namespace format_value +} // namespace format_value /* * Specialize folly::FormatValue for your type. @@ -411,8 +423,9 @@ inline std::string sformatChecked(StringPiece fmt, Args&&... args) { return formatChecked(fmt, std::forward(args)...).str(); } template -Formatter vformatChecked(StringPiece fmt, - Container&& container) { +Formatter vformatChecked( + StringPiece fmt, + Container&& container) { return vformat(fmt, std::forward(container)); } template @@ -430,7 +443,7 @@ vformatChecked(Str* out, StringPiece fmt, Container&& container) { vformatChecked(fmt, std::forward(container)).appendTo(*out); } -} // namespace folly +} // namespace folly #include