[base, thin_ls] factor out disk_units code
This commit is contained in:
72
base/disk_units.cc
Normal file
72
base/disk_units.cc
Normal file
@@ -0,0 +1,72 @@
|
||||
#include "base/disk_units.h"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
unsigned long long
|
||||
base::disk_unit_multiplier(disk_unit u)
|
||||
{
|
||||
switch (u) {
|
||||
case UNIT_BYTE:
|
||||
return 1;
|
||||
|
||||
case UNIT_SECTOR:
|
||||
return 512;
|
||||
|
||||
case UNIT_kB:
|
||||
return 1000;
|
||||
|
||||
case UNIT_MB:
|
||||
return 1000000;
|
||||
|
||||
case UNIT_GB:
|
||||
return 1000000000ull;
|
||||
|
||||
case UNIT_TB:
|
||||
return 1000000000000ull;
|
||||
|
||||
case UNIT_PB:
|
||||
return 1000000000000000ull;
|
||||
|
||||
case UNIT_KiB:
|
||||
return 1024ull;
|
||||
|
||||
case UNIT_MiB:
|
||||
return 1024ull * 1024ull;
|
||||
|
||||
case UNIT_GiB:
|
||||
return 1024ull * 1024ull * 1024ull;
|
||||
|
||||
case UNIT_TiB:
|
||||
return 1024ull * 1024ull * 1024ull * 1024ull;
|
||||
|
||||
case UNIT_PiB:
|
||||
return 1024ull * 1024ull * 1024ull * 1024ull * 1024ull;
|
||||
}
|
||||
|
||||
throw runtime_error("unknown unit type");
|
||||
return 1;
|
||||
}
|
||||
|
||||
string
|
||||
base::format_disk_unit(unsigned long long numerator, disk_unit u)
|
||||
{
|
||||
numerator *= disk_unit_multiplier(u);
|
||||
unsigned i;
|
||||
for (i = 0; numerator >= 1024; i++)
|
||||
numerator /= 1024;
|
||||
|
||||
char const *extensions[] = {
|
||||
"", "KiB", "MiB", "GiB", "TiB", "PiB"
|
||||
};
|
||||
|
||||
// FIXME: check subscript of i
|
||||
return lexical_cast<string>(numerator) + " " + extensions[i];
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
Reference in New Issue
Block a user