1 #ifndef OSMIUM_IO_WRITER_HPP 2 #define OSMIUM_IO_WRITER_HPP 41 #include <initializer_list> 47 #include <osmium/io/detail/output_format.hpp> 48 #include <osmium/io/detail/queue_util.hpp> 49 #include <osmium/io/detail/read_write.hpp> 50 #include <osmium/io/detail/write_thread.hpp> 69 inline size_t get_output_queue_size() noexcept {
101 static constexpr
size_t default_buffer_size = 10 * 1024 * 1024;
107 std::unique_ptr<osmium::io::detail::OutputFormat>
m_output;
124 static void write_thread(detail::future_string_queue_type& output_queue,
125 std::unique_ptr<osmium::io::Compressor>&& compressor,
126 std::promise<bool>&& write_promise) {
127 detail::WriteThread write_thread{output_queue,
128 std::move(compressor),
129 std::move(write_promise)};
134 if (buffer && buffer.committed() > 0) {
135 m_output->write_buffer(std::move(buffer));
141 if (m_buffer && m_buffer.
committed() > 0) {
145 swap(m_buffer, buffer);
147 m_output->write_buffer(std::move(buffer));
151 template <
typename TFunction,
typename... TArgs>
153 if (m_status != status::okay) {
154 throw io_error(
"Can not write to writer when in status 'closed' or 'error'");
158 func(std::forward<TArgs>(args)...);
160 m_status = status::error;
161 detail::add_to_queue(m_output_queue, std::current_exception());
162 detail::add_end_of_data_to_queue(m_output_queue);
182 options.
sync = value;
210 template <
typename... TArgs>
212 m_file(file.check()),
213 m_output_queue(
detail::get_output_queue_size(),
"raw_output"),
214 m_output(
osmium::io::
detail::OutputFormatFactory::instance().create_output(m_file, m_output_queue)),
216 m_buffer_size(default_buffer_size),
223 (void)std::initializer_list<int>{
224 (set_option(options, args), 0)...
227 std::unique_ptr<osmium::io::Compressor> compressor =
228 CompressionFactory::instance().create_compressor(file.
compression(),
229 osmium::io::detail::open_for_writing(m_file.
filename(), options.allow_overwrite),
232 std::promise<bool> write_promise;
233 m_write_future = write_promise.get_future();
236 ensure_cleanup([&](){
237 m_output->write_header(options.header);
241 template <
typename... TArgs>
242 explicit Writer(
const std::string& filename, TArgs&&... args) :
246 template <
typename... TArgs>
247 explicit Writer(
const char* filename, TArgs&&... args) :
269 return m_buffer_size;
277 m_buffer_size = size;
288 ensure_cleanup([&](){
302 ensure_cleanup([&](){
304 do_write(std::move(buffer));
316 ensure_cleanup([&](){
340 if (m_status == status::okay) {
341 ensure_cleanup([&](){
342 do_write(std::move(m_buffer));
343 m_output->write_end();
344 m_status = status::closed;
345 detail::add_end_of_data_to_queue(m_output_queue);
349 if (m_write_future.valid()) {
350 m_write_future.get();
360 #endif // OSMIUM_IO_WRITER_HPP fsync sync
Definition: writer.hpp:170
~Writer() noexcept
Definition: writer.hpp:257
Definition: writer.hpp:167
void do_write(osmium::memory::Buffer &&buffer)
Definition: writer.hpp:133
void do_flush()
Definition: writer.hpp:139
Definition: reader_iterator.hpp:39
void swap(Buffer &lhs, Buffer &rhs)
Definition: buffer.hpp:770
osmium::thread::thread_handler m_thread
Definition: writer.hpp:115
osmium::io::Header header
Definition: writer.hpp:168
osmium::memory::Buffer m_buffer
Definition: writer.hpp:109
std::unique_ptr< osmium::io::detail::OutputFormat > m_output
Definition: writer.hpp:107
void set_buffer_size(size_t size) noexcept
Definition: writer.hpp:276
static void write_thread(detail::future_string_queue_type &output_queue, std::unique_ptr< osmium::io::Compressor > &&compressor, std::promise< bool > &&write_promise)
Definition: writer.hpp:124
void operator()(osmium::memory::Buffer &&buffer)
Definition: writer.hpp:301
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
status
Definition: writer.hpp:117
size_t buffer_size() const noexcept
Definition: writer.hpp:268
fsync
Definition: writer_options.hpp:51
static void set_option(options_type &options, fsync value)
Definition: writer.hpp:181
void push_back(const osmium::memory::Item &item)
Definition: buffer.hpp:526
size_t m_buffer_size
Definition: writer.hpp:111
void close()
Definition: writer.hpp:339
void flush()
Definition: writer.hpp:287
osmium::io::File m_file
Definition: writer.hpp:103
size_t committed() const noexcept
Definition: buffer.hpp:268
size_t get_max_queue_size(const char *queue_name, size_t default_value) noexcept
Definition: config.hpp:69
Definition: buffer.hpp:97
Definition: buffer.hpp:58
const char * buffer() const noexcept
Definition: file.hpp:156
static void set_option(options_type &options, overwrite value)
Definition: writer.hpp:177
Definition: writer.hpp:99
Writer(const char *filename, TArgs &&... args)
Definition: writer.hpp:247
std::future< bool > m_write_future
Definition: writer.hpp:113
Writer(const osmium::io::File &file, TArgs &&... args)
Definition: writer.hpp:211
void check_for_exception(std::future< T > &future)
Definition: util.hpp:55
Writer(const std::string &filename, TArgs &&... args)
Definition: writer.hpp:242
overwrite allow_overwrite
Definition: writer.hpp:169
static void set_option(options_type &options, const osmium::io::Header &header)
Definition: writer.hpp:173
detail::future_string_queue_type m_output_queue
Definition: writer.hpp:105
file_compression compression() const noexcept
Definition: file.hpp:289
File & filename(const std::string &filename)
Definition: file.hpp:307
void operator()(const osmium::memory::Item &item)
Definition: writer.hpp:315
void ensure_cleanup(TFunction func, TArgs &&... args)
Definition: writer.hpp:152
overwrite
Definition: writer_options.hpp:43