Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
SUMOTime.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
21// Variables, methods, and tools for internal time representation
22/****************************************************************************/
23#include <config.h>
24
25#include <sstream>
26#include <iostream>
27#include <iomanip>
28#include "SUMOTime.h"
29#include "StringTokenizer.h"
30#include "StringUtils.h"
31#include "StdDefs.h"
32#include "MsgHandler.h"
33
34
35// ===========================================================================
36// type definitions
37// ===========================================================================
39
40
41// ===========================================================================
42// method definitions
43// ===========================================================================
44
46string2time(const std::string& r) {
47 if (r.find(":") == std::string::npos) {
48 const double time = StringUtils::toDouble(r);
49 if (time > STEPS2TIME(SUMOTime_MAX)) {
50 throw TimeFormatException("Input string '" + r + "' exceeds the time value range.");
51 }
52 return TIME2STEPS(time);
53 } else {
54 // try to parse jj:hh:mm:ss.s
55 std::vector<std::string> hrt = StringTokenizer(r, ":").getVector();
56 if (hrt.size() == 3) {
57 //std::cout << "parsed '" << r << "' as " << (3600 * string2time(hrt[0]) + 60 * string2time(hrt[1]) + string2time(hrt[2])) << "\n";
58 return 3600 * string2time(hrt[0]) + 60 * string2time(hrt[1]) + string2time(hrt[2]);
59 } else if (hrt.size() == 4) {
60 //std::cout << "parsed '" << r << "' as " << (24 * 3600 * string2time(hrt[0]) + 3600 * string2time(hrt[1]) + 60 * string2time(hrt[2]) + string2time(hrt[3])) << "\n";
61 return 24 * 3600 * string2time(hrt[0]) + 3600 * string2time(hrt[1]) + 60 * string2time(hrt[2]) + string2time(hrt[3]);
62 }
63 throw TimeFormatException("Input string '" + r + "' is not a valid time format (jj:HH:MM:SS.S).");
64 }
65}
66
67
68std::string
69time2string(SUMOTime t, bool humanReadable) {
70 std::ostringstream oss;
71 if (t < 0) {
72 oss << "-";
73 }
74 // needed for signed zero errors, see #5926
75 // llabs(SUMOTime_MIN) would create overflow and must be handleed separately
76 t = t == SUMOTime_MIN ? SUMOTime_MAX : (SUMOTime)llabs(t);
77 SUMOTime scale = (SUMOTime)pow(10, MAX2(0, 3 - gPrecision));
78 if (scale > 1) {
79 if (t != SUMOTime_MAX) {
80 t = (t + scale / 2) / scale;
81 } else {
82 scale = 1;
83 }
84 }
85 const SUMOTime second = TIME2STEPS(1) / scale;
86 if (humanReadable) {
87 const SUMOTime minute = 60 * second;
88 const SUMOTime hour = 60 * minute;
89 const SUMOTime day = 24 * hour;
90 // 123456 -> "00:00:12.34"
91 if (t > day) {
92 oss << t / day << ":";
93 t %= day;
94 }
95 oss << std::setfill('0') << std::setw(2);
96 oss << t / hour << ":";
97 t %= hour;
98 oss << std::setw(2) << t / minute << ":";
99 t %= minute;
100 oss << std::setw(2) << t / second;
101 t %= second;
102 if (t != 0 || TS < 1.) {
103 oss << ".";
104 oss << std::setw(MIN2(3, gPrecision));
105 oss << t;
106 }
107 } else {
108 oss << t / second << ".";
109 oss << std::setfill('0') << std::setw(MIN2(3, gPrecision));
110 oss << t % second;
111 }
112 return oss.str();
113}
114
115
116std::string
120
121
122std::string
123elapsedMs2string(long long int t) {
124 if (gHumanReadableTime) {
125 if (STEPS2TIME(t) > 60) {
126 // round to seconds
127 return time2string((t / 1000) * 1000);
128 } else {
129 return toString((double)t / 1000.0) + "s";
130 }
131 } else {
132 return time2string(t) + "s";
133 }
134}
135
136bool checkStepLengthMultiple(const SUMOTime t, const std::string& error, SUMOTime deltaT, SUMOTime begin) {
137 if (begin % deltaT == 0) {
138 if (t % deltaT != 0) {
139 WRITE_WARNING("The given time value " + time2string(t) + " is not a multiple of the step length " + time2string(deltaT) + error + ".")
140 }
141 } else {
142 if ((t - begin) % deltaT != 0) {
143 WRITE_WARNING("The given time value " + time2string(t) + " is not reached with step length " + time2string(deltaT)
144 + " and begin time " + time2string(begin) + error + ".")
145 }
146 }
147 // next line used to fix build
148 return false;
149}
150
151void checkTimeBounds(const double time) {
152 if (time > STEPS2TIME(SUMOTime_MAX)) {
153 throw TimeFormatException("Input time " + toString(time) + "s exceeds the time value range.");
154 }
155}
156
157
158/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNING(msg)
Definition MsgHandler.h:295
void checkTimeBounds(const double time)
check the valid SUMOTime range of double input and throw an error if out of bounds
Definition SUMOTime.cpp:151
std::string elapsedMs2string(long long int t)
convert ms to string for log output
Definition SUMOTime.cpp:123
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
bool checkStepLengthMultiple(const SUMOTime t, const std::string &error, SUMOTime deltaT, SUMOTime begin)
check if given SUMOTime is multiple of the step length
Definition SUMOTime.cpp:136
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:69
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SUMOTime_MIN
Definition SUMOTime.h:35
#define TS
Definition SUMOTime.h:42
#define TIME2STEPS(x)
Definition SUMOTime.h:57
int gPrecision
the precision for floating point outputs
Definition StdDefs.cpp:26
bool gHumanReadableTime
Definition StdDefs.cpp:29
T MIN2(T a, T b)
Definition StdDefs.h:76
T MAX2(T a, T b)
Definition StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
std::vector< std::string > getVector()
return vector of strings
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter