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;
91 std::atomic<size_t> m_file_size {0};
92 std::atomic<size_t> m_offset {0};
96 static constexpr
unsigned int input_buffer_size = 1024 * 1024;
109 virtual std::string read() = 0;
111 virtual void close() = 0;
164 std::string error_message {
"Support for compression '"};
166 error_message +=
"' not compiled into this binary.";
178 osmium::io::file_compression compression,
179 create_compressor_type create_compressor,
180 create_decompressor_type_fd create_decompressor_fd,
183 compression_map_type::value_type cc(compression,
184 std::make_tuple(create_compressor,
185 create_decompressor_fd,
186 create_decompressor_buffer));
188 return m_callbacks.insert(cc).second;
191 template <
typename... TArgs>
192 std::unique_ptr<osmium::io::Compressor>
create_compressor(osmium::io::file_compression compression, TArgs&&... args) {
193 auto it = m_callbacks.find(compression);
195 if (it != m_callbacks.end()) {
196 return std::unique_ptr<osmium::io::Compressor>(std::get<0>(it->second)(std::forward<TArgs>(args)...));
202 std::unique_ptr<osmium::io::Decompressor>
create_decompressor(osmium::io::file_compression compression,
int fd) {
203 auto it = m_callbacks.find(compression);
205 if (it != m_callbacks.end()) {
206 auto p = std::unique_ptr<osmium::io::Decompressor>(std::get<1>(it->second)(fd));
214 std::unique_ptr<osmium::io::Decompressor>
create_decompressor(osmium::io::file_compression compression,
const char* buffer,
size_t size) {
215 auto it = m_callbacks.find(compression);
217 if (it != m_callbacks.end()) {
218 return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(it->second)(buffer, size));
245 void write(
const std::string& data)
final {
246 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
254 osmium::io::detail::reliable_fsync(fd);
256 osmium::io::detail::reliable_close(fd);
282 m_buffer_size(size) {
297 if (m_buffer_size != 0) {
298 size_t size = m_buffer_size;
300 buffer.append(m_buffer, size);
306 throw std::system_error(errno, std::system_category(),
"Read failed");
308 buffer.resize(std::string::size_type(nread));
311 m_offset += buffer.size();
312 set_offset(m_offset);
321 osmium::io::detail::reliable_close(fd);
338 inline bool get_registered_no_compression() noexcept {
339 return registered_no_compression;
348 #endif // OSMIUM_IO_COMPRESSION_HPP OSMIUM_NORETURN void error(osmium::io::file_compression compression)
Definition: compression.hpp:163
std::map< const osmium::io::file_compression, std::tuple< create_compressor_type, create_decompressor_type_fd, create_decompressor_type_buffer >> compression_map_type
Definition: compression.hpp:151
void close() final
Definition: compression.hpp:317
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
NoDecompressor(int fd)
Definition: compression.hpp:271
size_t file_size(int fd)
Definition: file.hpp:67
std::string read() final
Definition: compression.hpp:293
static CompressionFactory & instance()
Definition: compression.hpp:172
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:96
void close() final
Definition: compression.hpp:249
void write(const std::string &data) final
Definition: compression.hpp:245
Definition: compression.hpp:89
fsync m_fsync
Definition: compression.hpp:66
virtual void write(const std::string &data)=0
Compressor(fsync sync)
Definition: compression.hpp:76
int m_fd
Definition: compression.hpp:264
const char * as_string(file_compression compression)
Definition: file_compression.hpp:51
size_t m_buffer_size
Definition: compression.hpp:266
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, int fd)
Definition: compression.hpp:202
size_t offset() const noexcept
Definition: compression.hpp:121
fsync
Definition: writer_options.hpp:51
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, const char *buffer, size_t size)
Definition: compression.hpp:214
bool do_fsync() const
Definition: compression.hpp:70
size_t file_size() const noexcept
Definition: compression.hpp:113
~NoCompressor() noexcept final
Definition: compression.hpp:237
void set_file_size(size_t size) noexcept
Definition: compression.hpp:117
file_compression
Definition: file_compression.hpp:42
std::function< osmium::io::Compressor *(int, fsync)> create_compressor_type
Definition: compression.hpp:142
virtual ~Decompressor() noexcept
Definition: compression.hpp:106
Definition: compression.hpp:226
Definition: compression.hpp:64
int m_fd
Definition: compression.hpp:228
compression_map_type m_callbacks
Definition: compression.hpp:153
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:262
Definition: compression.hpp:138
NoDecompressor(const char *buffer, size_t size)
Definition: compression.hpp:278
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:177
const char * m_buffer
Definition: compression.hpp:265
NoCompressor(int fd, fsync sync)
Definition: compression.hpp:232
~NoDecompressor() noexcept final
Definition: compression.hpp:285
void set_offset(size_t offset) noexcept
Definition: compression.hpp:125
std::unique_ptr< osmium::io::Compressor > create_compressor(osmium::io::file_compression compression, TArgs &&... args)
Definition: compression.hpp:192