mirror of
https://github.com/parchlinux/calamares.git
synced 2025-06-27 09:25:36 -04:00
Introduce new partition size class based on NamedSuffix
In order to maintain consistency, and make use, create a new PartSize class in the PartUtils namespace, which inherits from NamedSuffix for easier parsing and handling of size strings. The switch to using this class instead of the previous functions will be done in a follow-up commit. Signed-off-by: Arnaud Ferraris <arnaud.ferraris@collabora.com>
This commit is contained in:
parent
680b0bc472
commit
3a58ae5e8b
2 changed files with 275 additions and 2 deletions
|
@ -43,6 +43,216 @@
|
|||
namespace PartUtils
|
||||
{
|
||||
|
||||
static const NamedEnumTable<SizeUnit>&
|
||||
unitSuffixes()
|
||||
{
|
||||
static const NamedEnumTable<SizeUnit> names{
|
||||
{ QStringLiteral( "%" ), SizeUnit::Percent },
|
||||
{ QStringLiteral( "B" ), SizeUnit::Byte },
|
||||
{ QStringLiteral( "K" ), SizeUnit::KiB },
|
||||
{ QStringLiteral( "M" ), SizeUnit::MiB },
|
||||
{ QStringLiteral( "G" ), SizeUnit::GiB }
|
||||
};
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
PartSize::PartSize( const QString& s )
|
||||
: NamedSuffix( unitSuffixes(), s )
|
||||
{
|
||||
if ( ( unit() == SizeUnit::Percent ) && ( value() > 100 || value() < 0 ) )
|
||||
{
|
||||
cDebug() << "Percent value" << value() << "is not valid.";
|
||||
m_value = 0;
|
||||
}
|
||||
|
||||
if ( m_unit == SizeUnit::None )
|
||||
{
|
||||
m_value = s.toInt();
|
||||
if ( m_value > 0 )
|
||||
m_unit = SizeUnit::Byte;
|
||||
}
|
||||
|
||||
if ( m_value <= 0 )
|
||||
{
|
||||
m_value = 0;
|
||||
m_unit = SizeUnit::None;
|
||||
}
|
||||
}
|
||||
|
||||
qint64
|
||||
PartSize::toSectors( qint64 totalSectors, qint64 sectorSize ) const
|
||||
{
|
||||
if ( !isValid() )
|
||||
return -1;
|
||||
if ( totalSectors < 1 || sectorSize < 1 )
|
||||
return -1;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case unit_t::None:
|
||||
return -1;
|
||||
case unit_t::Percent:
|
||||
if ( value() == 100 )
|
||||
return totalSectors; // Common-case, avoid futzing around
|
||||
else
|
||||
return totalSectors * value() / 100;
|
||||
case unit_t::Byte:
|
||||
case unit_t::KiB:
|
||||
case unit_t::MiB:
|
||||
case unit_t::GiB:
|
||||
return bytesToSectors ( toBytes(), sectorSize );
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
qint64
|
||||
PartSize::toBytes( qint64 totalSectors, qint64 sectorSize ) const
|
||||
{
|
||||
if ( !isValid() )
|
||||
return -1;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case unit_t::None:
|
||||
return -1;
|
||||
case unit_t::Percent:
|
||||
if ( totalSectors < 1 || sectorSize < 1 )
|
||||
return -1;
|
||||
if ( value() == 100 )
|
||||
return totalSectors * sectorSize; // Common-case, avoid futzing around
|
||||
else
|
||||
return totalSectors * value() / 100;
|
||||
case unit_t::Byte:
|
||||
case unit_t::KiB:
|
||||
case unit_t::MiB:
|
||||
case unit_t::GiB:
|
||||
return toBytes();
|
||||
}
|
||||
|
||||
// notreached
|
||||
return -1;
|
||||
}
|
||||
|
||||
qint64
|
||||
PartSize::toBytes( qint64 totalBytes ) const
|
||||
{
|
||||
if ( !isValid() )
|
||||
return -1;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case unit_t::None:
|
||||
return -1;
|
||||
case unit_t::Percent:
|
||||
if ( totalBytes < 1 )
|
||||
return -1;
|
||||
if ( value() == 100 )
|
||||
return totalBytes; // Common-case, avoid futzing around
|
||||
else
|
||||
return totalBytes * value() / 100;
|
||||
case unit_t::Byte:
|
||||
case unit_t::KiB:
|
||||
case unit_t::MiB:
|
||||
case unit_t::GiB:
|
||||
return toBytes();
|
||||
}
|
||||
|
||||
// notreached
|
||||
return -1;
|
||||
}
|
||||
|
||||
qint64
|
||||
PartSize::toBytes() const
|
||||
{
|
||||
if ( !isValid() )
|
||||
return -1;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case unit_t::Byte:
|
||||
return value();
|
||||
case unit_t::KiB:
|
||||
return CalamaresUtils::KiBtoBytes( static_cast<unsigned long long>( value() ) );
|
||||
case unit_t::MiB:
|
||||
return CalamaresUtils::MiBtoBytes( static_cast<unsigned long long>( value() ) );
|
||||
case unit_t::GiB:
|
||||
return CalamaresUtils::GiBtoBytes( static_cast<unsigned long long>( value() ) );
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Reached only when unit is Percent or None
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool
|
||||
PartSize::operator< ( const PartSize& other ) const
|
||||
{
|
||||
if ( ( m_unit == SizeUnit::None || other.m_unit == SizeUnit::None ) ||
|
||||
( m_unit == SizeUnit::Percent && other.m_unit != SizeUnit::Percent ) ||
|
||||
( m_unit != SizeUnit::Percent && other.m_unit == SizeUnit::Percent ) )
|
||||
return false;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case SizeUnit::Percent:
|
||||
return ( m_value < other.m_value );
|
||||
case SizeUnit::Byte:
|
||||
case SizeUnit::KiB:
|
||||
case SizeUnit::MiB:
|
||||
case SizeUnit::GiB:
|
||||
return ( toBytes() < other.toBytes () );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
PartSize::operator> ( const PartSize& other ) const
|
||||
{
|
||||
if ( ( m_unit == SizeUnit::None || other.m_unit == SizeUnit::None ) ||
|
||||
( m_unit == SizeUnit::Percent && other.m_unit != SizeUnit::Percent ) ||
|
||||
( m_unit != SizeUnit::Percent && other.m_unit == SizeUnit::Percent ) )
|
||||
return false;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case SizeUnit::Percent:
|
||||
return ( m_value > other.m_value );
|
||||
case SizeUnit::Byte:
|
||||
case SizeUnit::KiB:
|
||||
case SizeUnit::MiB:
|
||||
case SizeUnit::GiB:
|
||||
return ( toBytes() > other.toBytes () );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
PartSize::operator== ( const PartSize& other ) const
|
||||
{
|
||||
if ( ( m_unit == SizeUnit::None || other.m_unit == SizeUnit::None ) ||
|
||||
( m_unit == SizeUnit::Percent && other.m_unit != SizeUnit::Percent ) ||
|
||||
( m_unit != SizeUnit::Percent && other.m_unit == SizeUnit::Percent ) )
|
||||
return false;
|
||||
|
||||
switch ( m_unit )
|
||||
{
|
||||
case SizeUnit::Percent:
|
||||
return ( m_value == other.m_value );
|
||||
case SizeUnit::Byte:
|
||||
case SizeUnit::KiB:
|
||||
case SizeUnit::MiB:
|
||||
case SizeUnit::GiB:
|
||||
return ( toBytes() == other.toBytes () );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString
|
||||
convenienceName( const Partition* const candidate )
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue