update readme
[c11concurrency-benchmarks.git] / iris / include / buffered_writer.h
1 #ifndef IRIS_BUFFERED_WRITER_H_
2 #define IRIS_BUFFERED_WRITER_H_
3 #include <string.h>
4 #include <memory>
5
6 #include "writer.h"
7
8 namespace iris {
9
10 struct buffered_writer {
11 private:
12     buffered_writer(const buffered_writer & rhs)=delete;
13     struct buffered_writer & operator=(const buffered_writer &rhs)=delete;
14     writer     &m_w;
15
16     char       *m_buf;
17     int         m_pos;
18     int         m_capacity;
19 public:
20     buffered_writer(writer & w, size_t cap = 0);
21
22     ~buffered_writer();
23
24     void expand(size_t n);
25
26     inline void reset() {
27         m_pos = 0;
28     }
29
30     inline char * reserve(size_t s) {
31         if (freespace() < s) {
32             flush();
33             if (freespace() < s)
34                 throw std::bad_alloc();
35         }
36
37         return write_pointer();
38     }
39
40     inline size_t freespace() {
41         return m_capacity - m_pos;
42     }
43
44     inline void inc_write_pointer(size_t s) {
45         m_pos += s;
46     }
47
48     inline char * write_pointer() {
49         return m_buf + m_pos;
50     }
51
52     inline size_t size() {
53         return m_pos;
54     }
55
56     inline operator char*() {
57         return m_buf;
58     }
59
60     inline void flush() {
61         m_w.write(m_buf, m_pos);
62         reset();
63     }
64 };
65
66 }
67 #endif