The Battle for Wesnoth  1.19.27+dev
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 
30 namespace chrono
31 {
32 #ifdef CPP20_CHRONO_SUPPORT
33 
34 using std::chrono::days;
35 using std::chrono::weeks;
37 using std::chrono::years;
38 
39 #else
40 
41 using days = std::chrono::duration<int, std::ratio<86400>>;
42 using weeks = std::chrono::duration<int, std::ratio<604800>>;
43 using months = std::chrono::duration<int, std::ratio<2629746>>;
44 using years = std::chrono::duration<int, std::ratio<31556952>>;
45 
46 #endif
47 
48 inline auto parse_timestamp(long long val)
49 {
50  return std::chrono::system_clock::from_time_t(val);
51 }
52 
53 inline auto parse_timestamp(const config_attribute_value& val)
54 {
55  return std::chrono::system_clock::from_time_t(val.to_long_long());
56 }
57 
58 inline auto serialize_timestamp(const std::chrono::system_clock::time_point& time)
59 {
60  return std::chrono::system_clock::to_time_t(time);
61 }
62 
63 inline 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.
72 inline 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 
81 template<typename Duration>
82 inline 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 
87 template<typename RepE, typename PeriodE, typename RepD, typename PeriodD>
88 constexpr 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 
95 template<typename... Ts, typename Rep, typename Period>
96 constexpr 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