vector support for file reading

This commit is contained in:
matthias@arch 2022-09-29 17:05:11 +02:00
parent ed39f1262c
commit 81351fff01
3 changed files with 29 additions and 6 deletions

View File

@ -28,8 +28,20 @@ namespace gz {
return success;
}
std::unordered_map<std::string, std::string> readKeyValueFile(const std::string& filepath, bool removeSpaces) {
std::unordered_map<std::string, std::string> attr;
using pairSS = std::pair<std::string, std::string>;
using umapSS = std::unordered_map<std::string, std::string>;
using mapSS = std::map<std::string, std::string>;
using vecSS = std::vector<pairSS>;
inline void insert(vecSS& t, pairSS&& p) { t.emplace_back(p); }
inline void insert(umapSS& t, pairSS&& p) { t.emplace(p); }
inline void insert(mapSS& t, pairSS&& p) { t.emplace(p); }
template<ReadKeyValueFileImplemented T>
T readKeyValueFile(const std::string& filepath, bool removeSpaces) {
T attr;
std::string line;
int eqPos;
std::ifstream file(filepath);
@ -50,7 +62,7 @@ namespace gz {
line.erase(std::remove_if(line.begin(), line.begin() + eqPos + 2, [](unsigned char x) { return std::isspace(x); }), line.begin() + eqPos + 2);
}
eqPos = line.find("=");
attr[line.substr(0, eqPos)] = line.substr(eqPos+1, line.length());
insert(attr, std::pair{ line.substr(0, eqPos), line.substr(eqPos+1, line.length()) });
}
}
file.close();
@ -61,6 +73,10 @@ namespace gz {
return attr;
}
template umapSS readKeyValueFile<umapSS>(const std::string&, bool);
template mapSS readKeyValueFile<mapSS>(const std::string&, bool);
template vecSS readKeyValueFile<vecSS>(const std::string&, bool);
template bool writeKeyValueFile<std::hash<std::string>, std::equal_to<std::string>>(const std::string&, const std::unordered_map<std::string, std::string, std::hash<std::string>, std::equal_to<std::string>>&);
template bool writeKeyValueFile<util::string_hash, std::equal_to<>>(const std::string&, const std::unordered_map<std::string, std::string, util::string_hash, std::equal_to<>>&);
}

View File

@ -16,12 +16,19 @@ namespace gz {
template<typename Hash, typename Pred>
bool writeKeyValueFile(const std::string& filepath, const std::unordered_map<std::string, std::string, Hash, Pred>& content);
template<typename T>
concept ReadKeyValueFileImplemented =
std::same_as<T, std::vector<std::pair<std::string, std::string>>> ||
std::same_as<T, std::map<std::string, std::string>> ||
std::same_as<T, std::unordered_map<std::string, std::string>> ;
/**
* @brief Read a file that contains key = value pairs
* @throws FileIOError
* @see @ref fio_t_key_value "Key-Value filetype"
*/
std::unordered_map<std::string, std::string> readKeyValueFile(const std::string& filepath, bool removeSpaces=false);
template<ReadKeyValueFileImplemented T>
T readKeyValueFile(const std::string& filepath, bool removeSpaces=false);
}
/**
@ -33,7 +40,7 @@ namespace gz {
* @section fio_filetypes Filetypes
* @subsection fio_t_key_value Simple Key-Value file
* A file that contains key - value pairs in each line, separated with "=".
* Any number of whitespaces around the separator is allowed.
* Whitespaces around the separator are allowed.
* If the first character of a line is "#", the whole line is a comment.
* Example:
* @code

View File

@ -654,7 +654,7 @@ namespace gz {
if (filepath.empty()) {
throw InvalidArgument("filename is not set", "readFromFile");
}
std::unordered_map<std::string, std::string> map = readKeyValueFile(filepath);
std::unordered_map<std::string, std::string> map = readKeyValueFile<std::unordered_map<std::string, std::string>>(filepath);
settings.insert(map.begin(), map.end());
if (checkValidity) {
// insert only valid values