1 #ifndef OSMIUM_MEMORY_BUFFER_HPP 2 #define OSMIUM_MEMORY_BUFFER_HPP 61 std::runtime_error{
"Osmium buffer is full"} {
124 constexpr
static const std::size_t min_capacity = 64;
162 throw std::invalid_argument{
"buffer size needs to be multiple of alignment"};
185 throw std::invalid_argument{
"buffer capacity needs to be multiple of alignment"};
188 throw std::invalid_argument{
"buffer parameter 'committed' needs to be multiple of alignment"};
191 throw std::invalid_argument{
"buffer parameter 'committed' can not be larger than capacity"};
244 unsigned char*
data() const noexcept {
245 assert(
m_data &&
"This must be a valid buffer");
281 assert(
m_data &&
"This must be a valid buffer");
301 assert(
m_data &&
"This must be a valid buffer");
321 assert(
m_data &&
"This must be a valid buffer");
323 throw std::logic_error{
"Can't grow Buffer if it doesn't use internal memory management."};
327 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
349 assert(
m_data &&
"This must be a valid buffer");
350 assert(
m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
365 assert(
m_data &&
"This must be a valid buffer");
366 assert(
m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
380 assert(
m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
397 template <
typename T>
398 T&
get(
const std::size_t offset)
const {
399 assert(
m_data &&
"This must be a valid buffer");
400 return *
reinterpret_cast<T*
>(&
m_data[offset]);
437 assert(
m_data &&
"This must be a valid buffer");
447 while (
m_written + size > new_capacity) {
475 template <
typename T>
477 assert(
m_data &&
"This must be a valid buffer");
479 std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
480 return *
reinterpret_cast<T*
>(target);
495 assert(
m_data &&
"This must be a valid buffer");
496 assert(buffer &&
"Buffer parameter must be a valid buffer");
497 assert(
m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
512 assert(
m_data &&
"This must be a valid buffer");
513 assert(
m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
522 template <
typename T>
529 template <
typename T>
544 template <
typename T>
549 template <
typename T>
562 template <
typename T>
564 assert(
m_data &&
"This must be a valid buffer");
577 assert(
m_data &&
"This must be a valid buffer");
590 template <
typename T>
592 assert(
m_data &&
"This must be a valid buffer");
606 assert(
m_data &&
"This must be a valid buffer");
618 template <
typename T>
620 assert(
m_data &&
"This must be a valid buffer");
633 assert(
m_data &&
"This must be a valid buffer");
637 template <
typename T>
639 assert(
m_data &&
"This must be a valid buffer");
644 assert(
m_data &&
"This must be a valid buffer");
648 template <
typename T>
650 assert(
m_data &&
"This must be a valid buffer");
655 assert(
m_data &&
"This must be a valid buffer");
659 template <
typename T>
661 assert(
m_data &&
"This must be a valid buffer");
666 assert(
m_data &&
"This must be a valid buffer");
670 template <
typename T>
679 template <
typename T>
691 explicit operator bool() const noexcept {
723 template <
typename TCallbackClass>
725 assert(
m_data &&
"This must be a valid buffer");
734 next = std::next(it_read);
735 if (!it_read->removed()) {
736 if (it_read != it_write) {
737 assert(it_read.data() >=
data());
739 const auto old_offset =
static_cast<std::size_t
>(it_read.data() -
data());
740 const auto new_offset =
static_cast<std::size_t
>(it_write.
data() -
data());
741 callback->moving_in_buffer(old_offset, new_offset);
742 std::memmove(it_write.
data(), it_read.data(), it_read->padded_size());
770 return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
774 return !(lhs == rhs);
781 #endif // OSMIUM_MEMORY_BUFFER_HPP void swap(Buffer &other)
Definition: buffer.hpp:695
std::size_t capacity() const noexcept
Definition: buffer.hpp:253
t_const_iterator< T > begin() const
Definition: buffer.hpp:671
std::size_t commit()
Definition: buffer.hpp:348
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
bool is_aligned() const noexcept
Definition: buffer.hpp:280
iterator get_iterator(std::size_t offset)
Definition: buffer.hpp:605
Definition: item_iterator.hpp:175
bool operator!=(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:773
t_const_iterator< T > cend() const
Definition: buffer.hpp:660
const_iterator cend() const
Definition: buffer.hpp:665
Definition: item_iterator.hpp:59
OSMIUM_DEPRECATED void set_full_callback(const std::function< void(Buffer &)> &full)
Definition: buffer.hpp:300
unsigned char * m_data
Definition: buffer.hpp:112
std::size_t m_committed
Definition: buffer.hpp:115
void increment_builder_count() noexcept
Definition: buffer.hpp:225
Definition: location.hpp:550
ItemIteratorRange< const T > select() const
Definition: buffer.hpp:550
void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:755
t_const_iterator< T > get_iterator(std::size_t offset) const
Definition: buffer.hpp:649
std::size_t clear()
Definition: buffer.hpp:379
static std::size_t calculate_capacity(std::size_t capacity) noexcept
Definition: buffer.hpp:122
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:62
std::size_t committed() const noexcept
Definition: buffer.hpp:261
Buffer(std::size_t capacity, auto_grow auto_grow=auto_grow::yes)
Definition: buffer.hpp:207
constexpr const std::size_t align_bytes
Definition: item.hpp:60
const_iterator begin() const
Definition: buffer.hpp:675
bool operator==(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:766
std::size_t m_capacity
Definition: buffer.hpp:113
t_iterator< T > end()
Definition: buffer.hpp:619
uint8_t m_builder_count
Definition: buffer.hpp:117
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
T & add_item(const T &item)
Definition: buffer.hpp:476
void purge_removed(TCallbackClass *callback)
Definition: buffer.hpp:724
t_iterator< T > begin()
Definition: buffer.hpp:563
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:494
T & get(const std::size_t offset) const
Definition: buffer.hpp:398
std::size_t written() const noexcept
Definition: buffer.hpp:270
uint8_t builder_count() const noexcept
Definition: buffer.hpp:234
Buffer(unsigned char *data, std::size_t capacity, std::size_t committed)
Definition: buffer.hpp:178
Buffer(unsigned char *data, std::size_t size)
Definition: buffer.hpp:155
std::size_t m_written
Definition: buffer.hpp:114
ItemIterator< TMember > & advance_once() noexcept
Definition: item_iterator.hpp:114
unsigned char * data() const noexcept
Definition: buffer.hpp:244
Buffer() noexcept
Definition: buffer.hpp:141
void grow(std::size_t size)
Definition: buffer.hpp:320
unsigned char * reserve_space(const std::size_t size)
Definition: buffer.hpp:436
auto_grow m_auto_grow
Definition: buffer.hpp:119
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:511
iterator end()
Definition: buffer.hpp:632
iterator begin()
Definition: buffer.hpp:576
const_iterator get_iterator(std::size_t offset) const
Definition: buffer.hpp:654
Definition: buffer.hpp:97
t_const_iterator< T > cbegin() const
Definition: buffer.hpp:638
Definition: buffer.hpp:58
void decrement_builder_count() noexcept
Definition: buffer.hpp:229
const_iterator end() const
Definition: buffer.hpp:684
auto_grow
Definition: buffer.hpp:104
t_const_iterator< T > end() const
Definition: buffer.hpp:680
data_type data() noexcept
Definition: item_iterator.hpp:135
t_iterator< T > get_iterator(std::size_t offset)
Definition: buffer.hpp:591
buffer_is_full()
Definition: buffer.hpp:60
ItemIteratorRange< T > select()
Definition: buffer.hpp:545
void rollback()
Definition: buffer.hpp:364
std::unique_ptr< unsigned char[]> m_memory
Definition: buffer.hpp:111
const_iterator cbegin() const
Definition: buffer.hpp:643
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:120
Buffer & operator=(const Buffer &)=delete