00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TOOL_SI_HXX_
00023 # define TOOL_SI_HXX_
00024
00025 # include <cmath>
00026 # include <iomanip>
00027
00028 # include "si.hh"
00029
00030 namespace wpl
00031 {
00032
00033 namespace tool
00034 {
00035
00036 namespace internals
00037 {
00038
00039 template <size_t OneUnitInBits>
00040 SI_unit<OneUnitInBits>::SI_unit(uint64_t count):
00041 bits_ (count * OneUnitInBits)
00042 {
00043 }
00044
00045 template <size_t OneUnitInBits>
00046 template <size_t OneRHSUnitInBits>
00047 SI_unit<OneUnitInBits>::
00048 SI_unit(const SI_unit<OneRHSUnitInBits>& rhs): bits_ (rhs.bits())
00049 {
00050 }
00051
00052 template <size_t OneUnitInBits>
00053 uint64_t
00054 SI_unit<OneUnitInBits>::bits() const
00055 {
00056 return bits_;
00057 }
00058
00059 template <size_t OneUnitInBits>
00060 uint64_t
00061 SI_unit<OneUnitInBits>::bytes() const
00062 {
00063 return bits_ / 8;
00064 }
00065
00066 template <size_t OneUnitInBits>
00067 std::string
00068 SI_unit<OneUnitInBits>::abbrev()
00069 {
00070 return abbrev_;
00071 }
00072
00073 template <size_t OneUnitInBits>
00074 std::ostream&
00075 operator << (std::ostream& os, const SI_unit<OneUnitInBits>& unit)
00076 {
00077 const std::streamsize default_p = os.precision();
00078 const std::ios::fmtflags default_f = os.flags();
00079 const double v = unit.bits() / OneUnitInBits;
00080 const std::string u = SI_unit<OneUnitInBits>::abbrev();
00081
00082 return os << std::fixed << std::setprecision (0)
00083 << std::floor(v + 0.5) << ' ' << u
00084 << std::setprecision (default_p)
00085 << std::resetiosflags (~default_f)
00086 << std::setiosflags (default_f);
00087 }
00088
00089 }
00090
00091 }
00092
00093 }
00094
00095 #endif // ! TOOL_SI_HXX_