diff options
Diffstat (limited to 'Source/cmDuration.cxx')
-rw-r--r-- | Source/cmDuration.cxx | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/Source/cmDuration.cxx b/Source/cmDuration.cxx new file mode 100644 index 0000000..8ca5d8d --- /dev/null +++ b/Source/cmDuration.cxx @@ -0,0 +1,27 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#define CMDURATION_CPP +#include "cmDuration.h" + +template <typename T> +T cmDurationTo(const cmDuration& duration) +{ + /* This works because the comparison operators for duration rely on + * std::common_type. + * So for example duration<int>::max() gets promoted to a duration<double>, + * which can then be safely compared. + */ + if (duration >= std::chrono::duration<T>::max()) { + return std::chrono::duration<T>::max().count(); + } + if (duration <= std::chrono::duration<T>::min()) { + return std::chrono::duration<T>::min().count(); + } + // Ensure number of seconds by defining ratio<1> + return std::chrono::duration_cast<std::chrono::duration<T, std::ratio<1>>>( + duration) + .count(); +} + +template int cmDurationTo<int>(const cmDuration&); +template unsigned int cmDurationTo<unsigned int>(const cmDuration&); |