1 #ifndef OSMIUM_MEMORY_BUFFER_HPP
2 #define OSMIUM_MEMORY_BUFFER_HPP
61 std::runtime_error(
"Osmium buffer is full") {
154 throw std::invalid_argument(
"buffer size needs to be multiple of alignment");
172 m_capacity(capacity),
173 m_written(committed),
174 m_committed(committed) {
176 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
179 throw std::invalid_argument(
"buffer parameter 'committed' needs to be multiple of alignment");
198 m_memory(new unsigned char[capacity]),
199 m_data(m_memory.
get()),
200 m_capacity(capacity),
205 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
224 unsigned char*
data() const noexcept {
310 throw std::logic_error(
"Can't grow Buffer if it doesn't use internal memory management.");
312 if (m_capacity < size) {
314 throw std::invalid_argument(
"buffer capacity needs to be multiple of alignment");
316 std::unique_ptr<unsigned char[]> memory(
new unsigned char[size]);
317 std::copy_n(m_memory.get(),
m_capacity, memory.get());
319 swap(m_memory, memory);
320 m_data = m_memory.get();
378 template <
typename T>
379 T&
get(
const size_t offset)
const {
381 return *
reinterpret_cast<T*
>(&m_data[offset]);
420 if (m_written + size > m_capacity && m_full) {
424 if (m_written + size > m_capacity) {
427 size_t new_capacity = m_capacity * 2;
428 while (m_written + size > new_capacity) {
456 template <
typename T>
460 std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
461 return *
reinterpret_cast<T*
>(target);
475 assert(m_data && buffer);
498 template <
typename T>
505 template <
typename T>
520 template <
typename T>
525 template <
typename T>
538 template <
typename T>
554 return iterator(m_data, m_data + m_committed);
566 template <
typename T>
583 return iterator(m_data + offset, m_data + m_committed);
594 template <
typename T>
610 return iterator(m_data + m_committed, m_data + m_committed);
613 template <
typename T>
624 template <
typename T>
635 template <
typename T>
643 return const_iterator(m_data + m_committed, m_data + m_committed);
646 template <
typename T>
655 template <
typename T>
667 explicit operator bool() const noexcept {
668 return m_data !=
nullptr;
699 template <
typename TCallbackClass>
710 next = std::next(it_read);
711 if (!it_read->removed()) {
712 if (it_read != it_write) {
713 assert(it_read.data() >=
data());
715 size_t old_offset =
static_cast<size_t>(it_read.data() -
data());
716 size_t new_offset =
static_cast<size_t>(it_write.
data() -
data());
717 callback->moving_in_buffer(old_offset, new_offset);
718 std::memmove(it_write.
data(), it_read.data(), it_read->padded_size());
725 m_written =
static_cast<size_t>(it_write.
data() -
data());
746 return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
750 return ! (lhs == rhs);
757 #endif // OSMIUM_MEMORY_BUFFER_HPP
size_t m_written
Definition: buffer.hpp:114
void swap(Buffer &other)
Definition: buffer.hpp:671
t_const_iterator< T > cend() const
Definition: buffer.hpp:636
const_iterator begin() const
Definition: buffer.hpp:651
size_t clear()
Definition: buffer.hpp:361
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
bool is_aligned() const noexcept
Definition: buffer.hpp:260
size_t written() const noexcept
Definition: buffer.hpp:250
OSMIUM_DEPRECATED void set_full_callback(std::function< void(Buffer &)> full)
Definition: buffer.hpp:285
Definition: item_iterator.hpp:235
iterator get_iterator(size_t offset)
Definition: buffer.hpp:581
bool operator!=(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:749
void grow(size_t size)
Definition: buffer.hpp:307
const_iterator end() const
Definition: buffer.hpp:660
Definition: item_iterator.hpp:119
unsigned char * m_data
Definition: buffer.hpp:112
constexpr item_size_type align_bytes
Definition: item.hpp:53
ItemIteratorRange< const T > select() const
Definition: buffer.hpp:526
Buffer(unsigned char *data, size_t capacity, size_t committed)
Definition: buffer.hpp:169
Definition: reader_iterator.hpp:39
void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:731
Buffer(size_t capacity, auto_grow auto_grow=auto_grow::yes)
Definition: buffer.hpp:197
bool operator==(const Buffer &lhs, const Buffer &rhs) noexcept
Definition: buffer.hpp:742
t_iterator< T > end()
Definition: buffer.hpp:595
Namespace for everything in the Osmium library.
Definition: assembler.hpp:66
T & add_item(const T &item)
Definition: buffer.hpp:457
void purge_removed(TCallbackClass *callback)
Definition: buffer.hpp:700
t_iterator< T > begin()
Definition: buffer.hpp:539
void add_buffer(const Buffer &buffer)
Definition: buffer.hpp:474
const_iterator cbegin() const
Definition: buffer.hpp:619
size_t m_committed
Definition: buffer.hpp:115
ItemIterator< TMember > & advance_once() noexcept
Definition: item_iterator.hpp:174
t_iterator< osmium::OSMEntity > iterator
Definition: buffer.hpp:512
unsigned char * data() const noexcept
Definition: buffer.hpp:224
Buffer() noexcept
Definition: buffer.hpp:129
size_t capacity() const noexcept
Definition: buffer.hpp:233
unsigned char * reserve_space(const size_t size)
Definition: buffer.hpp:417
auto_grow m_auto_grow
Definition: buffer.hpp:116
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:488
iterator end()
Definition: buffer.hpp:608
iterator begin()
Definition: buffer.hpp:552
const_iterator cend() const
Definition: buffer.hpp:641
size_t m_capacity
Definition: buffer.hpp:113
t_const_iterator< T > get_iterator(size_t offset) const
Definition: buffer.hpp:625
size_t committed() const noexcept
Definition: buffer.hpp:241
Buffer(unsigned char *data, size_t size)
Definition: buffer.hpp:147
t_const_iterator< T > end() const
Definition: buffer.hpp:656
Definition: buffer.hpp:97
T & get(const size_t offset) const
Definition: buffer.hpp:379
Definition: buffer.hpp:58
const_iterator get_iterator(size_t offset) const
Definition: buffer.hpp:630
t_const_iterator< T > cbegin() const
Definition: buffer.hpp:614
t_const_iterator< T > begin() const
Definition: buffer.hpp:647
auto_grow
Definition: buffer.hpp:104
data_type data() noexcept
Definition: item_iterator.hpp:195
buffer_is_full()
Definition: buffer.hpp:60
ItemIteratorRange< T > select()
Definition: buffer.hpp:521
void rollback()
Definition: buffer.hpp:349
std::unique_ptr< unsigned char[]> m_memory
Definition: buffer.hpp:111
t_iterator< T > get_iterator(size_t offset)
Definition: buffer.hpp:567
std::function< void(Buffer &)> m_full
Definition: buffer.hpp:117
Buffer & operator=(const Buffer &)=delete
size_t commit()
Definition: buffer.hpp:335
t_const_iterator< osmium::OSMEntity > const_iterator
Definition: buffer.hpp:518