libcarla/include/carla/Time.h
2024-10-18 13:19:59 +08:00

68 lines
1.9 KiB
C++

// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include "carla/Debug.h"
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <chrono>
namespace carla {
/// Positive time duration up to milliseconds resolution. Automatically casts
/// between std::chrono::duration and boost::posix_time::time_duration.
class time_duration {
public:
static inline time_duration seconds(size_t timeout) {
return std::chrono::seconds(timeout);
}
static inline time_duration milliseconds(size_t timeout) {
return std::chrono::milliseconds(timeout);
}
constexpr time_duration() noexcept : _milliseconds(0u) {}
template <typename Rep, typename Period>
time_duration(std::chrono::duration<Rep, Period> duration)
: _milliseconds([=]() {
const auto count = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
DEBUG_ASSERT(count >= 0);
return static_cast<size_t>(count);
}()) {}
time_duration(boost::posix_time::time_duration timeout)
: time_duration(std::chrono::milliseconds(timeout.total_milliseconds())) {}
time_duration(const time_duration &) = default;
time_duration &operator=(const time_duration &) = default;
boost::posix_time::time_duration to_posix_time() const {
return boost::posix_time::milliseconds(_milliseconds);
}
constexpr auto to_chrono() const {
return std::chrono::milliseconds(_milliseconds);
}
operator boost::posix_time::time_duration() const {
return to_posix_time();
}
constexpr size_t milliseconds() const noexcept {
return _milliseconds;
}
private:
size_t _milliseconds;
};
} // namespace carla