forked from pz4kybsvg/Conception
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
#pragma once
|
|
|
|
#include <sstream>
|
|
#include <string_view>
|
|
|
|
#include <fmt/ostream.h>
|
|
|
|
#include "drake/common/fmt.h"
|
|
|
|
namespace drake {
|
|
|
|
// Compatibility shim for fmt::streamed.
|
|
#if FMT_VERSION >= 90000 || defined(DRAKE_DOXYGEN_CXX)
|
|
/** When using fmt >= 9, this is an alias for
|
|
<a href="https://fmt.dev/latest/api.html#ostream-api">fmt::streamed</a>.
|
|
When using fmt < 9, this uses a polyfill instead.
|
|
|
|
Within Drake, the nominal use for `fmt::streamed` is when formatting third-party
|
|
types that provide `operator<<` support but not `fmt::formatter<T>` support.
|
|
Once we stop using `FMT_DEPRECATED_OSTREAM=1`, compilation errors will help you
|
|
understand where you are required to use this wrapper. */
|
|
template <typename T>
|
|
auto fmt_streamed(const T& ref) { return fmt::streamed(ref); }
|
|
#else // FMT_VERSION
|
|
namespace internal {
|
|
template <typename T> struct streamed_ref { const T& ref; };
|
|
} // namespace internal
|
|
template <typename T>
|
|
internal::streamed_ref<T> fmt_streamed(const T& ref) { return {ref}; }
|
|
#endif // FMT_VERSION
|
|
|
|
// Compatibility shim for fmt::ostream_formatter.
|
|
#if FMT_VERSION >= 90000
|
|
using fmt::ostream_formatter;
|
|
#else // FMT_VERSION
|
|
/** When using fmt >= 9, this is an alias for fmt::ostream_formatter.
|
|
When using fmt < 9, this uses a polyfill instead. */
|
|
struct ostream_formatter : fmt::formatter<std::string_view> {
|
|
template <typename T, typename FormatContext>
|
|
auto format(const T& value,
|
|
// NOLINTNEXTLINE(runtime/references) To match fmt API.
|
|
FormatContext& ctx) DRAKE_FMT8_CONST {
|
|
std::ostringstream output;
|
|
output << value;
|
|
output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
|
|
return fmt::formatter<std::string_view>::format(output.str(), ctx);
|
|
}
|
|
};
|
|
#endif // FMT_VERSION
|
|
|
|
} // namespace drake
|
|
|
|
// Formatter specialization for drake::fmt_streamed.
|
|
#ifndef DRAKE_DOXYGEN_CXX
|
|
#if FMT_VERSION < 90000
|
|
namespace fmt {
|
|
template <typename T>
|
|
struct formatter<drake::internal::streamed_ref<T>> : drake::ostream_formatter {
|
|
template <typename FormatContext>
|
|
auto format(drake::internal::streamed_ref<T> tag,
|
|
// NOLINTNEXTLINE(runtime/references) To match fmt API.
|
|
FormatContext& ctx) DRAKE_FMT8_CONST {
|
|
return ostream_formatter::format(tag.ref, ctx);
|
|
}
|
|
};
|
|
} // namespace fmt
|
|
#endif // FMT_VERSION
|
|
#endif // DRAKE_DOXYGEN_CXX
|