/*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2012-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
*/
-#ifndef FOLLY_FORMATARG_H_
-#define FOLLY_FORMATARG_H_
+#pragma once
#include <stdexcept>
-#include "folly/Conv.h"
-#include "folly/Likely.h"
-#include "folly/Portability.h"
-#include "folly/Range.h"
+
+#include <folly/CPortability.h>
+#include <folly/Conv.h>
+#include <folly/Likely.h>
+#include <folly/Portability.h>
+#include <folly/Range.h>
namespace folly {
-class BadFormatArg : public std::invalid_argument {
- public:
- explicit BadFormatArg(const std::string& msg)
- : std::invalid_argument(msg) {}
+class FOLLY_EXPORT BadFormatArg : public std::invalid_argument {
+ using invalid_argument::invalid_argument;
};
+[[noreturn]] void throwBadFormatArg(char const* msg);
+[[noreturn]] void throwBadFormatArg(std::string const& msg);
+
/**
* Parsed format argument.
*/
sign(Sign::DEFAULT),
basePrefix(false),
thousandsSeparator(false),
+ trailingDot(false),
width(kDefaultWidth),
+ widthIndex(kNoIndex),
precision(kDefaultPrecision),
presentation(kDefaultPresentation),
nextKeyMode_(NextKeyMode::NONE) {
template <typename... Args>
std::string errorStr(Args&&... args) const;
template <typename... Args>
- void error(Args&&... args) const FOLLY_NORETURN;
+ [[noreturn]] void error(Args&&... args) const;
/**
* Full argument string, as passed in to the constructor.
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
}
template <typename... Args>
-inline void FormatArg::error(Args&&... args) const {
- throw BadFormatArg(errorStr(std::forward<Args>(args)...));
+[[noreturn]] inline void FormatArg::error(Args&&... args) const {
+ throwBadFormatArg(errorStr(std::forward<Args>(args)...));
}
template <bool emptyOk>
const char* p;
if (e[-1] == ']') {
--e;
- p = static_cast<const char*>(memchr(b, '[', e - b));
- enforce(p, "unmatched ']'");
+ p = static_cast<const char*>(memchr(b, '[', size_t(e - b)));
+ enforce(p != nullptr, "unmatched ']'");
} else {
- p = static_cast<const char*>(memchr(b, '.', e - b));
+ p = static_cast<const char*>(memchr(b, '.', size_t(e - b)));
}
if (p) {
key_.assign(p + 1, e);
}
try {
return to<int>(doSplitKey<true>());
- } catch (const std::out_of_range& e) {
+ } catch (const std::out_of_range&) {
error("integer key required");
return 0; // unreached
}
}
-} // namespace folly
-
-#endif /* FOLLY_FORMATARG_H_ */
-
+} // namespace folly