diff options
Diffstat (limited to 'libcxx/test/std/utilities/time/time.cal/euclidian.h')
-rw-r--r-- | libcxx/test/std/utilities/time/time.cal/euclidian.h | 40 |
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; +} + |