Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/util/time.cpp')
-rw-r--r--intern/cycles/util/time.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/intern/cycles/util/time.cpp b/intern/cycles/util/time.cpp
new file mode 100644
index 00000000000..62d14b063be
--- /dev/null
+++ b/intern/cycles/util/time.cpp
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2011-2013 Blender Foundation
+ *
+ * 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
+ *
+ * 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.
+ */
+
+#include "util/time.h"
+
+#include <stdlib.h>
+
+#if !defined(_WIN32)
+# include <sys/time.h>
+# include <unistd.h>
+#endif
+
+#include "util/math.h"
+#include "util/string.h"
+#include "util/windows.h"
+
+CCL_NAMESPACE_BEGIN
+
+#ifdef _WIN32
+double time_dt()
+{
+ __int64 frequency, counter;
+
+ QueryPerformanceFrequency((LARGE_INTEGER *)&frequency);
+ QueryPerformanceCounter((LARGE_INTEGER *)&counter);
+
+ return (double)counter / (double)frequency;
+}
+
+void time_sleep(double t)
+{
+ Sleep((int)(t * 1000));
+}
+#else
+double time_dt()
+{
+ struct timeval now;
+ gettimeofday(&now, NULL);
+
+ return now.tv_sec + now.tv_usec * 1e-6;
+}
+
+/* sleep t seconds */
+void time_sleep(double t)
+{
+ /* get whole seconds */
+ int s = (int)t;
+
+ if (s >= 1) {
+ sleep(s);
+
+ /* adjust parameter to remove whole seconds */
+ t -= s;
+ }
+
+ /* get microseconds */
+ int us = (int)(t * 1e6);
+ if (us > 0)
+ usleep(us);
+}
+#endif
+
+/* Time in format "hours:minutes:seconds.hundreds" */
+
+string time_human_readable_from_seconds(const double seconds)
+{
+ const int h = (((int)seconds) / (60 * 60));
+ const int m = (((int)seconds) / 60) % 60;
+ const int s = (((int)seconds) % 60);
+ const int r = (((int)(seconds * 100)) % 100);
+
+ if (h > 0) {
+ return string_printf("%.2d:%.2d:%.2d.%.2d", h, m, s, r);
+ }
+ else {
+ return string_printf("%.2d:%.2d.%.2d", m, s, r);
+ }
+}
+
+double time_human_readable_to_seconds(const string &time_string)
+{
+ /* Those are multiplies of a corresponding token surrounded by : in the
+ * time string, which denotes how to convert value to seconds.
+ * Effectively: seconds, minutes, hours, days in seconds. */
+ const int multipliers[] = {1, 60, 60 * 60, 24 * 60 * 60};
+ const int num_multiplies = sizeof(multipliers) / sizeof(*multipliers);
+ if (time_string.empty()) {
+ return 0.0;
+ }
+ double result = 0.0;
+ /* Split fractions of a second from the encoded time. */
+ vector<string> fraction_tokens;
+ string_split(fraction_tokens, time_string, ".", false);
+ const int num_fraction_tokens = fraction_tokens.size();
+ if (num_fraction_tokens == 0) {
+ /* Time string is malformed. */
+ return 0.0;
+ }
+ else if (fraction_tokens.size() == 1) {
+ /* There is no fraction of a second specified, the rest of the code
+ * handles this normally. */
+ }
+ else if (fraction_tokens.size() == 2) {
+ result = atof(fraction_tokens[1].c_str());
+ result *= pow(0.1, fraction_tokens[1].length());
+ }
+ else {
+ /* This is not a valid string, the result can not be reliable. */
+ return 0.0;
+ }
+ /* Split hours, minutes and seconds.
+ * Hours part is optional. */
+ vector<string> tokens;
+ string_split(tokens, fraction_tokens[0], ":", false);
+ const int num_tokens = tokens.size();
+ if (num_tokens > num_multiplies) {
+ /* Can not reliably represent the value. */
+ return 0.0;
+ }
+ for (int i = 0; i < num_tokens; ++i) {
+ result += atoi(tokens[num_tokens - i - 1].c_str()) * multipliers[i];
+ }
+ return result;
+}
+
+CCL_NAMESPACE_END