1 #ifndef OSMIUM_MEMORY_BUFFER_HPP 2 #define OSMIUM_MEMORY_BUFFER_HPP 61 std::runtime_error(
"Osmium buffer is full") {
117 uint8_t m_builder_count{0};
124 constexpr
static const size_t min_capacity = 64;
125 if (capacity < min_capacity) {
159 explicit Buffer(
unsigned char* data,
size_t size) :
166 throw std::invalid_argument(
"buffer size needs to be multiple of alignment");
181 explicit Buffer(
unsigned char* data,
size_t capacity,
size_t committed) :
184 m_capacity(capacity),
185 m_written(committed),
186 m_committed(committed) {
188 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
191 throw std::invalid_argument(
"buffer parameter 'committed' needs to be multiple of alignment");
210 m_memory(new unsigned char[calculate_capacity(capacity)]),
211 m_data(m_memory.get()),
212 m_capacity(calculate_capacity(capacity)),
217 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
237 assert(m_builder_count > 0);
242 return m_builder_count;
251 unsigned char*
data() const noexcept {
252 assert(m_data &&
"This must be a valid buffer");
288 assert(m_data &&
"This must be a valid buffer");
313 assert(m_data &&
"This must be a valid buffer");
334 assert(m_data &&
"This must be a valid buffer");
336 throw std::logic_error(
"Can't grow Buffer if it doesn't use internal memory management.");
338 if (m_capacity < size) {
340 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
342 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
343 std::copy_n(m_memory.get(), m_capacity, memory.get());
345 swap(m_memory, memory);
346 m_data = m_memory.get();
364 assert(m_data &&
"This must be a valid buffer");
365 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
366 assert(is_aligned());
368 const size_t offset = m_committed;
369 m_committed = m_written;
380 assert(m_data &&
"This must be a valid buffer");
381 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
382 m_written = m_committed;
395 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
396 const size_t committed = m_committed;
412 template <
typename T>
413 T&
get(
const size_t offset)
const {
414 assert(m_data &&
"This must be a valid buffer");
415 return *
reinterpret_cast<T*
>(&m_data[offset]);
452 assert(m_data &&
"This must be a valid buffer");
454 if (m_written + size > m_capacity && m_full) {
458 if (m_written + size > m_capacity) {
459 if (m_memory && (m_auto_grow == auto_grow::yes)) {
461 size_t new_capacity = m_capacity * 2;
462 while (m_written + size > new_capacity) {
470 unsigned char* data = &m_data[m_written];
490 template <
typename T>
492 assert(m_data &&
"This must be a valid buffer");
493 unsigned char* target = reserve_space(item.padded_size());
494 std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
495 return *
reinterpret_cast<T*
>(target);
510 assert(m_data &&
"This must be a valid buffer");
511 assert(buffer &&
"Buffer parameter must be a valid buffer");
512 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
513 unsigned char* target = reserve_space(buffer.
committed());
527 assert(m_data &&
"This must be a valid buffer");
528 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
537 template <
typename T>
544 template <
typename T>
559 template <
typename T>
564 template <
typename T>
577 template <
typename T>
579 assert(m_data &&
"This must be a valid buffer");
592 assert(m_data &&
"This must be a valid buffer");
593 return iterator(m_data, m_data + m_committed);
605 template <
typename T>
607 assert(m_data &&
"This must be a valid buffer");
621 assert(m_data &&
"This must be a valid buffer");
622 return iterator(m_data + offset, m_data + m_committed);
633 template <
typename T>
635 assert(m_data &&
"This must be a valid buffer");
636 return t_iterator<T>(m_data + m_committed, m_data + m_committed);
648 assert(m_data &&
"This must be a valid buffer");
649 return iterator(m_data + m_committed, m_data + m_committed);
652 template <
typename T>
654 assert(m_data &&
"This must be a valid buffer");
659 assert(m_data &&
"This must be a valid buffer");
663 template <
typename T>
665 assert(m_data &&
"This must be a valid buffer");
670 assert(m_data &&
"This must be a valid buffer");
674 template <
typename T>
676 assert(m_data &&
"This must be a valid buffer");
681 assert(m_data &&
"This must be a valid buffer");
682 return const_iterator(m_data + m_committed, m_data + m_committed);
685 template <
typename T>
694 template <
typename T>
706 explicit operator bool() const noexcept {
707 return m_data !=
nullptr;
738 template <
typename TCallbackClass>
740 assert(m_data &&
"This must be a valid buffer");
749 next = std::next(it_read);
750 if (!it_read->removed()) {
751 if (it_read != it_write) {
752 assert(it_read.data() >= data());
753 assert(it_write.
data() >= data());
754 size_t old_offset =
static_cast<size_t>(it_read.data() - data());
755 size_t new_offset =
static_cast<size_t>(it_write.
data() - data());
756 callback->moving_in_buffer(old_offset, new_offset);
757 std::memmove(it_write.
data(), it_read.data(), it_read->padded_size());
763 assert(it_write.
data() >= data());
764 m_written =
static_cast<size_t>(it_write.
data() - data());
765 m_committed = m_written;
785 return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
789 return ! (lhs == rhs);
796 #endif // OSMIUM_MEMORY_BUFFER_HPP size_t m_written
Definition: buffer.hpp:114
void swap(Buffer &other)
Definition: buffer.hpp:710
t_const_iterator< T > begin() const
Definition: buffer.hpp:686
size_t clear()
Definition: buffer.hpp:394
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
bool is_aligned() const noexcept
Definition: buffer.hpp:287
t_const_iterator< T > get_iterator(size_t offset) const
Definition: buffer.hpp:664
size_t written() const noexcept
Definition: buffer.hpp:277
OSMIUM_DEPRECATED void set_full_callback(std::function< void(Buffer &)> full)
Definition: buffer.hpp:312
Definition: item_iterator.hpp:175
iterator get_iterator(size_t offset)
Definition: buffer.hpp:620
void grow(size_t size)
Definition: buffer.hpp:333
t_const_iterator< T > cend() const
Definition: buffer.hpp:675
const_iterator cend() const
Definition: buffer.hpp:680
Definition: item_iterator.hpp:59
constexpr bool operator==(const Box &lhs, const Box &rhs) noexcept
Definition: box.hpp:221
unsigned char * m_data
Definition: buffer.hpp:112
const_iterator get_iterator(size_t offset) const
Definition: buffer.hpp:669
void increment_builder_count() noexcept
Definition: buffer.hpp:232
Buffer(unsigned char *data, size_t capacity, size_t committed)
Definition: buffer.hpp:181
Definition: reader_iterator.hpp:39
ItemIteratorRange< const T > select() const
Definition: buffer.hpp:565
void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:770
Buffer(size_t capacity, auto_grow auto_grow=auto_grow::yes)
Definition: buffer.hpp:209
const_iterator begin() const
Definition: buffer.hpp:690
t_iterator< T > end()
Definition: buffer.hpp:634
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
T & add_item(const T &item)
Definition: buffer.hpp:491
void purge_removed(TCallbackClass *callback)
Definition: buffer.hpp:739
t_iterator< T > begin()
Definition: buffer.hpp:578
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:509
uint8_t builder_count() const noexcept
Definition: buffer.hpp:241
size_t m_committed
Definition: buffer.hpp:115
ItemIterator< TMember > & advance_once() noexcept
Definition: item_iterator.hpp:114
unsigned char * data() const noexcept
Definition: buffer.hpp:251
Buffer() noexcept
Definition: buffer.hpp:141
size_t capacity() const noexcept
Definition: buffer.hpp:260
osmium::io::InputIterator< osmium::io::Reader > end(osmium::io::Reader &)
Definition: reader_iterator.hpp:45
unsigned char * reserve_space(const size_t size)
Definition: buffer.hpp:451
auto_grow m_auto_grow
Definition: buffer.hpp:119
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:526
constexpr const item_size_type align_bytes
Definition: item.hpp:62
iterator end()
Definition: buffer.hpp:647
iterator begin()
Definition: buffer.hpp:591
size_t m_capacity
Definition: buffer.hpp:113
size_t committed() const noexcept
Definition: buffer.hpp:268
Buffer(unsigned char *data, size_t size)
Definition: buffer.hpp:159
static size_t calculate_capacity(size_t capacity) noexcept
Definition: buffer.hpp:122
Definition: buffer.hpp:97
t_const_iterator< T > cbegin() const
Definition: buffer.hpp:653
Definition: buffer.hpp:58
void decrement_builder_count() noexcept
Definition: buffer.hpp:236
const_iterator end() const
Definition: buffer.hpp:699
auto_grow
Definition: buffer.hpp:104
t_const_iterator< T > end() const
Definition: buffer.hpp:695
data_type data() noexcept
Definition: item_iterator.hpp:135
buffer_is_full()
Definition: buffer.hpp:60
ItemIteratorRange< T > select()
Definition: buffer.hpp:560
osmium::io::InputIterator< osmium::io::Reader > begin(osmium::io::Reader &reader)
Definition: reader_iterator.hpp:41
void rollback()
Definition: buffer.hpp:379
std::unique_ptr< unsigned char[]> m_memory
Definition: buffer.hpp:111
bool operator!=(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:440
t_iterator< T > get_iterator(size_t offset)
Definition: buffer.hpp:606
const_iterator cbegin() const
Definition: buffer.hpp:658
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:120
size_t commit()
Definition: buffer.hpp:363