1 #ifndef OSMIUM_IO_COMPRESSION_HPP 2 #define OSMIUM_IO_COMPRESSION_HPP 43 #include <system_error> 53 #include <osmium/io/detail/read_write.hpp> 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};
94 static constexpr
unsigned int input_buffer_size = 1024 * 1024;
106 virtual
std::
string read() = 0;
108 virtual
void close() = 0;
162 const auto it = m_callbacks.find(compression);
164 if (it != m_callbacks.end()) {
168 std::string error_message{
"Support for compression '"};
170 error_message +=
"' not compiled into this binary";
183 create_compressor_type create_compressor,
184 create_decompressor_type_fd create_decompressor_fd,
187 compression_map_type::value_type cc{compression,
188 std::make_tuple(create_compressor,
189 create_decompressor_fd,
190 create_decompressor_buffer)};
192 return m_callbacks.insert(cc).second;
195 template <
typename... TArgs>
197 const auto callbacks = find_callbacks(compression);
198 return std::unique_ptr<osmium::io::Compressor>(std::get<0>(callbacks)(std::forward<TArgs>(args)...));
202 const auto callbacks = find_callbacks(compression);
203 auto p = std::unique_ptr<osmium::io::Decompressor>(std::get<1>(callbacks)(fd));
209 const auto callbacks = find_callbacks(compression);
210 return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(callbacks)(buffer, size));
234 void write(
const std::string& data)
final {
235 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
243 osmium::io::detail::reliable_fsync(fd);
245 osmium::io::detail::reliable_close(fd);
256 std::size_t m_offset = 0;
271 m_buffer_size(size) {
286 if (m_buffer_size != 0) {
287 const std::size_t size = m_buffer_size;
289 buffer.append(m_buffer, size);
295 throw std::system_error{errno, std::system_category(),
"Read failed"};
297 buffer.resize(std::string::size_type(nread));
300 m_offset += buffer.size();
301 set_offset(m_offset);
310 osmium::io::detail::reliable_close(fd);
327 inline bool get_registered_no_compression() noexcept {
328 return registered_no_compression;
337 #endif // OSMIUM_IO_COMPRESSION_HPP void set_offset(std::size_t offset) noexcept
Definition: compression.hpp:122
void close() final
Definition: compression.hpp:306
NoDecompressor(int fd)
Definition: compression.hpp:260
std::size_t file_size(int fd)
Definition: file.hpp:109
std::string read() final
Definition: compression.hpp:282
const callbacks_type & find_callbacks(osmium::io::file_compression compression) const
Definition: compression.hpp:161
static CompressionFactory & instance()
Definition: compression.hpp:176
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:94
void close() final
Definition: compression.hpp:238
Definition: reader_iterator.hpp:39
void write(const std::string &data) final
Definition: compression.hpp:234
std::tuple< create_compressor_type, create_decompressor_type_fd, create_decompressor_type_buffer > callbacks_type
Definition: compression.hpp:147
virtual ~Compressor() noexcept=default
Definition: compression.hpp:87
fsync m_fsync
Definition: compression.hpp:65
void set_file_size(std::size_t size) noexcept
Definition: compression.hpp:114
std::size_t m_buffer_size
Definition: compression.hpp:255
virtual void write(const std::string &data)=0
Compressor(fsync sync)
Definition: compression.hpp:75
int m_fd
Definition: compression.hpp:253
NoDecompressor(const char *buffer, std::size_t size)
Definition: compression.hpp:267
const char * as_string(file_compression compression)
Definition: file_compression.hpp:48
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
fsync
Definition: writer_options.hpp:51
bool do_fsync() const
Definition: compression.hpp:69
std::size_t offset() const noexcept
Definition: compression.hpp:118
~NoCompressor() noexcept final
Definition: compression.hpp:226
std::function< osmium::io::Decompressor *(const char *, std::size_t)> create_decompressor_type_buffer
Definition: compression.hpp:141
std::map< const osmium::io::file_compression, callbacks_type > compression_map_type
Definition: compression.hpp:149
file_compression
Definition: file_compression.hpp:42
std::function< osmium::io::Compressor *(int, fsync)> create_compressor_type
Definition: compression.hpp:139
Definition: compression.hpp:215
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, int fd) const
Definition: compression.hpp:201
Definition: compression.hpp:63
int m_fd
Definition: compression.hpp:217
compression_map_type m_callbacks
Definition: compression.hpp:151
std::function< osmium::io::Decompressor *(int)> create_decompressor_type_fd
Definition: compression.hpp:140
Definition: compression.hpp:251
Definition: compression.hpp:135
std::unique_ptr< osmium::io::Compressor > create_compressor(osmium::io::file_compression compression, TArgs &&... args) const
Definition: compression.hpp:196
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, const char *buffer, std::size_t size) const
Definition: compression.hpp:208
bool register_compression(osmium::io::file_compression compression, create_compressor_type create_compressor, create_decompressor_type_fd create_decompressor_fd, create_decompressor_type_buffer create_decompressor_buffer)
Definition: compression.hpp:181
const char * m_buffer
Definition: compression.hpp:254
NoCompressor(int fd, fsync sync)
Definition: compression.hpp:221
~NoDecompressor() noexcept final
Definition: compression.hpp:274