9#include "../microfmt.hpp"
36 microfmt::string_view
spec;
38 constexpr auto begin() const & noexcept {
return spec.begin(); }
40 constexpr auto begin() const && = delete;
41 constexpr auto end() const & noexcept {
return spec.end(); }
43 constexpr auto end() const && = delete;
46 RELOCO_BEGIN_UNSAFE_CODE
48 spec.remove_prefix(
static_cast<size_t>(it - spec.begin()));
50 RELOCO_END_UNSAFE_CODE
78 microfmt::value_ref<const microfmt::sink> sink_;
91 constexpr
void advance_to(
iterator it) noexcept { out_ = it; }
98template <
typename T,
typename Char =
char,
typename Enable =
void>
struct formatter;
105RELOCO_BEGIN_UNSAFE_CODE
106template <
typename... Args>
108 const Args &...args)
noexcept {
109 struct BoundedBufferState {
115 microfmt::sink s{&state, [](
void *ctx, microfmt::string_view sv)
noexcept {
116 auto *st =
static_cast<BoundedBufferState *
>(ctx);
117 if (st->data !=
nullptr && st->size < st->capacity) {
118 const size_t available = st->capacity - st->
size;
119 const size_t to_copy = (sv.size() < available) ? sv.size() : available;
120 for (
size_t i = 0; i < to_copy; ++i) {
121 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
123 st->data[st->size + i] = sv[i];
125 RELOCO_END_UNSAFE_BUFFER_USAGE;
128 st->size += sv.size();
133 const size_t written = (state.size < state.capacity) ? state.size : state.capacity;
135 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
137 return {out + written, state.size};
139 RELOCO_END_UNSAFE_BUFFER_USAGE;
141RELOCO_END_UNSAFE_CODE
148RELOCO_BEGIN_UNSAFE_CODE
149template <
typename OutputIt,
typename... Args,
150 std::enable_if_t<std::is_pointer_v<OutputIt> &&
151 std::is_same_v<std::remove_cv_t<std::remove_pointer_t<OutputIt>>,
char>,
153OutputIt
format_to(OutputIt out, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
154 struct PtrSinkState {
158 microfmt::sink s{&state, [](
void *ctx, microfmt::string_view sv)
noexcept {
159 auto *st =
static_cast<PtrSinkState *
>(ctx);
161 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
163 RELOCO_END_UNSAFE_BUFFER_USAGE;
170RELOCO_END_UNSAFE_CODE
177template <
size_t Capacity,
typename... Args>
178[[nodiscard]]
auto format(microfmt::string_view fmt_str,
const Args &...args)
noexcept {
179 return microfmt::format<Capacity>(fmt_str, args...);
183template <
typename... Args> [[nodiscard]]
auto format(microfmt::string_view fmt_str,
const Args &...args)
noexcept {
184 return microfmt::format<DEFAULT_FORMAT_BUFFER_SIZE>(fmt_str, args...);
191RELOCO_BEGIN_UNSAFE_BUFFER_USAGE
194RELOCO_BEGIN_UNSAFE_CODE
195inline void stdout_writer(
void *, microfmt::string_view sv)
noexcept { std::fwrite(sv.data(), 1, sv.size(), stdout); }
196RELOCO_END_UNSAFE_CODE
199RELOCO_BEGIN_UNSAFE_CODE
200inline void stderr_writer(
void *, microfmt::string_view sv)
noexcept { std::fwrite(sv.data(), 1, sv.size(), stderr); }
201RELOCO_END_UNSAFE_CODE
203RELOCO_END_UNSAFE_BUFFER_USAGE
205template <
typename... Args>
void print(microfmt::string_view fmt_str,
const Args &...args)
noexcept {
211RELOCO_BEGIN_UNSAFE_CODE
212template <
typename... Args>
void print(std::FILE *f, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
213 microfmt::sink term{f, [](
void *ctx, microfmt::string_view sv)
noexcept {
214 std::fwrite(sv.data(), 1, sv.size(),
static_cast<std::FILE *
>(ctx));
218RELOCO_END_UNSAFE_CODE
220template <
typename... Args>
void println(microfmt::string_view fmt_str,
const Args &...args)
noexcept {
227RELOCO_BEGIN_UNSAFE_CODE
228template <
typename... Args>
void println(std::FILE *f, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
229 microfmt::sink term{f, [](
void *ctx, microfmt::string_view sv)
noexcept {
230 std::fwrite(sv.data(), 1, sv.size(),
static_cast<std::FILE *
>(ctx));
235RELOCO_END_UNSAFE_CODE
241template <
typename Range>
242[[nodiscard]]
constexpr auto join(
const Range &range, microfmt::string_view delimiter)
noexcept {
246template <
typename It,
typename Sentinel>
247[[nodiscard]]
constexpr auto join(It first, Sentinel last, microfmt::string_view delimiter)
noexcept {
262template <
typename T,
typename =
void>
struct has_fmt_formatter : std::false_type {};
265struct has_fmt_formatter<
266 T, std::void_t<decltype(std::declval<fmt::formatter<T> &>().parse(std::declval<fmt::format_parse_context &>())),
267 decltype(std::declval<fmt::formatter<T> &>().format(
268 std::declval<const T &>(), std::declval<fmt::format_context &>()))>> : std::true_type {};
273template <
typename T>
struct formatter<T, std::enable_if_t<detail::has_fmt_formatter<T>::value>> {
276 constexpr void parse(format_parse_context &ctx)
noexcept {
278 fmt_impl.parse(pctx);
281 void format(
const T &val,
const sink &out)
const noexcept {
284 fmt_impl.format(val, fctx);
constexpr format_context(iterator out) noexcept
Definition fmt.hpp:86
constexpr iterator out() const &&=delete
constexpr iterator out() const &noexcept
Definition fmt.hpp:88
constexpr sink_output_iterator & operator++(int) noexcept
Definition fmt.hpp:75
constexpr sink_output_iterator & operator++() noexcept
Definition fmt.hpp:74
void pointer
Definition fmt.hpp:62
sink_output_iterator & operator=(char c) noexcept
Definition fmt.hpp:67
std::output_iterator_tag iterator_category
Definition fmt.hpp:59
constexpr sink_output_iterator & operator*() noexcept
Definition fmt.hpp:73
void reference
Definition fmt.hpp:63
std::ptrdiff_t difference_type
Definition fmt.hpp:61
constexpr sink_output_iterator(const microfmt::sink &s RELOCO_LIFETIMEBOUND) noexcept
Definition fmt.hpp:65
void value_type
Definition fmt.hpp:60
#define MICROFMT_API_CLASS
Definition compat.hpp:181
RELOCO_BEGIN_UNSAFE_CODE format_to_n_result< char * > format_to_n(char *out, size_t n, microfmt::string_view fmt_str, const Args &...args) noexcept
Definition fmt.hpp:107
RELOCO_END_UNSAFE_CODE auto format(microfmt::string_view fmt_str, const Args &...args) noexcept
Definition fmt.hpp:178
RELOCO_END_UNSAFE_CODE RELOCO_BEGIN_UNSAFE_CODE void stderr_writer(void *, microfmt::string_view sv) noexcept
Definition fmt.hpp:200
microfmt::string_view string_view
Definition fmt.hpp:32
RELOCO_BEGIN_UNSAFE_BUFFER_USAGE RELOCO_BEGIN_UNSAFE_CODE void stdout_writer(void *, microfmt::string_view sv) noexcept
Definition fmt.hpp:195
RELOCO_END_UNSAFE_CODE constexpr auto join(const Range &range, microfmt::string_view delimiter) noexcept
Definition fmt.hpp:242
constexpr size_t DEFAULT_FORMAT_BUFFER_SIZE
Definition fmt.hpp:21
RELOCO_END_UNSAFE_CODE void println(microfmt::string_view fmt_str, const Args &...args) noexcept
Definition fmt.hpp:220
RELOCO_END_UNSAFE_CODE RELOCO_END_UNSAFE_BUFFER_USAGE void print(microfmt::string_view fmt_str, const Args &...args) noexcept
Definition fmt.hpp:205
RELOCO_END_UNSAFE_CODE RELOCO_BEGIN_UNSAFE_CODE OutputIt format_to(OutputIt out, microfmt::string_view fmt_str, const Args &...args) noexcept
Definition fmt.hpp:153
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
RELOCO_CONSTEXPR20 void format_to(const sink &out, microfmt::string_view fmt, const Args &...args) noexcept
Definition microfmt.hpp:1766
RELOCO_CONSTEXPR20 buffer_sink< N > format(microfmt::string_view fmt, const Args &...args) noexcept
Definition microfmt.hpp:1786
constexpr joined_span_view< T > join(span< const T > items, microfmt::string_view delim=", ") noexcept
Definition format_helpers.hpp:239
Range and iterator-pair joining formatting views.
microfmt::string_view spec
Definition fmt.hpp:36
constexpr auto begin() const &&=delete
constexpr auto begin() const &noexcept
Definition fmt.hpp:38
constexpr auto end() const &&=delete