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)
45 file.reading_past_end_of_file();
59 void check_write_buffer()
64 if (buffer.index >= buffer.size)
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));
102 buffer.compact_write<T>(x);
103 check_write_buffer();
110 if (buffer.index + 8 <= read_buffer_size)
111 return buffer.compact_read<T>();
114#ifdef JOEDB_DIRTY_WORKAROUND
115 if (first_byte == 0xff)
118 int extra_bytes = first_byte >> 5;
119 T result = first_byte & 0x1f;
120 while (--extra_bytes >= 0)
154 return Blob(position, size);
163 if (n <= buffer.extra_size || n < buffer.size + buffer.extra_size - buffer.index)
165 std::memcpy(buffer.data + buffer.index, data, n);
167 check_write_buffer();
183 if (buffer.index + n <= read_buffer_size)
185 std::memcpy(data, buffer.data + buffer.index, n);
191 size_t n0 = read_buffer_size - buffer.index;
192 std::memcpy(data, buffer.data + buffer.index, n0);
195 if (n <= buffer.size)
199 while (n0 < n && buffer.index < read_buffer_size)
200 data[n0++] = buffer.data[buffer.index++];
213 if (buffer.index + n <= read_buffer_size)
int64_t get_position() const noexcept
int64_t get_size() const noexcept
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)
File_Buffer(Abstract_File &file)
std::string read_string()
void write_string(std::string_view s)
void set_position(int64_t position)
Record_Id read_reference()
int64_t get_position() const noexcept
void write(const char *data, size_t size)
void full_read(char *data, size_t size)
File_Iterator(Abstract_File &file)
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