X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FFormatArg.h;h=701654b3397453a8a59e7c924c0a6ff08ff858dc;hb=2782b0144f937fc9c6df0a9b21bd4e1c1abbf678;hp=c72c03005f799fb9fc8863be9ec3b41c451b652e;hpb=5c77fedbef46995a71ffa268c9fcaf49efddd01b;p=folly.git diff --git a/folly/FormatArg.h b/folly/FormatArg.h index c72c0300..701654b3 100644 --- a/folly/FormatArg.h +++ b/folly/FormatArg.h @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2016 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,16 +14,22 @@ * limitations under the License. */ -#ifndef FOLLY_FORMATARG_H_ -#define FOLLY_FORMATARG_H_ +#pragma once #include -#include "folly/Range.h" -#include "folly/Likely.h" -#include "folly/Conv.h" +#include +#include +#include +#include namespace folly { +class BadFormatArg : public std::invalid_argument { + public: + explicit BadFormatArg(const std::string& msg) + : std::invalid_argument(msg) {} +}; + /** * Parsed format argument. */ @@ -39,7 +45,9 @@ struct FormatArg { sign(Sign::DEFAULT), basePrefix(false), thousandsSeparator(false), + trailingDot(false), width(kDefaultWidth), + widthIndex(kNoIndex), precision(kDefaultPrecision), presentation(kDefaultPresentation), nextKeyMode_(NextKeyMode::NONE) { @@ -71,7 +79,10 @@ struct FormatArg { } template - void error(Args&&... args) const __attribute__((noreturn)); + std::string errorStr(Args&&... args) const; + template + [[noreturn]] void error(Args&&... args) const; + /** * Full argument string, as passed in to the constructor. */ @@ -119,10 +130,18 @@ struct FormatArg { bool thousandsSeparator; /** - * Field width + * Force a trailing decimal on doubles which could be rendered as ints + */ + bool trailingDot; + + /** + * Field width and optional argument index */ static constexpr int kDefaultWidth = -1; + static constexpr int kDynamicWidth = -2; + static constexpr int kNoIndex = -1; int width; + int widthIndex; /** * Precision @@ -185,10 +204,15 @@ struct FormatArg { }; template -inline void FormatArg::error(Args&&... args) const { - throw std::invalid_argument(to( - "folly::format: invalid format argument {", fullArgString, "}: ", - std::forward(args)...)); +inline std::string FormatArg::errorStr(Args&&... args) const { + return to( + "invalid format argument {", fullArgString, "}: ", + std::forward(args)...); +} + +template +[[noreturn]] inline void FormatArg::error(Args&&... args) const { + throw BadFormatArg(errorStr(std::forward(args)...)); } template @@ -250,6 +274,3 @@ inline int FormatArg::splitIntKey() { } } // namespace folly - -#endif /* FOLLY_FORMATARG_H_ */ -