Use std::optional to return results

This commit is contained in:
Chocobo1 2021-02-09 12:55:22 +08:00 committed by sledgehammer999
parent 2c5271b3b2
commit b20a3c5b8e
No known key found for this signature in database
GPG key ID: 6E4A2D025B7CC9A2
2 changed files with 21 additions and 15 deletions

View file

@ -28,6 +28,8 @@
#include "misc.h"
#include <optional>
#ifdef Q_OS_WIN
#include <windows.h>
#include <powrprof.h>
@ -80,21 +82,26 @@ namespace
// see http://en.wikipedia.org/wiki/Kilobyte
// value must be given in bytes
// to send numbers instead of strings with suffixes
bool splitToFriendlyUnit(const qint64 sizeInBytes, qreal &val, Utils::Misc::SizeUnit &unit)
struct SplitToFriendlyUnitResult
{
if (sizeInBytes < 0) return false;
qreal value;
Utils::Misc::SizeUnit unit;
};
std::optional<SplitToFriendlyUnitResult> splitToFriendlyUnit(const qint64 bytes)
{
if (bytes < 0)
return std::nullopt;
int i = 0;
val = static_cast<qreal>(sizeInBytes);
auto value = static_cast<qreal>(bytes);
while ((val >= 1024.) && (i < static_cast<int>(Utils::Misc::SizeUnit::ExbiByte)))
while ((value >= 1024) && (i < static_cast<int>(Utils::Misc::SizeUnit::ExbiByte)))
{
val /= 1024.;
value /= 1024;
++i;
}
unit = static_cast<Utils::Misc::SizeUnit>(i);
return true;
return {{value, static_cast<Utils::Misc::SizeUnit>(i)}};
}
}
@ -249,15 +256,14 @@ QString Utils::Misc::unitString(const SizeUnit unit, const bool isSpeed)
return ret;
}
QString Utils::Misc::friendlyUnit(const qint64 bytesValue, const bool isSpeed)
QString Utils::Misc::friendlyUnit(const qint64 bytes, const bool isSpeed)
{
SizeUnit unit;
qreal friendlyVal;
if (!splitToFriendlyUnit(bytesValue, friendlyVal, unit))
const std::optional<SplitToFriendlyUnitResult> result = splitToFriendlyUnit(bytes);
if (!result)
return QCoreApplication::translate("misc", "Unknown", "Unknown (size)");
return Utils::String::fromDouble(friendlyVal, friendlyUnitPrecision(unit))
return Utils::String::fromDouble(result->value, friendlyUnitPrecision(result->unit))
+ QString::fromUtf8(C_NON_BREAKING_SPACE)
+ unitString(unit, isSpeed);
+ unitString(result->unit, isSpeed);
}
int Utils::Misc::friendlyUnitPrecision(const SizeUnit unit)

View file

@ -73,7 +73,7 @@ namespace Utils::Misc
// return the best user friendly storage unit (B, KiB, MiB, GiB, TiB)
// value must be given in bytes
QString friendlyUnit(qint64 bytesValue, bool isSpeed = false);
QString friendlyUnit(qint64 bytes, bool isSpeed = false);
int friendlyUnitPrecision(SizeUnit unit);
qint64 sizeInBytes(qreal size, SizeUnit unit);