1 #ifndef OSMIUM_MEMORY_BUFFER_HPP 2 #define OSMIUM_MEMORY_BUFFER_HPP 61 std::runtime_error{
"Osmium buffer is full"} {
112 unsigned char* m_data =
nullptr;
113 std::size_t m_capacity = 0;
114 std::size_t m_written = 0;
115 std::size_t m_committed = 0;
117 uint8_t m_builder_count = 0;
124 constexpr
static const std::size_t min_capacity = 64;
125 if (capacity < min_capacity) {
155 explicit Buffer(
unsigned char* data, std::size_t size) :
162 throw std::invalid_argument{
"buffer size needs to be multiple of alignment"};
178 explicit Buffer(
unsigned char* data, std::size_t capacity, std::size_t committed) :
181 m_capacity(capacity),
182 m_written(committed),
183 m_committed(committed) {
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"};
190 if (committed > capacity) {
191 throw std::invalid_argument{
"buffer parameter 'committed' can not be larger than capacity"};
208 m_memory(new unsigned char[calculate_capacity(capacity)]),
209 m_data(m_memory.get()),
210 m_capacity(calculate_capacity(capacity)),
230 assert(m_builder_count > 0);
235 return m_builder_count;
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."};
325 size = calculate_capacity(size);
326 if (m_capacity < size) {
327 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
328 std::copy_n(m_memory.get(), m_capacity, memory.get());
330 swap(m_memory, memory);
331 m_data = m_memory.get();
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");
351 assert(is_aligned());
353 const std::size_t offset = m_committed;
354 m_committed = m_written;
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");
367 m_written = m_committed;
380 assert(m_builder_count == 0 &&
"Make sure there are no Builder objects still in scope");
381 const std::size_t committed = m_committed;
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");
439 if (m_written + size > m_capacity && m_full) {
443 if (m_written + size > m_capacity) {
444 if (m_memory && (m_auto_grow == auto_grow::yes)) {
446 std::size_t new_capacity = m_capacity * 2;
447 while (m_written + size > new_capacity) {
455 unsigned char* data = &m_data[m_written];
475 template <
typename T>
477 assert(m_data &&
"This must be a valid buffer");
478 unsigned char* target = reserve_space(item.padded_size());
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");
498 unsigned char* target = reserve_space(buffer.
committed());
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");
578 return {m_data, m_data + m_committed};
590 template <
typename T>
592 assert(m_data &&
"This must be a valid buffer");
593 return {m_data + offset, m_data + m_committed};
606 assert(m_data &&
"This must be a valid buffer");
607 return {m_data + offset, m_data + m_committed};
618 template <
typename T>
620 assert(m_data &&
"This must be a valid buffer");
621 return {m_data + m_committed, m_data + m_committed};
633 assert(m_data &&
"This must be a valid buffer");
634 return {m_data + m_committed, m_data + m_committed};
637 template <
typename T>
639 assert(m_data &&
"This must be a valid buffer");
640 return {m_data, m_data + m_committed};
644 assert(m_data &&
"This must be a valid buffer");
645 return {m_data, m_data + m_committed};
648 template <
typename T>
650 assert(m_data &&
"This must be a valid buffer");
651 return {m_data + offset, m_data + m_committed};
655 assert(m_data &&
"This must be a valid buffer");
656 return {m_data + offset, m_data + m_committed};
659 template <
typename T>
661 assert(m_data &&
"This must be a valid buffer");
662 return {m_data + m_committed, m_data + m_committed};
666 assert(m_data &&
"This must be a valid buffer");
667 return {m_data + m_committed, m_data + m_committed};
670 template <
typename T>
679 template <
typename T>
691 explicit operator bool() const noexcept {
692 return m_data !=
nullptr;
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());
738 assert(it_write.
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());
748 assert(it_write.
data() >= data());
749 m_written =
static_cast<std::size_t
>(it_write.
data() - data());
750 m_committed = m_written;
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
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
constexpr bool operator==(const Box &lhs, const Box &rhs) noexcept
Definition: box.hpp:212
unsigned char * m_data
Definition: buffer.hpp:112
InputIterator< Reader > end(Reader &)
Definition: reader_iterator.hpp:47
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
InputIterator< Reader > begin(Reader &reader)
Definition: reader_iterator.hpp:43
std::size_t m_capacity
Definition: buffer.hpp:113
t_iterator< T > end()
Definition: buffer.hpp:619
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
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
bool operator!=(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:446
const_iterator cbegin() const
Definition: buffer.hpp:643
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:120