1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-24 09:39:51 +00:00

Use std::from_chars to parse settings integral numbers and handle errors

This commit is contained in:
elsid 2022-10-03 23:30:16 +02:00
parent 5875fbcc4c
commit 2388b21f63
No known key found for this signature in database
GPG Key ID: 4DE04C198CBA7625

View File

@ -1,14 +1,44 @@
#include "settings.hpp"
#include "parser.hpp"
#include <cerrno>
#include <charconv>
#include <filesystem>
#include <sstream>
#include <system_error>
#include <components/files/configurationmanager.hpp>
#include <components/misc/strings/algorithm.hpp>
namespace Settings
{
namespace
{
template <class T>
auto parseIntegralNumber(const std::string& value, std::string_view setting, std::string_view category)
{
T number{};
const auto result = std::from_chars(value.data(), value.data() + value.size(), number);
if (result.ec != std::errc())
throw std::system_error(std::make_error_code(result.ec),
"Failed to parse number from setting [" + std::string(category) + "] " + std::string(setting)
+ " value \"" + value + "\"");
return number;
}
template <class T>
auto parseFloatingPointNumber(const std::string& value, std::string_view setting, std::string_view category)
{
std::stringstream stream(value);
T number{};
stream >> number;
if (stream.bad())
throw std::system_error(errno, std::generic_category(),
"Failed to parse number from setting [" + std::string(category) + "] " + std::string(setting)
+ " value \"" + value + "\"");
return number;
}
}
CategorySettingValueMap Manager::mDefaultSettings = CategorySettingValueMap();
CategorySettingValueMap Manager::mUserSettings = CategorySettingValueMap();
@ -109,38 +139,22 @@ namespace Settings
float Manager::getFloat(std::string_view setting, std::string_view category)
{
const std::string& value = getString(setting, category);
std::stringstream stream(value);
float number = 0.f;
stream >> number;
return number;
return parseFloatingPointNumber<float>(getString(setting, category), setting, category);
}
double Manager::getDouble(std::string_view setting, std::string_view category)
{
const std::string& value = getString(setting, category);
std::stringstream stream(value);
double number = 0.0;
stream >> number;
return number;
return parseFloatingPointNumber<double>(getString(setting, category), setting, category);
}
int Manager::getInt(std::string_view setting, std::string_view category)
{
const std::string& value = getString(setting, category);
std::stringstream stream(value);
int number = 0;
stream >> number;
return number;
return parseIntegralNumber<int>(getString(setting, category), setting, category);
}
std::int64_t Manager::getInt64(std::string_view setting, std::string_view category)
{
const std::string& value = getString(setting, category);
std::stringstream stream(value);
std::int64_t number = 0;
stream >> number;
return number;
return parseIntegralNumber<std::int64_t>(getString(setting, category), setting, category);
}
bool Manager::getBool(std::string_view setting, std::string_view category)