19 if (size_str.empty()) {
20 return std::numeric_limits<size_t>::max();
24 std::string str = size_str;
27 char suffix =
static_cast<char>(
std::tolower(
static_cast<unsigned char>(str.back())));
28 size_t multiplier = 1;
34 }
else if (suffix ==
'm') {
35 multiplier = 1024ULL * 1024ULL;
37 }
else if (suffix ==
'g') {
38 multiplier = 1024ULL * 1024ULL * 1024ULL;
40 }
else if (
std::isdigit(
static_cast<unsigned char>(suffix)) == 0) {
42 throw_or_abort(
"Invalid storage size format: '" + size_str +
"'. Use format like '500m', '2g', or '1024k'");
47 throw_or_abort(
"Invalid storage size format: '" + size_str +
"'. No numeric value provided");
51 return value * multiplier;
52 }
catch (
const std::invalid_argument&) {
53 throw_or_abort(
"Invalid storage size format: '" + size_str +
"'. Not a valid number");
54 }
catch (
const std::out_of_range&) {
55 throw_or_abort(
"Invalid storage size format: '" + size_str +
"'. Value out of range");