16#include "../microfmt.hpp"
43 : target_(target), transform_(t) {}
51 [[nodiscard]]
sink as_sink() & noexcept RELOCO_LIFETIMEBOUND {
53 [](
void *ctx, microfmt::string_view sv)
noexcept {
static_cast<transform_sink *
>(ctx)->
write(sv); }};
59 void put(
char c)
noexcept { target_.put(apply_char(c)); }
61 void write(microfmt::string_view sv)
noexcept {
63 target_.put(apply_char(c));
69 RELOCO_BEGIN_UNSAFE_CODE
70 [[nodiscard]]
constexpr char apply_char(
char c)
const noexcept {
72 case char_transform::to_upper:
73 if (c >=
'a' && c <=
'z')
74 return static_cast<char>(c - (
'a' -
'A'));
76 case char_transform::to_lower:
77 if (c >=
'A' && c <=
'Z')
78 return static_cast<char>(c + (
'a' -
'A'));
80 case char_transform::sanitize_ascii:
81 if ((
static_cast<uint8_t
>(c) < 0x20 || c ==
'\x7f') && c !=
'\n' && c !=
'\r' && c !=
'\t') {
85 case char_transform::none:
106 microfmt::string_view prefix RELOCO_LIFETIME_CAPTURE_BY_THIS =
" ") noexcept
107 : target_(target), prefix_(prefix) {}
115 [[nodiscard]]
sink as_sink() & noexcept RELOCO_LIFETIMEBOUND {
116 return sink{
this, [](
void *ctx, microfmt::string_view sv)
noexcept {
static_cast<prefix_sink *
>(ctx)->
write(sv); }};
120 void set_prefix(microfmt::string_view p RELOCO_LIFETIME_CAPTURE_BY_THIS)
noexcept { prefix_ = p; }
122 void put(
char c)
noexcept {
123 if (at_line_start_) {
124 target_.write(prefix_);
125 at_line_start_ =
false;
131 at_line_start_ =
true;
135 void write(microfmt::string_view sv)
noexcept {
143 microfmt::string_view prefix_{
" "};
144 bool at_line_start_{
true};
151 explicit constexpr limit_sink(
sink target RELOCO_LIFETIME_CAPTURE_BY_THIS,
size_t max_bytes) noexcept
152 : target_(target), remaining_(max_bytes) {}
160 [[nodiscard]]
sink as_sink() & noexcept RELOCO_LIFETIMEBOUND {
161 return sink{
this, [](
void *ctx, microfmt::string_view sv)
noexcept {
static_cast<limit_sink *
>(ctx)->
write(sv); }};
164 void put(
char c)
noexcept {
165 if (remaining_ > 0) {
171 void write(microfmt::string_view sv)
noexcept {
172 if (remaining_ == 0 || sv.empty())
175 const size_t to_write = (sv.size() <= remaining_) ? sv.size() : remaining_;
176 target_.write(sv.substr(0, to_write));
177 remaining_ -= to_write;
181 [[nodiscard]]
constexpr size_t remaining() const noexcept {
return remaining_; }
183 [[nodiscard]]
constexpr bool capped() const noexcept {
return remaining_ == 0; }
187 size_t remaining_{0};
Definition styled_sink.hpp:148
constexpr bool capped() const noexcept
Definition styled_sink.hpp:183
limit_sink & operator=(const limit_sink &)=delete
limit_sink(limit_sink &&) noexcept=default
void put(char c) noexcept
Definition styled_sink.hpp:164
constexpr limit_sink(sink target RELOCO_LIFETIME_CAPTURE_BY_THIS, size_t max_bytes) noexcept
Definition styled_sink.hpp:151
constexpr size_t remaining() const noexcept
Definition styled_sink.hpp:181
void write(microfmt::string_view sv) noexcept
Definition styled_sink.hpp:171
limit_sink(const limit_sink &)=delete
Definition styled_sink.hpp:102
void set_prefix(microfmt::string_view p RELOCO_LIFETIME_CAPTURE_BY_THIS) noexcept
Definition styled_sink.hpp:120
void write(microfmt::string_view sv) noexcept
Definition styled_sink.hpp:135
constexpr prefix_sink(sink target RELOCO_LIFETIME_CAPTURE_BY_THIS, microfmt::string_view prefix RELOCO_LIFETIME_CAPTURE_BY_THIS=" ") noexcept
Definition styled_sink.hpp:105
prefix_sink(const prefix_sink &)=delete
prefix_sink(prefix_sink &&) noexcept=default
void put(char c) noexcept
Definition styled_sink.hpp:122
prefix_sink & operator=(const prefix_sink &)=delete
#define MICROFMT_API_CLASS
Definition compat.hpp:181
char_transform
Definition styled_sink.hpp:25
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132