1 #ifndef OSMIUM_IO_COMPRESSION_HPP 2 #define OSMIUM_IO_COMPRESSION_HPP 36 #include <osmium/io/detail/read_write.hpp> 49 #include <system_error> 87 virtual
void write(const
std::
string& data) = 0;
89 virtual
void close() = 0;
95 std::atomic<std::size_t> m_file_size{0};
96 std::atomic<std::size_t> m_offset{0};
100 static constexpr
unsigned int input_buffer_size = 1024 * 1024;
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";
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));
248 void write(
const std::string& data)
final {
249 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
257 osmium::io::detail::reliable_fsync(fd);
259 osmium::io::detail::reliable_close(fd);
268 const char* m_buffer =
nullptr;
269 std::size_t m_buffer_size = 0;
270 std::size_t m_offset = 0;
280 m_buffer_size(size) {
301 if (m_buffer_size != 0) {
302 const std::size_t size = m_buffer_size;
304 buffer.append(m_buffer, size);
309 buffer.resize(std::string::size_type(nread));
312 m_offset += buffer.size();
313 set_offset(m_offset);
322 osmium::io::detail::reliable_close(fd);
339 inline bool get_registered_no_compression() noexcept {
340 return registered_no_compression;
349 #endif // OSMIUM_IO_COMPRESSION_HPP void set_offset(std::size_t offset) noexcept
Definition: compression.hpp:128
void close() final
Definition: compression.hpp:318
NoDecompressor(int fd)
Definition: compression.hpp:274
std::size_t file_size(int fd)
Definition: file.hpp:109
std::string read() final
Definition: compression.hpp:297
const callbacks_type & find_callbacks(osmium::io::file_compression compression) const
Definition: compression.hpp:161
static CompressionFactory & instance()
Definition: compression.hpp:184
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:100
void close() final
Definition: compression.hpp:252
Definition: location.hpp:550
void write(const std::string &data) final
Definition: compression.hpp:248
std::tuple< create_compressor_type, create_decompressor_type_fd, create_decompressor_type_buffer > callbacks_type
Definition: compression.hpp:153
Definition: compression.hpp:93
fsync m_fsync
Definition: compression.hpp:65
void set_file_size(std::size_t size) noexcept
Definition: compression.hpp:120
virtual void write(const std::string &data)=0
Compressor(fsync sync)
Definition: compression.hpp:75
NoDecompressor(const char *buffer, std::size_t size)
Definition: compression.hpp:278
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:124
~NoCompressor() noexcept final
Definition: compression.hpp:240
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
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, int fd) const
Definition: compression.hpp:209
Definition: compression.hpp:63
int m_fd
Definition: compression.hpp:225
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:265
Definition: compression.hpp:141
std::unique_ptr< osmium::io::Compressor > create_compressor(osmium::io::file_compression compression, TArgs &&... args) const
Definition: compression.hpp:204
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, const char *buffer, std::size_t size) const
Definition: compression.hpp:216
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:189
NoCompressor(int fd, fsync sync)
Definition: compression.hpp:229
~NoDecompressor() noexcept final
Definition: compression.hpp:289