roo_io
API Documentation for roo_io
Loading...
Searching...
No Matches
output_stream_writer.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
9#include "roo_io/data/write.h"
10
11namespace roo_io {
12
13/// Buffered typed writer over `OutputStream`.
14///
15/// Uses a 64-byte internal buffer to avoid tiny upstream writes.
16///
17/// Construction with `unique_ptr` transfers ownership; construction with
18/// reference does not.
19///
20/// After constructing this writer, access the stream only through this writer
21/// to keep buffer state coherent.
22///
23/// Writer closes the stream on destruction or explicit `close()`.
25 public:
26 OutputStreamWriter() : os_(nullptr), owned_(false), out_() {}
27
29 : os_(other.os_), owned_(other.owned_), out_(std::move(other.out_)) {
30 other.os_ = nullptr;
31 other.owned_ = false;
32 other.out_.reset();
33 }
34
36 if (this != &other) {
37 close();
38 os_ = other.os_;
39 owned_ = other.owned_;
40 out_ = std::move(other.out_);
41 other.os_ = nullptr;
42 other.owned_ = false;
43 other.out_.reset();
44 }
45 return *this;
46 }
47
48 OutputStreamWriter(std::unique_ptr<roo_io::OutputStream> os)
49 : os_(os.release()), owned_(os_ != nullptr), out_() {
50 if (os_ != nullptr) out_.reset(*os_);
51 }
52
54 : os_(&os), owned_(false), out_(os) {}
55
57
58 void reset(std::unique_ptr<roo_io::OutputStream> os) {
59 if (os_ == os.get()) {
60 owned_ = true;
61 return;
62 }
63 if (os_ != nullptr) {
64 os_->close();
65 if (owned_) {
66 delete os_;
67 }
68 }
69 os_ = os.release();
70 owned_ = (os_ != nullptr);
71 if (os_ == nullptr) {
72 out_.reset();
73 } else {
74 out_.reset(*os_);
75 }
76 }
77
79 if (os_ == &os) {
80 CHECK(!owned_);
81 return;
82 }
83 if (os_ != nullptr) {
84 os_->close();
85 if (owned_) {
86 delete os_;
87 }
88 }
89 os_ = &os;
90 owned_ = false;
91 out_.reset(*os_);
92 }
93
94 bool ok() const { return out_.ok(); }
95
96 void flush() {
97 if (os_ == nullptr) return;
98 out_.flush();
99 }
100
101 void close() {
102 if (os_ != nullptr) {
103 out_.flush();
104 os_->close();
105 if (owned_) {
106 delete os_;
107 owned_ = false;
108 }
109 os_ = nullptr;
110 out_.reset();
111 } else if (owned_) {
112 delete os_;
113 owned_ = false;
114 }
115 }
116
117 Status status() const { return out_.status(); }
118
119 void write(byte v) { out_.write(v); }
120
121 void writeU8(uint8_t v) { WriteU8(out_, v); }
122
123 void writeBeU16(uint16_t v) { WriteBeU16(out_, v); }
124
125 void writeLeU16(uint16_t v) { WriteLeU16(out_, v); }
126
127 void writeBeU24(uint32_t v) { WriteBeU24(out_, v); }
128
129 void writeLeU24(uint32_t v) { WriteLeU24(out_, v); }
130
131 void writeBeU32(uint32_t v) { WriteBeU32(out_, v); }
132
133 void writeLeU32(uint32_t v) { WriteLeU32(out_, v); }
134
135 void writeBeU64(uint64_t v) { WriteBeU64(out_, v); }
136
137 void writeLeU64(uint64_t v) { WriteLeU64(out_, v); }
138
139 void writeS8(uint8_t v) { WriteS8(out_, v); }
140
141 void writeBeS16(uint16_t v) { WriteBeS16(out_, v); }
142
143 void writeLeS16(uint16_t v) { WriteLeS16(out_, v); }
144
145 void writeBeS24(uint32_t v) { WriteBeS24(out_, v); }
146
147 void writeLeS24(uint32_t v) { WriteLeS24(out_, v); }
148
149 void writeBeS32(uint32_t v) { WriteBeS32(out_, v); }
150
151 void writeLeS32(uint32_t v) { WriteLeS32(out_, v); }
152
153 void writeBeS64(uint64_t v) { WriteBeS64(out_, v); }
154
155 void writeLeS64(uint64_t v) { WriteLeS64(out_, v); }
156
157#if ROO_IO_IEEE754
158 void writeBeFloat(float v) { WriteBeFloat(out_, v); }
159
160 void writeLeFloat(float v) { WriteLeFloat(out_, v); }
161
162 void writeBeDouble(double v) { WriteBeDouble(out_, v); }
163
164 void writeLeDouble(double v) { WriteLeDouble(out_, v); }
165#endif // ROO_IO_IEEE754
166
167 size_t writeByteArray(const byte* source, size_t count) {
168 return WriteByteArray(out_, source, count);
169 }
170
171 void writeString(roo::string_view str) { return WriteString(out_, str); }
172
173 template <typename T>
174 void writeHostNative(const T& v) {
175 return HostNativeWriter<T>().write(out_, v);
176 }
177
178 void writeVarU64(uint64_t data) { return WriteVarU64(out_, data); }
179
180 private:
182 bool owned_;
184};
185
186} // namespace roo_io
void flush()
Flushes buffered data and then flushes underlying stream.
void reset()
Detaches from stream and releases internal buffer.
Status status() const
Returns current iterator status.
bool ok() const
Returns whether status() == kOk.
Buffered typed writer over OutputStream.
OutputStreamWriter(OutputStreamWriter &&other)
size_t writeByteArray(const byte *source, size_t count)
void reset(roo_io::OutputStream &os)
OutputStreamWriter(roo_io::OutputStream &os)
OutputStreamWriter & operator=(OutputStreamWriter &&other)
void reset(std::unique_ptr< roo_io::OutputStream > os)
OutputStreamWriter(std::unique_ptr< roo_io::OutputStream > os)
void writeString(roo::string_view str)
Virtualizes access to writable sinks (files, memory, devices).
virtual void close()
Flushes and closes this stream.
Definition byte.h:6
constexpr void WriteLeS64(OutputIterator &out, int64_t v)
Definition write.h:137
constexpr void WriteBeU16(OutputIterator &out, uint16_t v)
Definition write.h:25
constexpr void WriteLeU16(OutputIterator &out, uint16_t v)
Definition write.h:32
constexpr void WriteBeS32(OutputIterator &out, int32_t v)
Definition write.h:119
constexpr void WriteU8(OutputIterator &out, uint8_t v)
Definition write.h:19
constexpr void WriteLeS24(OutputIterator &out, int32_t v)
Definition write.h:113
constexpr void WriteLeS16(OutputIterator &out, int16_t v)
Definition write.h:101
roo::basic_string_view< CharT, Traits > basic_string_view
Definition string_view.h:8
size_t count
Definition compare.h:45
size_t WriteByteArray(OutputIterator &out, const byte *source, size_t count)
Definition write.h:196
constexpr void WriteBeS24(OutputIterator &out, int32_t v)
Definition write.h:107
constexpr void WriteBeS64(OutputIterator &out, int64_t v)
Definition write.h:131
constexpr void WriteLeU24(OutputIterator &out, uint32_t v)
Definition write.h:47
void WriteVarU64(OutputIterator &out, uint64_t data)
Definition write.h:212
constexpr void WriteLeU32(OutputIterator &out, uint32_t v)
Definition write.h:64
constexpr void WriteBeU64(OutputIterator &out, uint64_t v)
Definition write.h:73
constexpr void WriteBeU24(OutputIterator &out, uint32_t v)
Definition write.h:39
constexpr void WriteBeU32(OutputIterator &out, uint32_t v)
Definition write.h:55
Status
Definition status.h:7
constexpr void WriteLeS32(OutputIterator &out, int32_t v)
Definition write.h:125
constexpr void WriteBeS16(OutputIterator &out, int16_t v)
Definition write.h:95
void WriteString(OutputIterator &itr, roo::string_view data)
Definition write.h:232
constexpr void WriteLeU64(OutputIterator &out, uint64_t v)
Definition write.h:80
constexpr void WriteS8(OutputIterator &out, int8_t v)
Definition write.h:89