1 #ifndef OSMIUM_IO_COMPRESSION_HPP 2 #define OSMIUM_IO_COMPRESSION_HPP 42 #include <system_error> 52 #include <osmium/io/detail/read_write.hpp> 81 virtual void write(
const std::string& data) = 0;
83 virtual void close() = 0;
91 static constexpr
unsigned int input_buffer_size = 1024 * 1024;
104 virtual std::string read() = 0;
106 virtual void close() = 0;
128 std::tuple<create_compressor_type,
129 create_decompressor_type_fd,
143 std::string error_message {
"Support for compression '"};
145 error_message +=
"' not compiled into this binary.";
157 osmium::io::file_compression compression,
158 create_compressor_type create_compressor,
159 create_decompressor_type_fd create_decompressor_fd,
160 create_decompressor_type_buffer create_decompressor_buffer) {
162 compression_map_type::value_type cc(compression,
163 std::make_tuple(create_compressor,
164 create_decompressor_fd,
165 create_decompressor_buffer));
167 return m_callbacks.insert(cc).second;
170 template <
typename... TArgs>
171 std::unique_ptr<osmium::io::Compressor>
create_compressor(osmium::io::file_compression compression, TArgs&&... args) {
172 auto it = m_callbacks.find(compression);
174 if (it != m_callbacks.end()) {
175 return std::unique_ptr<osmium::io::Compressor>(std::get<0>(it->second)(std::forward<TArgs>(args)...));
181 std::unique_ptr<osmium::io::Decompressor>
create_decompressor(osmium::io::file_compression compression,
int fd) {
182 auto it = m_callbacks.find(compression);
184 if (it != m_callbacks.end()) {
185 return std::unique_ptr<osmium::io::Decompressor>(std::get<1>(it->second)(fd));
191 std::unique_ptr<osmium::io::Decompressor>
create_decompressor(osmium::io::file_compression compression,
const char* buffer,
size_t size) {
192 auto it = m_callbacks.find(compression);
194 if (it != m_callbacks.end()) {
195 return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(it->second)(buffer, size));
222 void write(
const std::string& data)
final {
223 osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
231 osmium::io::detail::reliable_fsync(fd);
233 osmium::io::detail::reliable_close(fd);
258 m_buffer_size(size) {
273 if (m_buffer_size != 0) {
274 size_t size = m_buffer_size;
276 buffer.append(m_buffer, size);
282 throw std::system_error(errno, std::system_category(),
"Read failed");
284 buffer.resize(std::string::size_type(nread));
294 osmium::io::detail::reliable_close(fd);
311 inline bool get_registered_no_compression() noexcept {
312 return registered_no_compression;
321 #endif // OSMIUM_IO_COMPRESSION_HPP OSMIUM_NORETURN void error(osmium::io::file_compression compression)
Definition: compression.hpp:142
void close() final
Definition: compression.hpp:290
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
NoDecompressor(int fd)
Definition: compression.hpp:247
std::string read() final
Definition: compression.hpp:269
static CompressionFactory & instance()
Definition: compression.hpp:151
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:91
void close() final
Definition: compression.hpp:226
void write(const std::string &data) final
Definition: compression.hpp:222
~NoCompressor() noexceptfinal
Definition: compression.hpp:214
Definition: compression.hpp:87
fsync m_fsync
Definition: compression.hpp:64
virtual void write(const std::string &data)=0
Compressor(fsync sync)
Definition: compression.hpp:74
int m_fd
Definition: compression.hpp:241
const char * as_string(file_compression compression)
Definition: file_compression.hpp:51
size_t m_buffer_size
Definition: compression.hpp:243
Namespace for everything in the Osmium library.
Definition: assembler.hpp:59
~NoDecompressor() noexceptfinal
Definition: compression.hpp:261
std::unique_ptr< osmium::io::Decompressor > create_decompressor(osmium::io::file_compression compression, int fd)
Definition: compression.hpp:181
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:191
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:130
std::function< osmium::io::Decompressor *(int)> create_decompressor_type_fd
Definition: compression.hpp:122
bool do_fsync() const
Definition: compression.hpp:68
file_compression
Definition: file_compression.hpp:42
std::unique_ptr< osmium::io::Compressor > create_compressor(osmium::io::file_compression compression, TArgs &&...args)
Definition: compression.hpp:171
std::function< osmium::io::Decompressor *(const char *, size_t)> create_decompressor_type_buffer
Definition: compression.hpp:123
virtual ~Decompressor() noexcept
Definition: compression.hpp:101
Definition: compression.hpp:203
Definition: compression.hpp:62
int m_fd
Definition: compression.hpp:205
compression_map_type m_callbacks
Definition: compression.hpp:132
virtual ~Compressor() noexcept
Definition: compression.hpp:78
Definition: compression.hpp:239
Definition: compression.hpp:117
NoDecompressor(const char *buffer, size_t size)
Definition: compression.hpp:254
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:156
std::function< osmium::io::Compressor *(int, fsync)> create_compressor_type
Definition: compression.hpp:121
const char * m_buffer
Definition: compression.hpp:242
NoCompressor(int fd, fsync sync)
Definition: compression.hpp:209