20 #ifndef TPIE_SERIALIZATION_STREAM_H
21 #define TPIE_SERIALIZATION_STREAM_H
27 #include <tpie/tpie_export.h>
42 static memory_size_type block_size() {
48 stream_size_type m_blocksWritten;
49 stream_size_type m_size;
57 void open(std::string path,
bool reverse);
61 void open_inner(std::string path,
bool reverse);
72 void write_block(
const char *
const s,
const memory_size_type n);
74 void close(
bool reverse);
77 static memory_size_type memory_usage() {
return block_size(); }
79 stream_size_type file_size();
89 memory_size_type m_index;
101 void write(
const char *
const s,
const memory_size_type n) {
103 memory_size_type written = 0;
104 while (written != n) {
105 if (wr.m_index >= wr.block_size()) wr.write_block();
107 memory_size_type remaining = n - written;
108 memory_size_type blockRemaining = wr.block_size() - wr.m_index;
110 memory_size_type writeSize = std::min(remaining, blockRemaining);
112 std::copy(i, i + writeSize, &wr.m_block[wr.m_index]);
114 written += writeSize;
115 wr.m_index += writeSize;
125 void open(std::string path);
135 template <
typename T>
149 template <
typename IT>
166 memory_size_type m_index;
167 std::vector<char> m_serializationBuffer;
179 void write(
const char *
const s,
const memory_size_type n) {
180 std::vector<char> & data = wr.m_serializationBuffer;
181 memory_size_type offs = data.size();
182 data.resize(data.size() + n);
183 std::copy(s, s + n, data.data() + offs);
187 std::vector<char> & data = wr.m_serializationBuffer;
188 const memory_size_type n = data.size();
189 const char *
const s = data.data();
190 if (wr.m_index + n <= wr.block_size()) {
191 std::copy(s, s + n, &wr.m_block[block_size() - wr.m_index - n]);
194 const char * i = s + n;
195 memory_size_type written = 0;
196 while (written != n) {
197 if (wr.m_index >= wr.block_size()) wr.write_block();
199 memory_size_type remaining = n - written;
200 memory_size_type blockRemaining = wr.block_size() - wr.m_index;
202 memory_size_type writeSize = std::min(remaining, blockRemaining);
204 std::copy(i - writeSize, i, &wr.m_block[block_size() - wr.m_index - writeSize]);
206 written += writeSize;
207 wr.m_index += writeSize;
219 void open(std::string path);
229 template <
typename T>
243 template <
typename IT>
255 static memory_size_type block_size() {
256 return serialization_writer_base::block_size();
265 stream_size_type m_size;
266 memory_size_type m_index;
267 memory_size_type m_blockSize;
271 void open(std::string path,
bool reverse);
273 void read_block(
const stream_size_type blk);
276 virtual void next_block() = 0;
287 void read(
char *
const s,
const memory_size_type n) {
290 memory_size_type written = 0;
291 while (written != n) {
292 if (m_index >= m_blockSize) {
297 memory_size_type remaining = n - written;
298 memory_size_type blockRemaining = m_blockSize - m_index;
300 memory_size_type readSize = std::min(remaining, blockRemaining);
302 i = std::copy(m_block.
get() + m_index,
303 m_block.
get() + (m_index + readSize),
320 template <
typename T>
335 template <
typename IT>
341 static memory_size_type memory_usage() {
return block_size(); }
346 stream_size_type file_size();
353 stream_size_type size();
360 stream_size_type m_blockNumber;
363 void next_block()
override;
369 void open(std::string path);
373 if (m_index < m_blockSize)
return true;
374 return m_blockNumber * (stream_size_type)block_size() + m_index < m_size;
382 stream_size_type offset();
387 stream_size_type m_blockNumber;
390 void next_block()
override;
395 void open(std::string path);
399 if (m_index < m_blockSize)
return true;
400 return m_blockNumber > 0;
408 stream_size_type offset();
413 #endif // TPIE_SERIALIZATION_STREAM_H