summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/utilities/time/time.cal/euclidian.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/std/utilities/time/time.cal/euclidian.h')
-rw-r--r--libcxx/test/std/utilities/time/time.cal/euclidian.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/time/time.cal/euclidian.h b/libcxx/test/std/utilities/time/time.cal/euclidian.h
new file mode 100644
index 00000000000..f2dc28b36cd
--- /dev/null
+++ b/libcxx/test/std/utilities/time/time.cal/euclidian.h
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+// Assumption: minValue < maxValue
+// Assumption: minValue <= rhs <= maxValue
+// Assumption: minValue <= lhs <= maxValue
+// Assumption: minValue >= 0
+template <typename T, T minValue, T maxValue>
+T euclidian_addition(T rhs, T lhs)
+{
+ const T modulus = maxValue - minValue + 1;
+ T ret = rhs + lhs;
+ if (ret > maxValue)
+ ret -= modulus;
+ return ret;
+}
+
+// Assumption: minValue < maxValue
+// Assumption: minValue <= rhs <= maxValue
+// Assumption: minValue <= lhs <= maxValue
+// Assumption: minValue >= 0
+template <typename T, T minValue, T maxValue>
+T euclidian_subtraction(T lhs, T rhs)
+{
+ const T modulus = maxValue - minValue + 1;
+ T ret = lhs - rhs;
+ if (ret < minValue)
+ ret += modulus;
+ if (ret > maxValue) // this can happen if T is unsigned
+ ret += modulus;
+ return ret;
+}
+
OpenPOWER on IntegriCloud