Commit 7899929c authored by neverlord's avatar neverlord

util::duration

parent 2337b22a
#ifndef DURATION_HPP
#define DURATION_HPP
#include <chrono>
#include <cstdint>
namespace cppa { namespace util {
enum class time_unit : std::uint32_t
{
none = 0,
seconds = 1,
milliseconds = 1000,
microseconds = 1000000
};
template<typename Period>
constexpr time_unit get_time_unit_from_period()
{
return (Period::num != 1
? time_unit::none
: (Period::den == 1
? time_unit::seconds
: (Period::den == 1000
? time_unit::milliseconds
: (Period::den == 1000000
? time_unit::microseconds
: time_unit::none))));
}
class duration
{
public:
duration();
public:
constexpr duration() : unit(time_unit::none), count(0)
{
}
constexpr duration(time_unit un, std::uint32_t val) : unit(un), count(val)
{
}
template <class Rep, class Period>
constexpr duration(std::chrono::duration<Rep, Period> d)
: unit(get_time_unit_from_period<Period>()), count(d.count())
{
static_assert(get_time_unit_from_period<Period>() != time_unit::none,
"only seconds, milliseconds or microseconds allowed");
}
time_unit unit;
std::uint32_t count;
};
bool operator==(const duration& lhs, const duration& rhs);
inline bool operator!=(const duration& lhs, const duration& rhs)
{
return !(lhs == rhs);
}
} } // namespace cppa::util
#endif // DURATION_HPP
#include "cppa/util/duration.hpp"
duration::duration()
namespace {
inline std::uint64_t ui64_val(const cppa::util::duration& d)
{
return static_cast<std::uint64_t>(d.unit) * d.count;
}
} // namespace <anonmyous>
namespace cppa { namespace util {
bool operator==(const duration& lhs, const duration& rhs)
{
return (lhs.unit == rhs.unit ? lhs.count == rhs.count
: ui64_val(lhs) == ui64_val(rhs));
}
} } // namespace cppa::util
......@@ -94,7 +94,8 @@ size_t test__uniform_type()
"@msg", // cppa::message
"@actor", // cppa::actor_ptr
"@group", // cppa::group_ptr
"@channel" // cppa::channel_ptr
"@channel", // cppa::channel_ptr
"cppa::util::duration"
};
if (sizeof(double) != sizeof(long double))
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment