1 #ifndef OSMIUM_MEMORY_BUFFER_HPP
2 #define OSMIUM_MEMORY_BUFFER_HPP
61 std::runtime_error(
"Osmium buffer is full") {
146 throw std::invalid_argument(
"buffer size needs to be multiple of alignment");
162 m_capacity(capacity),
163 m_written(committed),
164 m_committed(committed) {
166 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
169 throw std::invalid_argument(
"buffer parameter 'committed' needs to be multiple of alignment");
181 m_data(m_memory.
data()),
182 m_capacity(capacity),
187 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
204 unsigned char*
data() const noexcept {
255 if (m_memory.empty()) {
256 throw std::logic_error(
"Can't grow Buffer if it doesn't use internal memory management.");
258 if (m_capacity < size) {
260 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
262 m_memory.resize(size);
263 m_data = m_memory.data();
307 T&
get(
const size_t offset)
const {
308 return *
reinterpret_cast<T*
>(&m_data[offset]);
337 if (m_written + size > m_capacity) {
342 size_t new_capacity = m_capacity * 2;
343 while (m_written + size > new_capacity) {
370 std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
371 return *
reinterpret_cast<T*
>(target);
382 std::copy_n(reinterpret_cast<const unsigned char*>(buffer.
data()), buffer.
committed(), target);
413 return iterator(m_data, m_data + m_committed);
422 return iterator(m_data + offset, m_data + m_committed);
431 return iterator(m_data + m_committed, m_data + m_committed);
458 return const_iterator(m_data + m_committed, m_data + m_committed);
475 const_iterator
end()
const {
482 explicit operator bool()
const {
483 return m_data !=
nullptr;
510 template <
class TCallbackClass>
516 iterator it_write =
begin();
519 for (iterator it_read =
begin(); it_read !=
end(); it_read = next) {
520 next = std::next(it_read);
521 if (!it_read->removed()) {
522 if (it_read != it_write) {
523 assert(it_read.data() >=
data());
525 size_t old_offset =
static_cast<size_t>(it_read.data() -
data());
526 size_t new_offset =
static_cast<size_t>(it_write.
data() -
data());
527 callback->moving_in_buffer(old_offset, new_offset);
528 std::memmove(it_write.
data(), it_read.data(), it_read->padded_size());
535 m_written =
static_cast<size_t>(it_write.
data() -
data());
542 return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
546 return ! (lhs == rhs);
553 #endif // OSMIUM_MEMORY_BUFFER_HPP
size_t m_written
Definition: buffer.hpp:109
Item value_type
Definition: buffer.hpp:116
t_const_iterator< T > cend() const
Definition: buffer.hpp:453
const_iterator begin() const
Definition: buffer.hpp:466
size_t clear()
Definition: buffer.hpp:293
bool is_aligned() const noexcept
Definition: buffer.hpp:234
size_t written() const noexcept
Definition: buffer.hpp:226
iterator get_iterator(size_t offset)
Definition: buffer.hpp:421
bool operator!=(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:545
void grow(size_t size)
Definition: buffer.hpp:254
const_iterator end() const
Definition: buffer.hpp:475
Definition: item_iterator.hpp:131
unsigned char * m_data
Definition: buffer.hpp:107
t_const_iterator< osmium::OSMEntity > const_iterator
Definition: buffer.hpp:405
constexpr item_size_type align_bytes
Definition: item.hpp:54
Buffer(unsigned char *data, size_t capacity, size_t committed)
Definition: buffer.hpp:159
Definition: reader_iterator.hpp:39
ItemIterator< TMember > & advance_once()
Definition: item_iterator.hpp:180
Buffer(size_t capacity, auto_grow auto_grow=auto_grow::yes)
Definition: buffer.hpp:179
unsigned char * data() const
Definition: item_iterator.hpp:201
bool operator==(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:541
t_iterator< T > end()
Definition: buffer.hpp:426
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
T & add_item(const T &item)
Definition: buffer.hpp:368
void purge_removed(TCallbackClass *callback)
Definition: buffer.hpp:511
t_iterator< T > begin()
Definition: buffer.hpp:408
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:380
friend void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:486
const_iterator cbegin() const
Definition: buffer.hpp:439
size_t m_committed
Definition: buffer.hpp:110
unsigned char * data() const noexcept
Definition: buffer.hpp:204
Buffer() noexcept
Definition: buffer.hpp:123
size_t capacity() const noexcept
Definition: buffer.hpp:211
unsigned char * reserve_space(const size_t size)
Definition: buffer.hpp:336
auto_grow m_auto_grow
Definition: buffer.hpp:111
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:389
iterator end()
Definition: buffer.hpp:430
iterator begin()
Definition: buffer.hpp:412
const_iterator cend() const
Definition: buffer.hpp:457
size_t m_capacity
Definition: buffer.hpp:108
t_const_iterator< T > get_iterator(size_t offset) const
Definition: buffer.hpp:444
size_t committed() const noexcept
Definition: buffer.hpp:218
Buffer(unsigned char *data, size_t size)
Definition: buffer.hpp:139
t_iterator< osmium::OSMEntity > iterator
Definition: buffer.hpp:404
t_const_iterator< T > end() const
Definition: buffer.hpp:471
Definition: buffer.hpp:95
Definition: buffer.hpp:58
const_iterator get_iterator(size_t offset) const
Definition: buffer.hpp:448
t_const_iterator< T > cbegin() const
Definition: buffer.hpp:435
t_const_iterator< T > begin() const
Definition: buffer.hpp:462
auto_grow
Definition: buffer.hpp:99
std::vector< unsigned char > m_memory
Definition: buffer.hpp:106
buffer_is_full()
Definition: buffer.hpp:60
void rollback()
Definition: buffer.hpp:284
t_iterator< T > get_iterator(size_t offset)
Definition: buffer.hpp:417
void set_full_callback(std::function< void(Buffer &)> full)
Definition: buffer.hpp:242
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:112
Buffer & operator=(const Buffer &)=delete
size_t commit()
Definition: buffer.hpp:273