[base, thin_ls] factor out disk_units code

This commit is contained in:
Joe Thornber 2016-01-19 11:40:00 +00:00
parent 47bd31da8d
commit 7ce4e451ff
4 changed files with 113 additions and 80 deletions

View File

@ -27,6 +27,7 @@ all: $(PROGRAMS)
SOURCE=\ SOURCE=\
base/application.cc \ base/application.cc \
base/base64.cc \ base/base64.cc \
base/disk_units.cc \
base/endian_utils.cc \ base/endian_utils.cc \
base/error_state.cc \ base/error_state.cc \
base/error_string.cc \ base/error_string.cc \

72
base/disk_units.cc Normal file
View 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];
}
//----------------------------------------------------------------

34
base/disk_units.h Normal file
View File

@ -0,0 +1,34 @@
#ifndef BASE_DISK_UNITS_H
#define BASE_DISK_UNITS_H
#include <string>
//----------------------------------------------------------------
namespace base {
enum disk_unit {
UNIT_BYTE,
UNIT_SECTOR,
// decimal multipliers
UNIT_kB,
UNIT_MB,
UNIT_GB,
UNIT_TB,
UNIT_PB,
// binary multipliers
UNIT_KiB,
UNIT_MiB,
UNIT_GiB,
UNIT_TiB,
UNIT_PiB
};
unsigned long long disk_unit_multiplier(disk_unit u);
std::string format_disk_unit(unsigned long long numerator, disk_unit u);
}
//----------------------------------------------------------------
#endif

View File

@ -21,16 +21,18 @@
#include <getopt.h> #include <getopt.h>
#include <libgen.h> #include <libgen.h>
#include "human_readable_format.h" #include "base/disk_units.h"
#include "metadata_dumper.h" #include "thin-provisioning/human_readable_format.h"
#include "metadata.h" #include "thin-provisioning/metadata_dumper.h"
#include "xml_format.h" #include "thin-provisioning/metadata.h"
#include "thin-provisioning/xml_format.h"
#include "version.h" #include "version.h"
#include "thin-provisioning/commands.h" #include "thin-provisioning/commands.h"
#include "persistent-data/file_utils.h" #include "persistent-data/file_utils.h"
#include "boost/optional.hpp" #include "boost/optional.hpp"
#include "boost/lexical_cast.hpp" #include "boost/lexical_cast.hpp"
using namespace base;
using namespace boost; using namespace boost;
using namespace persistent_data; using namespace persistent_data;
using namespace std; using namespace std;
@ -41,82 +43,6 @@ using namespace thin_provisioning;
namespace { namespace {
enum disk_unit {
UNIT_BYTE,
UNIT_SECTOR,
// decimal multipliers
UNIT_kB,
UNIT_MB,
UNIT_GB,
UNIT_TB,
UNIT_PB,
// binary mulitpliers
UNIT_KiB,
UNIT_MiB,
UNIT_GiB,
UNIT_TiB,
UNIT_PiB
};
unsigned long long 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 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];
}
//------------------------------------------------ //------------------------------------------------
// FIXME: move to own file // FIXME: move to own file