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");
208 m_memory(new unsigned char[calculate_capacity(capacity)]),
209 m_data(m_memory.get()),
210 m_capacity(calculate_capacity(capacity)),
232 assert(m_builder_count > 0);
237 return m_builder_count;
246 unsigned char*
data() const noexcept {
247 assert(m_data &&
"This must be a valid buffer");
283 assert(m_data &&
"This must be a valid buffer");
308 assert(m_data &&
"This must be a valid buffer");
329 assert(m_data &&
"This must be a valid buffer");
331 throw std::logic_error(
"Can't grow Buffer if it doesn't use internal memory management.");
333 if (m_capacity < size) {
335 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
337 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
338 std::copy_n(m_memory.get(), m_capacity, memory.get());
340 swap(m_memory, memory);
341 m_data = m_memory.get();
359 assert(m_data &&
"This must be a valid buffer");
360 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
361 assert(is_aligned());
363 const size_t offset = m_committed;
364 m_committed = m_written;
375 assert(m_data &&
"This must be a valid buffer");
376 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
377 m_written = m_committed;
390 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
391 const size_t committed = m_committed;
407 template <
typename T>
408 T&
get(
const size_t offset)
const {
409 assert(m_data &&
"This must be a valid buffer");
410 return *
reinterpret_cast<T*
>(&m_data[offset]);
447 assert(m_data &&
"This must be a valid buffer");
449 if (m_written + size > m_capacity && m_full) {
453 if (m_written + size > m_capacity) {
454 if (m_memory && (m_auto_grow == auto_grow::yes)) {
456 size_t new_capacity = m_capacity * 2;
457 while (m_written + size > new_capacity) {
465 unsigned char* data = &m_data[m_written];
485 template <
typename T>
487 assert(m_data &&
"This must be a valid buffer");
488 unsigned char* target = reserve_space(item.padded_size());
489 std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
490 return *
reinterpret_cast<T*
>(target);
505 assert(m_data &&
"This must be a valid buffer");
506 assert(buffer &&
"Buffer parameter must be a valid buffer");
507 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
508 unsigned char* target = reserve_space(buffer.
committed());
522 assert(m_data &&
"This must be a valid buffer");
523 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
532 template <
typename T>
539 template <
typename T>
554 template <
typename T>
559 template <
typename T>
572 template <
typename T>
574 assert(m_data &&
"This must be a valid buffer");
587 assert(m_data &&
"This must be a valid buffer");
588 return iterator(m_data, m_data + m_committed);
600 template <
typename T>
602 assert(m_data &&
"This must be a valid buffer");
616 assert(m_data &&
"This must be a valid buffer");
617 return iterator(m_data + offset, m_data + m_committed);
628 template <
typename T>
630 assert(m_data &&
"This must be a valid buffer");
631 return t_iterator<T>(m_data + m_committed, m_data + m_committed);
643 assert(m_data &&
"This must be a valid buffer");
644 return iterator(m_data + m_committed, m_data + m_committed);
647 template <
typename T>
649 assert(m_data &&
"This must be a valid buffer");
654 assert(m_data &&
"This must be a valid buffer");
658 template <
typename T>
660 assert(m_data &&
"This must be a valid buffer");
665 assert(m_data &&
"This must be a valid buffer");
669 template <
typename T>
671 assert(m_data &&
"This must be a valid buffer");
676 assert(m_data &&
"This must be a valid buffer");
677 return const_iterator(m_data + m_committed, m_data + m_committed);
680 template <
typename T>
689 template <
typename T>
701 explicit operator bool() const noexcept {
702 return m_data !=
nullptr;
733 template <
typename TCallbackClass>
735 assert(m_data &&
"This must be a valid buffer");
744 next = std::next(it_read);
745 if (!it_read->removed()) {
746 if (it_read != it_write) {
747 assert(it_read.data() >= data());
748 assert(it_write.
data() >= data());
749 size_t old_offset =
static_cast<size_t>(it_read.data() - data());
750 size_t new_offset =
static_cast<size_t>(it_write.
data() - data());
751 callback->moving_in_buffer(old_offset, new_offset);
752 std::memmove(it_write.
data(), it_read.data(), it_read->padded_size());
758 assert(it_write.
data() >= data());
759 m_written =
static_cast<size_t>(it_write.
data() - data());
760 m_committed = m_written;
780 return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
784 return ! (lhs == rhs);
791 #endif // OSMIUM_MEMORY_BUFFER_HPP size_t m_written
Definition: buffer.hpp:114
void swap(Buffer &other)
Definition: buffer.hpp:705
t_const_iterator< T > begin() const
Definition: buffer.hpp:681
size_t clear()
Definition: buffer.hpp:389
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
bool is_aligned() const noexcept
Definition: buffer.hpp:282
t_const_iterator< T > get_iterator(size_t offset) const
Definition: buffer.hpp:659
size_t written() const noexcept
Definition: buffer.hpp:272
OSMIUM_DEPRECATED void set_full_callback(std::function< void(Buffer &)> full)
Definition: buffer.hpp:307
Definition: item_iterator.hpp:175
iterator get_iterator(size_t offset)
Definition: buffer.hpp:615
void grow(size_t size)
Definition: buffer.hpp:328
t_const_iterator< T > cend() const
Definition: buffer.hpp:670
const_iterator cend() const
Definition: buffer.hpp:675
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:664
void increment_builder_count() noexcept
Definition: buffer.hpp:227
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:560
void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:765
Buffer(size_t capacity, auto_grow auto_grow=auto_grow::yes)
Definition: buffer.hpp:207
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
const_iterator begin() const
Definition: buffer.hpp:685
t_iterator< T > end()
Definition: buffer.hpp:629
Namespace for everything in the Osmium library.
Definition: assembler.hpp:63
T & add_item(const T &item)
Definition: buffer.hpp:486
void purge_removed(TCallbackClass *callback)
Definition: buffer.hpp:734
t_iterator< T > begin()
Definition: buffer.hpp:573
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:504
uint8_t builder_count() const noexcept
Definition: buffer.hpp:236
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:246
Buffer() noexcept
Definition: buffer.hpp:141
size_t capacity() const noexcept
Definition: buffer.hpp:255
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:446
auto_grow m_auto_grow
Definition: buffer.hpp:119
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:521
constexpr const item_size_type align_bytes
Definition: item.hpp:62
iterator end()
Definition: buffer.hpp:642
iterator begin()
Definition: buffer.hpp:586
size_t m_capacity
Definition: buffer.hpp:113
size_t committed() const noexcept
Definition: buffer.hpp:263
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:648
Definition: buffer.hpp:58
void decrement_builder_count() noexcept
Definition: buffer.hpp:231
const_iterator end() const
Definition: buffer.hpp:694
auto_grow
Definition: buffer.hpp:104
t_const_iterator< T > end() const
Definition: buffer.hpp:690
data_type data() noexcept
Definition: item_iterator.hpp:135
buffer_is_full()
Definition: buffer.hpp:60
ItemIteratorRange< T > select()
Definition: buffer.hpp:555
osmium::io::InputIterator< osmium::io::Reader > begin(osmium::io::Reader &reader)
Definition: reader_iterator.hpp:41
void rollback()
Definition: buffer.hpp:374
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:601
const_iterator cbegin() const
Definition: buffer.hpp:653
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:120
size_t commit()
Definition: buffer.hpp:358