9#include "../microfmt.hpp"
13#if MICROFMT_HAS_POSIX_FD
24RELOCO_BEGIN_UNSAFE_CODE
26 return sink{file, [](
void *ctx, microfmt::string_view sv)
noexcept {
27 if (ctx !=
nullptr && !sv.empty()) {
28 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
29 std::fwrite(sv.data(), 1, sv.size(),
static_cast<std::FILE *
>(ctx));
30 RELOCO_END_UNSAFE_BUFFER_USAGE;
44#if MICROFMT_HAS_POSIX_FD
46RELOCO_BEGIN_UNSAFE_CODE
47[[nodiscard]]
inline sink fd_sink(
int fd)
noexcept {
49 return sink{
reinterpret_cast<void *
>(
static_cast<intptr_t
>(
fd)), [](
void *ctx, microfmt::string_view sv)
noexcept {
50 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
52 const int target_fd =
static_cast<int>(
reinterpret_cast<intptr_t
>(ctx));
53 if (target_fd >= 0 && !sv.empty()) {
54 const char *ptr = sv.data();
55 size_t remaining = sv.size();
56 while (remaining > 0) {
57 const ssize_t written =
::write(target_fd, ptr, remaining);
62 remaining -=
static_cast<size_t>(written);
66 RELOCO_END_UNSAFE_BUFFER_USAGE;
77template <
typename StrProvider,
typename... Args>
83template <
typename StrProvider,
typename... Args>
91template <
typename... Args>
inline void print(microfmt::string_view fmt_str,
const Args &...args)
noexcept {
96template <
typename... Args>
inline void println(microfmt::string_view fmt_str,
const Args &...args)
noexcept {
108RELOCO_BEGIN_UNSAFE_CODE
109template <
typename StrProvider,
typename... Args>
117RELOCO_BEGIN_UNSAFE_CODE
118template <
typename StrProvider,
typename... Args>
128RELOCO_BEGIN_UNSAFE_CODE
129template <
typename... Args>
130inline void print(std::FILE *file, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
137RELOCO_BEGIN_UNSAFE_CODE
138template <
typename... Args>
139inline void println(std::FILE *file, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
150#if MICROFMT_HAS_POSIX_FD
152template <
typename StrProvider,
typename... Args>
153inline void print(
int fd, compile_string_holder<StrProvider>
fmt,
const Args &...args)
noexcept {
154 auto s = fd_sink(
fd);
158template <
typename StrProvider,
typename... Args>
159inline void println(
int fd, compile_string_holder<StrProvider>
fmt,
const Args &...args)
noexcept {
160 auto s = fd_sink(
fd);
166template <
typename... Args>
inline void print(
int fd, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
167 auto s = fd_sink(
fd);
171template <
typename... Args>
inline void println(
int fd, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
172 auto s = fd_sink(
fd);
183template <
typename StrProvider,
typename... Args>
188template <
typename StrProvider,
typename... Args>
195template <
typename... Args>
inline void print(
sink s, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
199template <
typename... Args>
inline void println(
sink s, microfmt::string_view fmt_str,
const Args &...args)
noexcept {
213RELOCO_BEGIN_UNSAFE_CODE
217#if MICROFMT_HAS_POSIX_FD
218inline void println(
int fd)
noexcept { fd_sink(
fd).put(
'\n'); }
void println() noexcept
Definition stdio.hpp:210
RELOCO_END_UNSAFE_CODE sink stdout_sink() noexcept
Definition stdio.hpp:36
sink stderr_sink() noexcept
Definition stdio.hpp:38
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
void print(compile_string_holder< StrProvider > fmt, const Args &...args) noexcept
Definition stdio.hpp:78
RELOCO_BEGIN_UNSAFE_CODE sink file_sink(std::FILE *file) noexcept
Definition stdio.hpp:25
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
Definition microfmt.hpp:1792