summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-03-21 01:34:31 +0000
committerrubidium <rubidium@openttd.org>2009-03-21 01:34:31 +0000
commit4eea5c966944ef83aca0c72569a35f092809f3fd (patch)
treef1445bfef3792ebd7abfef3479ee355581e5602e
parent6f1d634bc2ec45dadeff0d66252c02da5e256985 (diff)
downloadopenttd-4eea5c966944ef83aca0c72569a35f092809f3fd.tar.xz
(svn r15777) -Add: helper functions to get the least common multiple and the greatest common divisor (Alberth)
-rw-r--r--projects/openttd_vs80.vcproj4
-rw-r--r--projects/openttd_vs90.vcproj4
-rw-r--r--source.list1
-rw-r--r--src/core/math_func.cpp41
-rw-r--r--src/core/math_func.hpp3
5 files changed, 53 insertions, 0 deletions
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index caa5cfe1d..61ab031b8 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -1672,6 +1672,10 @@
>
</File>
<File
+ RelativePath=".\..\src\core\math_func.cpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\core\math_func.hpp"
>
</File>
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index 4ed8aa9e8..0c715ad45 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -1669,6 +1669,10 @@
>
</File>
<File
+ RelativePath=".\..\src\core\math_func.cpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\core\math_func.hpp"
>
</File>
diff --git a/source.list b/source.list
index 6f3489400..7dd0c1c18 100644
--- a/source.list
+++ b/source.list
@@ -363,6 +363,7 @@ core/endian_func.hpp
core/endian_type.hpp
core/enum_type.hpp
core/geometry_type.hpp
+core/math_func.cpp
core/math_func.hpp
core/mem_func.hpp
core/overflowsafe_type.hpp
diff --git a/src/core/math_func.cpp b/src/core/math_func.cpp
new file mode 100644
index 000000000..360ec0ec5
--- /dev/null
+++ b/src/core/math_func.cpp
@@ -0,0 +1,41 @@
+/* $Id$ */
+
+/** @file math_func.cpp Math functions. */
+
+#include "../stdafx.h"
+#include "math_func.hpp"
+
+/**
+ * Compute least common multiple (lcm) of arguments \a a and \a b, the smallest
+ * integer value that is a multiple of both \a a and \a b.
+ * @param a First number.
+ * @param b second number.
+ * @return Least common multiple of values \a a and \a b.
+ *
+ * @note This function only works for non-negative values of \a a and \a b.
+ */
+int LeastCommonMultiple(int a, int b)
+{
+ if (a == 0 || b == 0) return 0; // By definition.
+ if (a == 1 || a == b) return b;
+ if (b == 1) return a;
+
+ return a * b / GreatestCommonDivisor(a, b);
+}
+
+/**
+ * Compute greatest common divisor (gcd) of \a a and \a b.
+ * @param a First number.
+ * @param b second number.
+ * @return Greatest common divisor of \a a and \a b.
+ */
+int GreatestCommonDivisor(int a, int b)
+{
+ while (b != 0) {
+ int t = b;
+ b = a % b;
+ a = t;
+ }
+ return a;
+
+}
diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp
index 6a0f5c17a..35e660d88 100644
--- a/src/core/math_func.hpp
+++ b/src/core/math_func.hpp
@@ -264,4 +264,7 @@ static FORCEINLINE void Swap(T &a, T &b)
b = t;
}
+int LeastCommonMultiple(int a, int b);
+int GreatestCommonDivisor(int a, int b);
+
#endif /* MATH_FUNC_HPP */