di 0.1.0
Loading...
Searching...
No Matches
write_exactly.h
Go to the documentation of this file.
1#pragma once
2
9
10namespace di::io {
11namespace detail {
12 struct WriteExactlyFunction {
13 template<concepts::Impl<Writer> Writer>
14 constexpr auto operator()(Writer& writer, vocab::Span<byte const> data) const
16 auto nwritten = usize { 0 };
17 while (nwritten < data.size()) {
18 auto n = DI_TRY(write_some(writer, *data.subspan(nwritten)));
19 DI_ASSERT(n > 0);
20 nwritten += n;
21 }
22 return {};
23 };
24
25 template<concepts::Impl<Writer> Writer>
26 constexpr auto operator()(Writer& writer, char data) const -> meta::WriterResult<void, Writer> {
27 auto byte = di::byte(data);
28 return (*this)(writer, vocab::Span { &byte, 1 });
29 };
30
31 template<concepts::Impl<Writer> Writer, concepts::detail::ConstantString T>
32 requires(concepts::SameAs<meta::Encoding<T>, container::string::Utf8Encoding>)
33 constexpr auto operator()(Writer& writer, T const& data) const -> meta::WriterResult<void, Writer> {
34 for (auto ch : data) {
35 DI_TRY((*this)(writer, char(ch)));
36 }
37 return {};
38 };
39
40 template<concepts::Impl<Writer> Writer, concepts::detail::ConstantString T>
41 requires(concepts::SameAs<meta::Encoding<T>, container::string::TransparentEncoding>)
42 constexpr auto operator()(Writer& writer, T const& data) const -> meta::WriterResult<void, Writer> {
43 for (auto ch : data) {
44 DI_TRY((*this)(writer, ch));
45 }
46 return {};
47 };
48 };
49}
50
51constexpr inline auto write_exactly = detail::WriteExactlyFunction {};
52}
53
54namespace di {
56}
#define DI_ASSERT(...)
Definition assert_bool.h:7
#define DI_TRY(...)
Definition monad_try.h:13
Definition reader.h:7
constexpr auto write_exactly
Definition write_exactly.h:51
meta::List< WriteSome, Flush, InteractiveDevice > Writer
Definition writer.h:85
constexpr auto write_some
Definition writer.h:81
meta::LikeExpected< decltype(io::write_some(util::declval< Writer & >(), util::declval< Span< Byte const > >())), T > WriterResult
Definition writer.h:90
std::byte byte
Definition byte.h:64
size_t usize
Definition integers.h:33
Span(Iter, SentOrSize) -> Span< meta::RemoveReference< meta::IteratorReference< Iter > > >
Definition any_storable.h:9
constexpr auto data
Definition data.h:51