The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
chrono.hpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2024 - 2025
3 Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY.
11
12 See the COPYING file for more details.
13*/
14
15#pragma once
16
18#include "utils/general.hpp"
19
20#include <algorithm>
21#include <chrono>
22#include <iomanip>
23#include <sstream>
24#include <string_view>
25
26#if __cpp_lib_chrono >= 201907L
27#define CPP20_CHRONO_SUPPORT
28#endif
29
30namespace chrono
31{
32#ifdef CPP20_CHRONO_SUPPORT
33
34using std::chrono::days;
35using std::chrono::weeks;
36using std::chrono::months;
37using std::chrono::years;
38
39#else
40
41using days = std::chrono::duration<int, std::ratio<86400>>;
42using weeks = std::chrono::duration<int, std::ratio<604800>>;
43using months = std::chrono::duration<int, std::ratio<2629746>>;
44using years = std::chrono::duration<int, std::ratio<31556952>>;
45
46#endif
47
48inline auto parse_timestamp(long long val)
49{
50 return std::chrono::system_clock::from_time_t(val);
51}
52
54{
55 return std::chrono::system_clock::from_time_t(val.to_long_long());
56}
57
58inline auto serialize_timestamp(const std::chrono::system_clock::time_point& time)
59{
60 return std::chrono::system_clock::to_time_t(time);
61}
62
63inline auto get_local_timestamp(const std::chrono::system_clock::time_point& time)
64{
65 auto as_time_t = std::chrono::system_clock::to_time_t(time);
66 std::tm local_tm{};
67 return mktime(utils::localtime_r(&as_time_t, &local_tm));
68}
69
70// CAUTION: This does NOT return a language-localized string. To achieve that,
71// use translation::translate_timestamp with chrono::get_local_timestamp.
72inline auto format_local_timestamp(const std::chrono::system_clock::time_point& time, std::string_view format = "%F %T")
73{
74 std::ostringstream ss;
75 auto as_time_t = std::chrono::system_clock::to_time_t(time);
76 std::tm local_tm{};
77 ss << std::put_time(utils::localtime_r(&as_time_t, &local_tm), format.data());
78 return ss.str();
79}
80
81template<typename Duration>
82inline auto parse_duration(const config_attribute_value& val, const Duration& def = Duration{0})
83{
84 return Duration{val.to_long_long(def.count())};
85}
86
87template<typename RepE, typename PeriodE, typename RepD, typename PeriodD>
88constexpr double normalize_progress(
89 const std::chrono::duration<RepE, PeriodE>& elapsed,
90 const std::chrono::duration<RepD, PeriodD>& duration)
91{
92 return std::clamp(std::chrono::duration<double, PeriodE>{elapsed} / duration, 0.0, 1.0);
93}
94
95template<typename... Ts, typename Rep, typename Period>
96constexpr auto deconstruct_duration(const std::chrono::duration<Rep, Period>& span)
97{
98 auto time_remaining = std::chrono::duration_cast<std::common_type_t<Ts...>>(span);
99 return std::tuple{[&time_remaining]() {
100 auto duration = std::chrono::duration_cast<Ts>(time_remaining);
101 time_remaining -= duration;
102 return duration;
103 }()...};
104}
105
106} // namespace chrono
Variant for storing WML attributes.
long long to_long_long(long long def=0) const
Definitions for the interface to Wesnoth Markup Language (WML).
std::chrono::duration< int, std::ratio< 2629746 > > months
Definition chrono.hpp:43
auto serialize_timestamp(const std::chrono::system_clock::time_point &time)
Definition chrono.hpp:58
auto parse_timestamp(long long val)
Definition chrono.hpp:48
auto parse_duration(const config_attribute_value &val, const Duration &def=Duration{0})
Definition chrono.hpp:82
auto format_local_timestamp(const std::chrono::system_clock::time_point &time, std::string_view format="%F %T")
Definition chrono.hpp:72
std::chrono::duration< int, std::ratio< 31556952 > > years
Definition chrono.hpp:44
std::chrono::duration< int, std::ratio< 604800 > > weeks
Definition chrono.hpp:42
auto get_local_timestamp(const std::chrono::system_clock::time_point &time)
Definition chrono.hpp:63
constexpr auto deconstruct_duration(const std::chrono::duration< Rep, Period > &span)
Definition chrono.hpp:96
std::chrono::duration< int, std::ratio< 86400 > > days
Definition chrono.hpp:41
constexpr double normalize_progress(const std::chrono::duration< RepE, PeriodE > &elapsed, const std::chrono::duration< RepD, PeriodD > &duration)
Definition chrono.hpp:88
std::tm * localtime_r(const std::time_t *time, std::tm *result)
Definition general.hpp:175