1 #ifndef OSMIUM_MEMORY_BUFFER_HPP 2 #define OSMIUM_MEMORY_BUFFER_HPP 62 std::runtime_error{
"Osmium buffer is full"} {
125 constexpr
static const std::size_t min_capacity = 64;
167 throw std::invalid_argument{
"buffer size needs to be multiple of alignment"};
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"};
196 throw std::invalid_argument{
"buffer parameter 'committed' can not be larger than capacity"};
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."};
334 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
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");
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");
387 assert(
m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
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");
454 while (
m_written + size > new_capacity) {
482 template <
typename T>
484 assert(
m_data &&
"This must be a valid buffer");
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");
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");
597 template <
typename T>
599 assert(
m_data &&
"This must be a valid buffer");
613 assert(
m_data &&
"This must be a valid buffer");
625 template <
typename T>
627 assert(
m_data &&
"This must be a valid buffer");
640 assert(
m_data &&
"This must be a valid buffer");
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");
677 template <
typename T>
686 template <
typename T>
698 explicit operator bool() const noexcept {
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());
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());
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
bool operator!=(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:780
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
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
bool operator==(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:773
std::size_t m_capacity
Definition: buffer.hpp:114
t_iterator< T > end()
Definition: buffer.hpp:626
uint8_t m_builder_count
Definition: buffer.hpp:118
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
T & get(const std::size_t offset) const
Definition: buffer.hpp:405
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
t_iterator< osmium::OSMEntity > iterator
Definition: buffer.hpp:543
unsigned char * data() const noexcept
Definition: buffer.hpp:251
Buffer() noexcept
Definition: buffer.hpp:142
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
void rollback()
Definition: buffer.hpp:371
std::unique_ptr< unsigned char[]> m_memory
Definition: buffer.hpp:112
const_iterator cbegin() const
Definition: buffer.hpp:650
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:121
Buffer & operator=(const Buffer &)=delete
t_const_iterator< osmium::OSMEntity > const_iterator
Definition: buffer.hpp:549