diff --git a/src/common/data-rate.cc b/src/common/data-rate.cc index fe61c0b6c..1bcb5498c 100644 --- a/src/common/data-rate.cc +++ b/src/common/data-rate.cc @@ -21,8 +21,111 @@ #include "data-rate.h" #include "ns3/nstime.h" +#include "ns3/fatal-error.h" -namespace ns3{ +namespace { + +bool +DoParse (const std::string s, uint64_t *v) +{ + std::string::size_type n = s.find_first_not_of("0123456789."); + if (n != std::string::npos) + { // Found non-numeric + double r = ::atof(s.substr(0, n).c_str()); + std::string trailer = s.substr(n, std::string::npos); + if (trailer == "bps") + { + // Bit/s + *v = (uint64_t)r; + } + else if (trailer == "b/s") + { + // Bit/s + *v = (uint64_t)r; + } + else if (trailer == "Bps") + { + // Byte/s + *v = (uint64_t)(r * 8); + } + else if (trailer == "B/s") + { + // Byte/s + *v = (uint64_t)(r * 8); + } + else if (trailer == "kbps") + { + // KiloBit/s + *v = (uint64_t)(r * 1000); + } + else if (trailer == "kb/s") + { + // KiloBit/s + *v = (uint64_t)(r * 1000); + } + else if (trailer == "kBps") + { + // KiloBit/s + *v = (uint64_t)(r * 1000); + } + else if (trailer == "kB/s") + { + // KiloBit/s + *v = (uint64_t)(r * 1000); + } + else if (trailer == "Mbps") + { + // MegaBit/s + *v = (uint64_t)(r * 1000000); + } + else if (trailer == "Mb/s") + { + // MegaBit/s + *v = (uint64_t)(r * 1000000); + } + else if (trailer == "MBps") + { + // MegaByte/s + *v = (uint64_t)(r * 8000000); + } + else if (trailer == "MB/s") + { + // MegaByte/s + *v = (uint64_t)(r * 8000000); + } + else if (trailer == "Gbps") + { + // GigaBit/s + *v = (uint64_t)(r * 1000000000); + } + else if (trailer == "Gb/s") + { + // GigaBit/s + *v = (uint64_t)(r * 1000000000); + } + else if (trailer == "GBps") + { + // GigaByte/s + *v = (uint64_t)(r * 8*1000000000); + } + else if (trailer == "GB/s") + { + // GigaByte/s + *v = (uint64_t)(r * 8*1000000000); + } + else + { + return false; + } + return true; + } + *v = ::atoll(s.c_str()); + return true; +} + +} + +namespace ns3 { DataRate::DataRate(uint64_t bps) :m_bps(bps) @@ -36,46 +139,12 @@ DataRate::DataRate (const std::string s) uint64_t DataRate::Parse(const std::string s) { - std::string::size_type n = s.find_first_not_of("0123456789."); - if (n != std::string::npos) - { // Found non-numeric - double r = atof(s.substr(0, n).c_str()); - std::string trailer = s.substr(n, std::string::npos); - if (trailer == std::string("bps")) - return (uint64_t)r; // Bit/s - if (trailer == std::string("b/s")) - return (uint64_t)r; // Bit/s - if (trailer == std::string("Bps")) - return (uint64_t)(r * 8); // Byte/s - if (trailer == std::string("B/s")) - return (uint64_t)(r * 8); // Byte/s - if (trailer == std::string("kbps")) - return (uint64_t)(r * 1000); // KiloBit/s - if (trailer == std::string("kb/s")) - return (uint64_t)(r * 1000); // KiloBit/s - if (trailer == std::string("kBps")) - return (uint64_t)(r * 1000); // KiloBit/s - if (trailer == std::string("kB/s")) - return (uint64_t)(r * 1000); // KiloBit/s - if (trailer == std::string("Mbps")) - return (uint64_t)(r * 1000000); // MegaBit/s - if (trailer == std::string("Mb/s")) - return (uint64_t)(r * 1000000); // MegaBit/s - if (trailer == std::string("MBps")) - return (uint64_t)(r * 8000000); // MegaByte/s - if (trailer == std::string("MB/s")) - return (uint64_t)(r * 8000000); // MegaByte/s - if (trailer == std::string("Gbps")) - return (uint64_t)(r * 1000000000); // GigaBit/s - if (trailer == std::string("Gb/s")) - return (uint64_t)(r * 1000000000); // GigaBit/s - if (trailer == std::string("GBps")) - return (uint64_t)(r * 8*1000000000); // GigaByte/s - if (trailer == std::string("GB/s")) - return (uint64_t)(r * 8*1000000000); // GigaByte/s - NS_FATAL_ERROR("Can't Parse data rate "< #include #include #include "ns3/nstime.h" +#include "ns3/default-value.h" -namespace ns3{ +namespace ns3 { /** * \brief Class for representing data rates @@ -97,6 +97,22 @@ class DataRate double operator*(const DataRate& lhs, const TimeUnit<1>& rhs); double operator*(const TimeUnit<1>& lhs, const DataRate& rhs); +class DataRateDefaultValue : public DefaultValueBase +{ +public: + DataRateDefaultValue (std::string name, + std::string help, + DataRate defaultValue); + void SetValue (DataRate rate); + DataRate GetValue (); +private: + virtual bool DoParseValue (const std::string &value); + virtual std::string DoGetType (void) const; + virtual std::string DoGetDefaultValue (void) const; + DataRate m_defaultValue; + DataRate m_value; +}; + };//namespace ns3 #endif /* DATA_RATE_H */