1 #ifndef OSMIUM_IO_COMPRESSION_HPP
2 #define OSMIUM_IO_COMPRESSION_HPP
43 #include <system_error>
53 #include <osmium/io/detail/read_write.hpp>
83 virtual void write(
const std::string& data) = 0;
85 virtual void close() = 0;
109 virtual std::string
read() = 0;
111 virtual void close() = 0;
165 const auto it = m_callbacks.find(compression);
167 if (it != m_callbacks.end()) {
171 std::string error_message{
"Support for compression '"};
173 error_message +=
"' not compiled into this binary";
187 create_decompressor_type_fd create_decompressor_fd,
190 compression_map_type::value_type cc(compression,
191 std::make_tuple(create_compressor,
192 create_decompressor_fd,
193 create_decompressor_buffer));
195 return m_callbacks.insert(cc).second;
198 template <
typename... TArgs>
201 return std::unique_ptr<osmium::io::Compressor>(std::get<0>(callbacks)(std::forward<TArgs>(args)...));
206 auto p = std::unique_ptr<osmium::io::Decompressor>(std::get<1>(callbacks)(fd));
213 return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(callbacks)(buffer, size));
237 void write(
const std::string& data)
final {
238 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
246 osmium::io::detail::reliable_fsync(fd);
248 osmium::io::detail::reliable_close(fd);
274 m_buffer_size(size) {
289 if (m_buffer_size != 0) {
292 buffer.append(m_buffer, size);
298 throw std::system_error(errno, std::system_category(),
"Read failed");
300 buffer.resize(std::string::size_type(nread));
303 m_offset += buffer.size();
313 osmium::io::detail::reliable_close(fd);
330 inline bool get_registered_no_compression() noexcept {
331 return registered_no_compression;
340 #endif // OSMIUM_IO_COMPRESSION_HPP
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, int fd) const
Definition: compression.hpp:204
std::unique_ptr< osmium::io::Compressor > create_compressor(osmium::io::file_compression compression, TArgs &&...args) const
Definition: compression.hpp:199
void close() final
Definition: compression.hpp:309
NoDecompressor(int fd)
Definition: compression.hpp:263
virtual std::string read()=0
Decompressor & operator=(const Decompressor &)=delete
size_t file_size(int fd)
Definition: file.hpp:67
std::string read() final
Definition: compression.hpp:285
static CompressionFactory & instance()
Definition: compression.hpp:179
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:96
void close() final
Definition: compression.hpp:241
void write(const std::string &data) final
Definition: compression.hpp:237
std::tuple< create_compressor_type, create_decompressor_type_fd, create_decompressor_type_buffer > callbacks_type
Definition: compression.hpp:150
~NoCompressor() noexceptfinal
Definition: compression.hpp:229
Definition: compression.hpp:89
fsync m_fsync
Definition: compression.hpp:66
CompressionFactory()=default
virtual void write(const std::string &data)=0
Compressor(fsync sync)
Definition: compression.hpp:76
int m_fd
Definition: compression.hpp:256
const char * as_string(file_compression compression)
Definition: file_compression.hpp:51
size_t m_buffer_size
Definition: compression.hpp:258
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, const char *buffer, size_t size) const
Definition: compression.hpp:211
~NoDecompressor() noexceptfinal
Definition: compression.hpp:277
size_t offset() const noexcept
Definition: compression.hpp:121
fsync
Definition: writer_options.hpp:51
const callbacks_type & find_callbacks(osmium::io::file_compression compression) const
Definition: compression.hpp:164
size_t file_size() const noexcept
Definition: compression.hpp:113
void set_file_size(size_t size) noexcept
Definition: compression.hpp:117
size_t m_offset
Definition: compression.hpp:259
bool do_fsync() const
Definition: compression.hpp:70
std::map< const osmium::io::file_compression, callbacks_type > compression_map_type
Definition: compression.hpp:152
file_compression
Definition: file_compression.hpp:42
std::function< osmium::io::Compressor *(int, fsync)> create_compressor_type
Definition: compression.hpp:142
std::atomic< size_t > m_file_size
Definition: compression.hpp:91
virtual ~Decompressor() noexcept
Definition: compression.hpp:106
Definition: compression.hpp:218
Definition: compression.hpp:64
int m_fd
Definition: compression.hpp:220
compression_map_type m_callbacks
Definition: compression.hpp:154
CompressionFactory & operator=(const CompressionFactory &)=delete
std::function< osmium::io::Decompressor *(int)> create_decompressor_type_fd
Definition: compression.hpp:143
std::function< osmium::io::Decompressor *(const char *, size_t)> create_decompressor_type_buffer
Definition: compression.hpp:144
virtual ~Compressor() noexcept
Definition: compression.hpp:80
Definition: compression.hpp:254
Definition: compression.hpp:138
NoDecompressor(const char *buffer, size_t size)
Definition: compression.hpp:270
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:184
const char * m_buffer
Definition: compression.hpp:257
NoCompressor(int fd, fsync sync)
Definition: compression.hpp:224
std::atomic< size_t > m_offset
Definition: compression.hpp:92
void set_offset(size_t offset) noexcept
Definition: compression.hpp:125