File: elastix.h

package info (click to toggle)
elastix 5.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 42,480 kB
  • sloc: cpp: 68,403; lisp: 4,118; python: 1,013; xml: 182; sh: 177; makefile: 33
file content (116 lines) | stat: -rw-r--r-- 3,400 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*=========================================================================
 *
 *  Copyright UMC Utrecht and contributors
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/
#ifndef elastix_h
#define elastix_h

#include <cassert>
#include <ctime>
#include <cmath>   // For fmod.
#include <iomanip> // std::setprecision
#include <sstream>
#include <string>


/** ConvertSecondsToDHMS
 *
 */
inline std::string
ConvertSecondsToDHMS(const double totalSeconds, const unsigned int precision = 0)
{
  /** Define days, hours, minutes. */
  const std::size_t secondsPerMinute = 60;
  const std::size_t secondsPerHour = 60 * secondsPerMinute;
  const std::size_t secondsPerDay = 24 * secondsPerHour;

  /** Convert total seconds. */
  std::size_t       iSeconds = static_cast<std::size_t>(totalSeconds);
  const std::size_t days = iSeconds / secondsPerDay;

  iSeconds %= secondsPerDay;
  const std::size_t hours = iSeconds / secondsPerHour;

  iSeconds %= secondsPerHour;
  const std::size_t minutes = iSeconds / secondsPerMinute;

  // iSeconds %= secondsPerMinute;
  // const std::size_t seconds = iSeconds;
  const double dSeconds = std::fmod(totalSeconds, 60.0);

  /** Create a string in days, hours, minutes and seconds. */
  bool               nonzero = false;
  std::ostringstream make_string;
  if (days != 0)
  {
    make_string << days << "d";
    nonzero = true;
  }
  if (hours != 0 || nonzero)
  {
    make_string << hours << "h";
    nonzero = true;
  }
  if (minutes != 0 || nonzero)
  {
    make_string << minutes << "m";
  }
  make_string << std::showpoint << std::fixed << std::setprecision(precision);
  make_string << dSeconds << "s";

  /** Return a value. */
  return make_string.str();

} // end ConvertSecondsToDHMS()


/** Returns current date and time as a string. */
inline std::string
GetCurrentDateAndTime()
{
  // Obtain current time
  const std::time_t rawtime{ std::time(nullptr) };

  // Convert to local time
  // Note: std::localtime is not threadsafe!
  const std::tm * const localTimePtr{ std::localtime(&rawtime) };

  if (localTimePtr == nullptr)
  {
    assert(!"std::localtime should not return null!");
    return {};
  }

  // Make a copy of the internal object from std::localtime, to reduce the
  // risk of a race condition.
  const std::tm localTimeValue(*localTimePtr);

  constexpr std::size_t maxNumberOfChars{ 32 };
  char                  timeAsString[maxNumberOfChars]{};
  static_assert(maxNumberOfChars > sizeof("Thu Aug 23 14:55:02 2001"),
                "timeAsString should be large enough to hold a typical example date and time");

  if (std::strftime(timeAsString, maxNumberOfChars, "%c", &localTimeValue) == 0)
  {
    assert(!"std::strftime has failed!");
    return {};
  }

  return timeAsString;
} // end GetCurrentDateAndTime()


#endif