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;
93 std::atomic<std::size_t> m_file_size{0};
94 std::atomic<std::size_t> m_offset{0};
99 input_buffer_size = 1024U * 1024U
112 virtual
std::
string read() = 0;
114 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";
191 const create_compressor_type& create_compressor,
192 const create_decompressor_type_fd& create_decompressor_fd,
195 compression_map_type::value_type cc{compression,
196 std::make_tuple(create_compressor,
197 create_decompressor_fd,
198 create_decompressor_buffer)};
200 return m_callbacks.insert(cc).second;
203 template <
typename... TArgs>
205 const auto callbacks = find_callbacks(compression);
206 return std::unique_ptr<osmium::io::Compressor>(std::get<0>(callbacks)(std::forward<TArgs>(args)...));
210 const auto callbacks = find_callbacks(compression);
211 auto p = std::unique_ptr<osmium::io::Decompressor>(std::get<1>(callbacks)(fd));
217 const auto callbacks = find_callbacks(compression);
218 return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(callbacks)(buffer, size));
225 std::size_t m_file_size = 0;
249 void write(
const std::string& data)
override {
250 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
251 m_file_size += data.size();
265 osmium::io::detail::reliable_fsync(fd);
267 osmium::io::detail::reliable_close(fd);
280 const char* m_buffer =
nullptr;
281 std::size_t m_buffer_size = 0;
282 std::size_t m_offset = 0;
292 m_buffer_size(size) {
313 if (m_buffer_size != 0) {
314 const std::size_t size = m_buffer_size;
316 buffer.append(m_buffer, size);
321 buffer.resize(std::string::size_type(nread));
324 m_offset += buffer.size();
325 set_offset(m_offset);
334 osmium::io::detail::reliable_close(fd);
351 inline bool get_registered_no_compression() noexcept {
352 return registered_no_compression;
361 #endif // OSMIUM_IO_COMPRESSION_HPP Definition: compression.hpp:99
NoDecompressor(const char *buffer, const std::size_t size)
Definition: compression.hpp:290
std::size_t file_size(int fd)
Definition: file.hpp:109
std::unique_ptr< osmium::io::Compressor > create_compressor(const osmium::io::file_compression compression, TArgs &&... args) const
Definition: compression.hpp:204
static CompressionFactory & instance()
Definition: compression.hpp:184
void write(const std::string &data) override
Definition: compression.hpp:249
Compressor(const fsync sync) noexcept
Definition: compression.hpp:69
Definition: location.hpp:551
std::tuple< create_compressor_type, create_decompressor_type_fd, create_decompressor_type_buffer > callbacks_type
Definition: compression.hpp:153
void close() override
Definition: compression.hpp:330
virtual std::size_t file_size() const
Definition: compression.hpp:85
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:189
virtual ~Compressor() noexcept=default
Definition: compression.hpp:91
fsync m_fsync
Definition: compression.hpp:59
void set_offset(const std::size_t offset) noexcept
Definition: compression.hpp:128
~NoDecompressor() noexcept override
Definition: compression.hpp:301
void set_file_size(const std::size_t size) noexcept
Definition: compression.hpp:120
~NoCompressor() noexcept override
Definition: compression.hpp:241
bool do_fsync() const noexcept
Definition: compression.hpp:63
void close() override
Definition: compression.hpp:254
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:216
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:161
std::size_t file_size() const override
Definition: compression.hpp:271
fsync
Definition: writer_options.hpp:51
std::size_t offset() const noexcept
Definition: compression.hpp:124
std::function< osmium::io::Decompressor *(const char *, std::size_t)> create_decompressor_type_buffer
Definition: compression.hpp:147
std::map< const osmium::io::file_compression, callbacks_type > compression_map_type
Definition: compression.hpp:155
file_compression
Definition: file_compression.hpp:42
std::function< osmium::io::Compressor *(int, fsync)> create_compressor_type
Definition: compression.hpp:145
Compressor & operator=(const Compressor &)=default
Definition: compression.hpp:223
Definition: compression.hpp:57
int m_fd
Definition: compression.hpp:226
NoDecompressor(const int fd)
Definition: compression.hpp:286
std::string read() override
Definition: compression.hpp:309
compression_map_type m_callbacks
Definition: compression.hpp:157
std::function< osmium::io::Decompressor *(int)> create_decompressor_type_fd
Definition: compression.hpp:146
Definition: compression.hpp:277
std::unique_ptr< osmium::io::Decompressor > create_decompressor(const osmium::io::file_compression compression, const int fd) const
Definition: compression.hpp:209
Definition: compression.hpp:141
NoCompressor(const int fd, const fsync sync)
Definition: compression.hpp:230