1 #ifndef OSMIUM_IO_COMPRESSION_HPP 2 #define OSMIUM_IO_COMPRESSION_HPP 36 #include <osmium/io/detail/read_write.hpp> 49 #include <system_error> 81 virtual void write(
const std::string& data) = 0;
83 virtual void close() = 0;
89 std::atomic<std::size_t> m_file_size{0};
90 std::atomic<std::size_t> m_offset{0};
95 input_buffer_size = 1024U * 1024U
108 virtual
std::
string read() = 0;
110 virtual
void close() = 0;
158 const auto it = m_callbacks.find(compression);
160 if (it != m_callbacks.end()) {
164 std::string error_message{
"Support for compression '"};
166 error_message +=
"' not compiled into this binary";
187 const create_compressor_type& create_compressor,
188 const create_decompressor_type_fd& create_decompressor_fd,
191 compression_map_type::value_type cc{compression,
192 std::make_tuple(create_compressor,
193 create_decompressor_fd,
194 create_decompressor_buffer)};
196 return m_callbacks.insert(cc).second;
199 template <
typename... TArgs>
201 const auto callbacks = find_callbacks(compression);
202 return std::unique_ptr<osmium::io::Compressor>(std::get<0>(callbacks)(std::forward<TArgs>(args)...));
206 const auto callbacks = find_callbacks(compression);
207 auto p = std::unique_ptr<osmium::io::Decompressor>(std::get<1>(callbacks)(fd));
213 const auto callbacks = find_callbacks(compression);
214 return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(callbacks)(buffer, size));
244 void write(
const std::string& data)
final {
245 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
253 osmium::io::detail::reliable_fsync(fd);
255 osmium::io::detail::reliable_close(fd);
264 const char* m_buffer =
nullptr;
265 std::size_t m_buffer_size = 0;
266 std::size_t m_offset = 0;
276 m_buffer_size(size) {
297 if (m_buffer_size != 0) {
298 const std::size_t size = m_buffer_size;
300 buffer.append(m_buffer, size);
305 buffer.resize(std::string::size_type(nread));
308 m_offset += buffer.size();
309 set_offset(m_offset);
318 osmium::io::detail::reliable_close(fd);
335 inline bool get_registered_no_compression() noexcept {
336 return registered_no_compression;
345 #endif // OSMIUM_IO_COMPRESSION_HPP Definition: compression.hpp:95
void close() final
Definition: compression.hpp:314
NoDecompressor(const char *buffer, const std::size_t size)
Definition: compression.hpp:274
std::size_t file_size(int fd)
Definition: file.hpp:109
std::string read() final
Definition: compression.hpp:293
std::unique_ptr< osmium::io::Compressor > create_compressor(const osmium::io::file_compression compression, TArgs &&... args) const
Definition: compression.hpp:200
static CompressionFactory & instance()
Definition: compression.hpp:180
Compressor(const fsync sync) noexcept
Definition: compression.hpp:69
void close() final
Definition: compression.hpp:248
Definition: location.hpp:550
void write(const std::string &data) final
Definition: compression.hpp:244
std::tuple< create_compressor_type, create_decompressor_type_fd, create_decompressor_type_buffer > callbacks_type
Definition: compression.hpp:149
bool register_compression(osmium::io::file_compression compression, const create_compressor_type &create_compressor, const create_decompressor_type_fd &create_decompressor_fd, const create_decompressor_type_buffer &create_decompressor_buffer)
Definition: compression.hpp:185
virtual ~Compressor() noexcept=default
Definition: compression.hpp:87
fsync m_fsync
Definition: compression.hpp:59
void set_offset(const std::size_t offset) noexcept
Definition: compression.hpp:124
void set_file_size(const std::size_t size) noexcept
Definition: compression.hpp:116
bool do_fsync() const noexcept
Definition: compression.hpp:63
virtual void write(const std::string &data)=0
std::unique_ptr< osmium::io::Decompressor > create_decompressor(const osmium::io::file_compression compression, const char *buffer, const std::size_t size) const
Definition: compression.hpp:212
const char * as_string(file_compression compression)
Definition: file_compression.hpp:48
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
const callbacks_type & find_callbacks(const osmium::io::file_compression compression) const
Definition: compression.hpp:157
fsync
Definition: writer_options.hpp:51
std::size_t offset() const noexcept
Definition: compression.hpp:120
~NoCompressor() noexcept final
Definition: compression.hpp:236
std::function< osmium::io::Decompressor *(const char *, std::size_t)> create_decompressor_type_buffer
Definition: compression.hpp:143
std::map< const osmium::io::file_compression, callbacks_type > compression_map_type
Definition: compression.hpp:151
file_compression
Definition: file_compression.hpp:42
std::function< osmium::io::Compressor *(int, fsync)> create_compressor_type
Definition: compression.hpp:141
Compressor & operator=(const Compressor &)=default
Definition: compression.hpp:219
Definition: compression.hpp:57
int m_fd
Definition: compression.hpp:221
NoDecompressor(const int fd)
Definition: compression.hpp:270
compression_map_type m_callbacks
Definition: compression.hpp:153
std::function< osmium::io::Decompressor *(int)> create_decompressor_type_fd
Definition: compression.hpp:142
Definition: compression.hpp:261
std::unique_ptr< osmium::io::Decompressor > create_decompressor(const osmium::io::file_compression compression, const int fd) const
Definition: compression.hpp:205
Definition: compression.hpp:137
NoCompressor(const int fd, const fsync sync)
Definition: compression.hpp:225
~NoDecompressor() noexcept final
Definition: compression.hpp:285