LCOV - code coverage report
Current view: top level - src/utils/common - SUMOTime.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 56 58 96.6 %
Date: 2024-05-02 15:31:40 Functions: 5 5 100.0 %

          Line data    Source code
       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             : /****************************************************************************/
      14             : /// @file    SUMOTime.cpp
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Jakob Erdmann
      17             : /// @author  Michael Behrisch
      18             : /// @author  Mirko Barthauer
      19             : /// @date    Fri, 29.04.2005
      20             : ///
      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             : // ===========================================================================
      38             : SUMOTime DELTA_T = 1000;
      39             : 
      40             : 
      41             : // ===========================================================================
      42             : // method definitions
      43             : // ===========================================================================
      44             : 
      45             : SUMOTime
      46    12577188 : string2time(const std::string& r) {
      47    12577188 :     if (r.find(":") == std::string::npos) {
      48    12576472 :         const double time = StringUtils::toDouble(r);
      49    12576223 :         if (time > STEPS2TIME(SUMOTime_MAX)) {
      50          12 :             throw TimeFormatException("Input string '" + r + "' exceeds the time value range.");
      51             :         }
      52    14244455 :         return TIME2STEPS(time);
      53             :     } else {
      54             :         // try to parse jj:hh:mm:ss.s
      55        2148 :         std::vector<std::string> hrt = StringTokenizer(r, ":").getVector();
      56         716 :         if (hrt.size() == 3) {
      57             :             //std::cout << "parsed '" << r << "' as " << (3600 * string2time(hrt[0]) + 60 * string2time(hrt[1]) + string2time(hrt[2])) << "\n";
      58         268 :             return 3600 * string2time(hrt[0]) + 60 * string2time(hrt[1]) + string2time(hrt[2]);
      59         448 :         } 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         448 :             return 24 * 3600 * string2time(hrt[0]) + 3600 * string2time(hrt[1]) + 60 * string2time(hrt[2]) + string2time(hrt[3]);
      62             :         }
      63           0 :         throw TimeFormatException("Input string '" + r + "' is not a valid time format (jj:HH:MM:SS.S).");
      64         716 :     }
      65             : }
      66             : 
      67             : 
      68             : std::string
      69    11875550 : time2string(SUMOTime t, bool humanReadable) {
      70    11875550 :     std::ostringstream oss;
      71    11875550 :     if (t < 0) {
      72        2037 :         oss << "-";
      73             :     }
      74             :     // needed for signed zero errors, see #5926
      75    11875550 :     t = llabs(t);
      76    11875550 :     const SUMOTime scale = (SUMOTime)pow(10, MAX2(0, 3 - gPrecision));
      77    11875550 :     if (scale > 1 && t != SUMOTime_MAX) {
      78    11864543 :         t = (t + scale / 2) / scale;
      79             :     }
      80    11875550 :     const SUMOTime second = TIME2STEPS(1) / scale;
      81    11875550 :     if (humanReadable) {
      82         721 :         const SUMOTime minute = 60 * second;
      83         721 :         const SUMOTime hour = 60 * minute;
      84         721 :         const SUMOTime day = 24 * hour;
      85             :         // 123456 -> "00:00:12.34"
      86         721 :         if (t > day) {
      87          50 :             oss << t / day << ":";
      88          50 :             t %= day;
      89             :         }
      90             :         oss << std::setfill('0') << std::setw(2);
      91         721 :         oss << t / hour << ":";
      92         721 :         t %= hour;
      93         721 :         oss << std::setw(2) << t / minute << ":";
      94         721 :         t %= minute;
      95         721 :         oss << std::setw(2) << t / second;
      96         721 :         t %= second;
      97         721 :         if (t != 0 || TS < 1.) {
      98          20 :             oss << ".";
      99          20 :             oss << std::setw(MIN2(3, gPrecision));
     100             :             oss << t;
     101             :         }
     102             :     } else {
     103    11874829 :         oss << t / second << ".";
     104    11874829 :         oss << std::setfill('0') << std::setw(MIN2(3, gPrecision));
     105    11874829 :         oss << t % second;
     106             :     }
     107    11875550 :     return oss.str();
     108    11875550 : }
     109             : 
     110             : 
     111             : std::string
     112    11875550 : time2string(SUMOTime t) {
     113    11875550 :     return time2string(t, gHumanReadableTime);
     114             : }
     115             : 
     116             : 
     117             : std::string
     118       27355 : elapsedMs2string(long long int t) {
     119       27355 :     if (gHumanReadableTime) {
     120          58 :         if (STEPS2TIME(t) > 60) {
     121             :             // round to seconds
     122           0 :             return time2string((t / 1000) * 1000);
     123             :         } else {
     124         116 :             return toString((double)t / 1000.0) + "s";
     125             :         }
     126             :     } else {
     127       54594 :         return time2string(t) + "s";
     128             :     }
     129             : }
     130             : 
     131       55101 : bool checkStepLengthMultiple(const SUMOTime t, const std::string& error, SUMOTime deltaT, SUMOTime begin) {
     132       55101 :     if (begin % deltaT == 0) {
     133       55089 :         if (t % deltaT != 0) {
     134         588 :             WRITE_WARNING("The given time value " + time2string(t) + " is not a multiple of the step length " + time2string(deltaT) + error + ".")
     135             :         }
     136             :     } else {
     137          12 :         if ((t - begin) % deltaT != 0) {
     138          12 :             WRITE_WARNING("The given time value " + time2string(t) + " is not reached with step length " + time2string(deltaT)
     139             :                           + " and begin time " + time2string(begin) + error + ".")
     140             :         }
     141             :     }
     142             :     // next line used to fix build
     143       55101 :     return false;
     144             : }
     145             : 
     146             : 
     147             : /****************************************************************************/

Generated by: LCOV version 1.14