1 #ifndef OSMIUM_IO_FILE_HPP 2 #define OSMIUM_IO_FILE_HPP 57 inline std::vector<std::string> split(
const std::string& in,
const char delim) {
58 std::vector<std::string> result;
59 std::stringstream ss(in);
61 while (std::getline(ss, item, delim)) {
62 result.push_back(item);
89 bool m_has_multiple_object_versions {
false};
105 explicit File(
const std::string& filename =
"",
const std::string& format =
"") :
107 m_filename(filename),
110 m_format_string(format) {
113 if (m_filename ==
"-") {
118 std::string protocol = m_filename.substr(0, m_filename.find_first_of(
':'));
119 if (protocol ==
"http" || protocol ==
"https") {
123 if (format.empty()) {
124 detect_format_from_suffix(m_filename);
126 parse_format(format);
139 explicit File(
const char* buffer,
size_t size,
const std::string& format =
"") :
144 m_format_string(format) {
146 parse_format(format);
151 File& operator=(
const File&) =
default;
163 return m_buffer_size;
167 std::vector<std::string> options = detail::split(format,
',');
171 if (!options.empty() && options[0].find_first_of(
'=') == std::string::npos) {
172 detect_format_from_suffix(options[0]);
173 options.erase(options.begin());
176 for (
auto& option : options) {
177 size_t pos = option.find_first_of(
'=');
178 if (pos == std::string::npos) {
181 std::string value = option.substr(pos+1);
187 if (
get(
"history") ==
"true") {
188 m_has_multiple_object_versions =
true;
189 }
else if (
get(
"history") ==
"false") {
190 m_has_multiple_object_versions =
false;
195 std::vector<std::string> suffixes = detail::split(name,
'.');
197 if (suffixes.empty())
return;
201 if (suffixes.back() ==
"gz") {
204 }
else if (suffixes.back() ==
"bz2") {
209 if (suffixes.empty())
return;
213 if (suffixes.back() ==
"pbf") {
216 }
else if (suffixes.back() ==
"xml") {
219 }
else if (suffixes.back() ==
"opl") {
222 }
else if (suffixes.back() ==
"json") {
225 }
else if (suffixes.back() ==
"o5m") {
228 }
else if (suffixes.back() ==
"o5c") {
230 m_has_multiple_object_versions =
true;
231 set(
"o5c_change_format",
true);
233 }
else if (suffixes.back() ==
"debug") {
238 if (suffixes.empty())
return;
240 if (suffixes.back() ==
"osm") {
243 }
else if (suffixes.back() ==
"osh") {
245 m_has_multiple_object_versions =
true;
247 }
else if (suffixes.back() ==
"osc") {
249 m_has_multiple_object_versions =
true;
250 set(
"xml_change_format",
true);
263 std::string msg =
"Could not detect file format";
264 if (!m_format_string.empty()) {
265 msg +=
" from format string '";
266 msg += m_format_string;
269 if (m_filename.empty()) {
270 msg +=
" for stdin/stdout";
272 msg +=
" for filename '";
283 return m_file_format;
287 m_file_format = format;
292 return m_file_compression;
296 m_file_compression = compression;
301 return m_has_multiple_object_versions;
305 m_has_multiple_object_versions = value;
310 if (filename ==
"-") {
313 m_filename = filename;
328 #endif // OSMIUM_IO_FILE_HPP File & set_has_multiple_object_versions(bool value) noexcept
Definition: file.hpp:304
void parse_format(const std::string &format)
Definition: file.hpp:166
File(const char *buffer, size_t size, const std::string &format="")
Definition: file.hpp:139
bool has_multiple_object_versions() const noexcept
Definition: file.hpp:300
File(const std::string &filename="", const std::string &format="")
Definition: file.hpp:105
void detect_format_from_suffix(const std::string &name)
Definition: file.hpp:194
size_t buffer_size() const noexcept
Definition: file.hpp:162
Definition: options.hpp:57
const File & check() const
Definition: file.hpp:261
Namespace for everything in the Osmium library.
Definition: assembler.hpp:66
File & set_compression(file_compression compression) noexcept
Definition: file.hpp:295
std::string m_format_string
Definition: file.hpp:83
file_format format() const noexcept
Definition: file.hpp:282
file_compression
Definition: file_compression.hpp:42
File & set_format(file_format format) noexcept
Definition: file.hpp:286
file_format
Definition: file_format.hpp:42
const char * buffer() const noexcept
Definition: file.hpp:158
std::string m_filename
Definition: file.hpp:78
file_compression compression() const noexcept
Definition: file.hpp:291
size_t m_buffer_size
Definition: file.hpp:81
File & filename(const std::string &filename)
Definition: file.hpp:309
const std::string & filename() const noexcept
Definition: file.hpp:318
const char * m_buffer
Definition: file.hpp:80