36 #include <boost/multiprecision/cpp_bin_float.hpp> 38 using boost::multiprecision::cpp_int;
40 const cpp_int FSize::KB = 1024;
41 const cpp_int FSize::MB = FSize::KB * 1024;
42 const cpp_int FSize::GB = FSize::MB * 1024;
43 const cpp_int FSize::TB = FSize::GB * 1024;
44 const cpp_int FSize::PB = FSize::TB * 1024;
45 const cpp_int FSize::EB = FSize::PB * 1024;
46 const cpp_int FSize::ZB = FSize::EB * 1024;
47 const cpp_int FSize::YB = FSize::ZB * 1024;
51 : _size( cpp_int(sizeStr) * factor( unit_r ) )
64 if ( _size > 0 && cpp_int(blocksize_r) > 0) {
65 cpp_int diff = _size % cpp_int(blocksize_r);
68 _size += cpp_int(blocksize_r);
84 cpp_int usize = abs(_size);
111 std::string
FSize::form(
const Unit unit_r,
unsigned fw,
unsigned prec,
const bool showunit )
const 116 case Unit::Y: prec = 3;
break;
117 case Unit::Z: prec = 3;
break;
118 case Unit::E: prec = 3;
break;
119 case Unit::P: prec = 3;
break;
120 case Unit::T: prec = 3;
break;
121 case Unit::G: prec = 2;
break;
122 case Unit::M: prec = 1;
break;
123 case Unit::K: prec = 1;
break;
124 case Unit::B: prec = 0;
break;
126 }
else if ( unit_r == Unit::B )
129 std::ostringstream str;
131 str << std::setprecision(prec) << std::setfill(
' ') << std::setw(fw) << std::fixed;
136 str << (_size + (
factor( unit_r ) / 2))/
factor( unit_r );
139 str << (boost::multiprecision::cpp_bin_float_50)( _size ) /
140 (boost::multiprecision::cpp_bin_float_50)(
factor( unit_r ) );
143 str <<
" " <<
unit( unit_r );
161 std::ostream& operator<<(std::ostream &ostr,
const FSize &fsize)
static const char * unit(const Unit unit_r)
String representation of Unit.
std::string asString() const
Default string representation (precision 1 and unit appended).
FSize(const boost::multiprecision::cpp_int &size_r=0, const Unit unit_r=Unit::B)
Construct from size in certain unit.
Store and operate on (file/package/partition) sizes.
static boost::multiprecision::cpp_int factor(const Unit unit_r)
Return ammount of bytes in Unit.
static const unsigned bestPrec
Used as precision argument to form(), the 'best' precision according to Unist is chosen.
FSize & fillBlock(FSize blocksize_r=boost::multiprecision::cpp_int(KB))
Adjust size to multiple of blocksize_r
std::string form(const Unit unit_r, unsigned fw=0, unsigned prec=bestPrec, const bool showunit=true) const
Return string representation in given Unit.
Unit bestUnit() const
Return the best unit for string representation.