1#ifndef joedb_File_Buffer_declared
2#define joedb_File_Buffer_declared
19 size_t read_buffer_size;
22 bool buffer_has_write_data()
const noexcept
25 return buffer.
index > 0 && !read_buffer_size;
29 bool buffer_has_read_data()
const
32 return read_buffer_size;
44 if (read_buffer_size == 0)
59 void check_write_buffer()
81 template<
typename T>
void write(T x)
84 static_assert(
sizeof(T) <=
decltype(buffer)::extra_size);
90 template<
typename T> T
read()
94 read_data(
reinterpret_cast<char *
>(&result),
sizeof(result));
103 check_write_buffer();
110 if (buffer.
index + 8 <= read_buffer_size)
113 const uint8_t first_byte = read<uint8_t>();
114 int extra_bytes = first_byte >> 5;
115 T result = first_byte & 0x1f;
116 while (--extra_bytes >= 0)
117 result = T((result << 8) | read<uint8_t>());
133 return Record_Id(read_strong_type<Record_Id>() - 1);
143 compact_write<int64_t>(blob.
get_size());
148 const int64_t position = compact_read<int64_t>();
149 const int64_t size = compact_read<int64_t>();
150 return Blob(position, size);
161 std::memcpy(buffer.
data + buffer.
index, data, n);
163 check_write_buffer();
171 std::memcpy(buffer.
data + buffer.
index, data, n);
173 check_write_buffer();
190 if (buffer.
index + n <= read_buffer_size)
192 std::memcpy(data, buffer.
data + buffer.
index, n);
198 size_t n0 = read_buffer_size - buffer.
index;
199 std::memcpy(data, buffer.
data + buffer.
index, n0);
202 if (n <= buffer.
size)
206 while (n0 < n && buffer.
index < read_buffer_size)
207 data[n0++] = buffer.
data[buffer.
index++];
213 if (actually_read == 0)
229 if (buffer.
index + n <= read_buffer_size)
static void reading_past_end_of_file()
int64_t get_position() const noexcept
int64_t get_size() const noexcept
static constexpr size_t extra_size
char data[size+extra_size]
static constexpr size_t size
void write_reference(Record_Id id)
size_t read_data(char *data, const size_t n)
void write_blob(Blob blob)
std::string safe_read_string(int64_t max_size)
void write_data(const char *data, size_t n)
int64_t get_position() const noexcept
void ignore(const int64_t n)
std::string read_string()
void set_position(int64_t position)
Record_Id read_reference()
void write_string(const std::string &s)
int64_t get_position() const noexcept
void write(const char *data, size_t size)
size_t read(char *data, size_t size)
#define JOEDB_DEBUG_ASSERT(x)
assertion tested in debug mode
constexpr index_t to_underlying(Record_Id id)
typename std::underlying_type< T >::type type