1 #ifndef OSMIUM_MEMORY_BUFFER_HPP 2 #define OSMIUM_MEMORY_BUFFER_HPP 62 std::runtime_error{
"Osmium buffer is full"} {
118 uint8_t m_builder_count = 0;
125 constexpr
static const std::size_t min_capacity = 64;
126 if (capacity < min_capacity) {
160 explicit Buffer(
unsigned char* data, std::size_t size) :
167 throw std::invalid_argument{
"buffer size needs to be multiple of alignment"};
183 explicit Buffer(
unsigned char* data, std::size_t capacity, std::size_t committed) :
186 m_capacity(capacity),
187 m_written(committed),
188 m_committed(committed) {
190 throw std::invalid_argument{
"buffer capacity needs to be multiple of alignment"};
193 throw std::invalid_argument{
"buffer parameter 'committed' needs to be multiple of alignment"};
195 if (committed > capacity) {
196 throw std::invalid_argument{
"buffer parameter 'committed' can not be larger than capacity"};
213 m_memory(new unsigned char[calculate_capacity(capacity)]),
214 m_data(m_memory.get()),
215 m_capacity(calculate_capacity(capacity)),
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");
308 assert(m_data &&
"This must be a valid buffer");
328 assert(m_data &&
"This must be a valid buffer");
330 throw std::logic_error{
"Can't grow Buffer if it doesn't use internal memory management."};
332 size = calculate_capacity(size);
333 if (m_capacity < size) {
334 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
335 std::copy_n(m_memory.get(), m_capacity, memory.get());
337 swap(m_memory, memory);
338 m_data = m_memory.get();
356 assert(m_data &&
"This must be a valid buffer");
357 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
358 assert(is_aligned());
360 const std::size_t offset = m_committed;
361 m_committed = m_written;
372 assert(m_data &&
"This must be a valid buffer");
373 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
374 m_written = m_committed;
387 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
388 const std::size_t committed = m_committed;
404 template <
typename T>
405 T&
get(
const std::size_t offset)
const {
406 assert(m_data &&
"This must be a valid buffer");
407 return *
reinterpret_cast<T*
>(&m_data[offset]);
444 assert(m_data &&
"This must be a valid buffer");
446 if (m_written + size > m_capacity && m_full) {
450 if (m_written + size > m_capacity) {
451 if (m_memory && (m_auto_grow == auto_grow::yes)) {
453 std::size_t new_capacity = m_capacity * 2;
454 while (m_written + size > new_capacity) {
462 unsigned char* data = &m_data[m_written];
482 template <
typename T>
484 assert(m_data &&
"This must be a valid buffer");
485 unsigned char* target = reserve_space(item.padded_size());
486 std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
487 return *
reinterpret_cast<T*
>(target);
502 assert(m_data &&
"This must be a valid buffer");
503 assert(buffer &&
"Buffer parameter must be a valid buffer");
504 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
505 unsigned char* target = reserve_space(buffer.
committed());
519 assert(m_data &&
"This must be a valid buffer");
520 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
529 template <
typename T>
536 template <
typename T>
551 template <
typename T>
556 template <
typename T>
569 template <
typename T>
571 assert(m_data &&
"This must be a valid buffer");
584 assert(m_data &&
"This must be a valid buffer");
585 return iterator(m_data, m_data + m_committed);
597 template <
typename T>
599 assert(m_data &&
"This must be a valid buffer");
613 assert(m_data &&
"This must be a valid buffer");
614 return iterator(m_data + offset, m_data + m_committed);
625 template <
typename T>
627 assert(m_data &&
"This must be a valid buffer");
628 return t_iterator<T>(m_data + m_committed, m_data + m_committed);
640 assert(m_data &&
"This must be a valid buffer");
641 return iterator(m_data + m_committed, m_data + m_committed);
644 template <
typename T>
646 assert(m_data &&
"This must be a valid buffer");
651 assert(m_data &&
"This must be a valid buffer");
655 template <
typename T>
657 assert(m_data &&
"This must be a valid buffer");
662 assert(m_data &&
"This must be a valid buffer");
666 template <
typename T>
668 assert(m_data &&
"This must be a valid buffer");
673 assert(m_data &&
"This must be a valid buffer");
674 return const_iterator(m_data + m_committed, m_data + m_committed);
677 template <
typename T>
686 template <
typename T>
698 explicit operator bool() const noexcept {
699 return m_data !=
nullptr;
730 template <
typename TCallbackClass>
732 assert(m_data &&
"This must be a valid buffer");
741 next = std::next(it_read);
742 if (!it_read->removed()) {
743 if (it_read != it_write) {
744 assert(it_read.data() >= data());
745 assert(it_write.
data() >= data());
746 const auto old_offset =
static_cast<std::size_t
>(it_read.data() - data());
747 const auto new_offset =
static_cast<std::size_t
>(it_write.
data() - data());
748 callback->moving_in_buffer(old_offset, new_offset);
749 std::memmove(it_write.
data(), it_read.data(), it_read->padded_size());
755 assert(it_write.
data() >= data());
756 m_written =
static_cast<std::size_t
>(it_write.
data() - data());
757 m_committed = m_written;
777 return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
781 return ! (lhs == rhs);
788 #endif // OSMIUM_MEMORY_BUFFER_HPP void swap(Buffer &other)
Definition: buffer.hpp:702
std::size_t capacity() const noexcept
Definition: buffer.hpp:260
t_const_iterator< T > begin() const
Definition: buffer.hpp:678
std::size_t commit()
Definition: buffer.hpp:355
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
bool is_aligned() const noexcept
Definition: buffer.hpp:287
iterator get_iterator(std::size_t offset)
Definition: buffer.hpp:612
Definition: item_iterator.hpp:175
t_const_iterator< T > cend() const
Definition: buffer.hpp:667
const_iterator cend() const
Definition: buffer.hpp:672
Definition: item_iterator.hpp:59
OSMIUM_DEPRECATED void set_full_callback(const std::function< void(Buffer &)> &full)
Definition: buffer.hpp:307
constexpr bool operator==(const Box &lhs, const Box &rhs) noexcept
Definition: box.hpp:221
unsigned char * m_data
Definition: buffer.hpp:113
std::size_t m_committed
Definition: buffer.hpp:116
void increment_builder_count() noexcept
Definition: buffer.hpp:232
Definition: reader_iterator.hpp:39
ItemIteratorRange< const T > select() const
Definition: buffer.hpp:557
void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:762
t_const_iterator< T > get_iterator(std::size_t offset) const
Definition: buffer.hpp:656
std::size_t clear()
Definition: buffer.hpp:386
static std::size_t calculate_capacity(std::size_t capacity) noexcept
Definition: buffer.hpp:123
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
std::size_t committed() const noexcept
Definition: buffer.hpp:268
Buffer(std::size_t capacity, auto_grow auto_grow=auto_grow::yes)
Definition: buffer.hpp:212
constexpr const std::size_t align_bytes
Definition: item.hpp:62
const_iterator begin() const
Definition: buffer.hpp:682
std::size_t m_capacity
Definition: buffer.hpp:114
t_iterator< T > end()
Definition: buffer.hpp:626
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
T & add_item(const T &item)
Definition: buffer.hpp:483
void purge_removed(TCallbackClass *callback)
Definition: buffer.hpp:731
t_iterator< T > begin()
Definition: buffer.hpp:570
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:501
std::size_t written() const noexcept
Definition: buffer.hpp:277
uint8_t builder_count() const noexcept
Definition: buffer.hpp:241
Buffer(unsigned char *data, std::size_t capacity, std::size_t committed)
Definition: buffer.hpp:183
Buffer(unsigned char *data, std::size_t size)
Definition: buffer.hpp:160
std::size_t m_written
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:142
osmium::io::InputIterator< osmium::io::Reader > end(osmium::io::Reader &)
Definition: reader_iterator.hpp:45
void grow(std::size_t size)
Definition: buffer.hpp:327
unsigned char * reserve_space(const std::size_t size)
Definition: buffer.hpp:443
auto_grow m_auto_grow
Definition: buffer.hpp:120
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:518
iterator end()
Definition: buffer.hpp:639
iterator begin()
Definition: buffer.hpp:583
const_iterator get_iterator(std::size_t offset) const
Definition: buffer.hpp:661
Definition: buffer.hpp:98
t_const_iterator< T > cbegin() const
Definition: buffer.hpp:645
Definition: buffer.hpp:59
void decrement_builder_count() noexcept
Definition: buffer.hpp:236
const_iterator end() const
Definition: buffer.hpp:691
auto_grow
Definition: buffer.hpp:105
t_const_iterator< T > end() const
Definition: buffer.hpp:687
data_type data() noexcept
Definition: item_iterator.hpp:135
t_iterator< T > get_iterator(std::size_t offset)
Definition: buffer.hpp:598
buffer_is_full()
Definition: buffer.hpp:61
ItemIteratorRange< T > select()
Definition: buffer.hpp:552
osmium::io::InputIterator< osmium::io::Reader > begin(osmium::io::Reader &reader)
Definition: reader_iterator.hpp:41
void rollback()
Definition: buffer.hpp:371
std::unique_ptr< unsigned char[]> m_memory
Definition: buffer.hpp:112
bool operator!=(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:440
const_iterator cbegin() const
Definition: buffer.hpp:650
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:121