#ifndef AIRMAP_DATE_TIME_H_ #define AIRMAP_DATE_TIME_H_ #include #include namespace airmap { class DateTime; template class Duration; namespace detail { class Duration; } // namespace detail namespace tag { struct Hours {}; struct Minutes {}; struct Seconds {}; struct Milliseconds {}; struct Microseconds {}; } // namespace tag using Hours = Duration; using Minutes = Duration; using Seconds = Duration; using Milliseconds = Duration; using Microseconds = Duration; /// Clock marks the reference for time measurements. class Clock { public: static DateTime universal_time(); static DateTime local_time(); }; namespace boost_iso { DateTime datetime(const std::string &iso_time); std::string to_iso_string(const DateTime &); } // namespace boost_iso /// DateTime marks a specific point in time, in reference to Clock. class DateTime { public: DateTime(); ~DateTime(); DateTime(DateTime const &); DateTime(DateTime &&); DateTime &operator=(const DateTime &); DateTime &operator=(DateTime &&); DateTime operator+(const detail::Duration &) const; Microseconds operator-(const DateTime &) const; bool operator==(const DateTime &) const; bool operator!=(const DateTime &) const; friend std::istream &operator>>(std::istream &, DateTime &); friend std::ostream &operator<<(std::ostream &, const DateTime &); DateTime date() const; Microseconds time_of_day() const; private: struct Impl; std::unique_ptr impl; explicit DateTime(std::unique_ptr &&); friend DateTime Clock::universal_time(); friend DateTime Clock::local_time(); friend DateTime boost_iso::datetime(const std::string &iso_time); friend std::string boost_iso::to_iso_string(const DateTime &datetime); }; Hours hours(int64_t raw); Minutes minutes(int64_t raw); Seconds seconds(int64_t raw); Milliseconds milliseconds(int64_t raw); Microseconds microseconds(int64_t raw); namespace detail { class Duration { public: Duration(); ~Duration(); Duration(Duration const &old); Duration &operator=(const Duration &); uint64_t total_seconds() const; uint64_t total_milliseconds() const; uint64_t total_microseconds() const; uint64_t hours() const; private: struct Impl; std::unique_ptr impl; friend DateTime DateTime::operator+(const detail::Duration &) const; friend Microseconds DateTime::operator-(const DateTime &) const; friend Microseconds DateTime::time_of_day() const; friend Hours airmap::hours(int64_t raw); friend Minutes airmap::minutes(int64_t raw); friend Seconds airmap::seconds(int64_t raw); friend Milliseconds airmap::milliseconds(int64_t raw); friend Microseconds airmap::microseconds(int64_t raw); }; } // namespace detail template class Duration : public detail::Duration {}; /// milliseconds_since_epoch returns the milliseconds that elapsed since the UNIX epoch. uint64_t milliseconds_since_epoch(const DateTime &dt); /// microseconds_since_epoch returns the microseconds that elapsed since the UNIX epoch. uint64_t microseconds_since_epoch(const DateTime &dt); /// from_seconds_since_epoch returns a DateTime. DateTime from_seconds_since_epoch(const Seconds &s); /// from_milliseconds_since_epoch returns a DateTime. DateTime from_milliseconds_since_epoch(const Milliseconds &ms); /// from_microseconds_since_epoch returns a DateTime. DateTime from_microseconds_since_epoch(const Microseconds &us); // moves the datetime forward to the specified hour DateTime move_to_hour(const DateTime &dt, uint64_t hour); namespace iso8601 { /// parse parses a DateTime instance from the string s in iso8601 format. DateTime parse(const std::string &s); /// generate returns a string in iso8601 corresponding to 'dt'. std::string generate(const DateTime &dt); } // namespace iso8601 } // namespace airmap #endif // AIRMAP_DATE_TIME_H_