From 9ef33ea68a3a507bba74eefa5fa603bd13ba9899 Mon Sep 17 00:00:00 2001
From: "Dmitry Yu. Naumov" <github@naumov.de>
Date: Sun, 19 Jul 2015 16:50:18 +0000
Subject: [PATCH] [MaL] Replace Point3d op<() with TemplatePoint.op<

The lexicographic comparison is now working for
arbitrary TemplatePoint dimensions and underlying
floating types.
---
 MathLib/Point3d.cpp     | 30 ------------------------------
 MathLib/Point3d.h       |  2 --
 MathLib/TemplatePoint.h | 19 +++++++++++++++++++
 3 files changed, 19 insertions(+), 32 deletions(-)

diff --git a/MathLib/Point3d.cpp b/MathLib/Point3d.cpp
index 71277056070..ad1b56ea7e0 100644
--- a/MathLib/Point3d.cpp
+++ b/MathLib/Point3d.cpp
@@ -18,36 +18,6 @@
 namespace MathLib
 {
 
-bool operator< (const MathLib::Point3d& p0, const MathLib::Point3d& p1)
-{
-	if (p0[0] > p1[0]) {
-		return false;
-	} else {
-		if (p0[0] < p1[0]) {
-			return true;
-		}
-	}
-	// => p0[0] == p1[0]
-
-	if (p0[1] > p1[1]) {
-		return false;
-	} else {
-		if (p0[1] < p1[1]) {
-			return true;
-		}
-	}
-	// => p0[1] == p1[1]
-
-	if (p0[2] > p1[2]) {
-		return false;
-	} else {
-		if (p0[2] < p1[2]) {
-			return true;
-		}
-		return false; // p0 == p1
-	}
-}
-
 bool lessEq(const MathLib::Point3d& p0, const MathLib::Point3d& p1, double tol)
 {
 	// test a relative and an absolute criterion
diff --git a/MathLib/Point3d.h b/MathLib/Point3d.h
index 0c8c985e58b..85ed4b4ca4c 100644
--- a/MathLib/Point3d.h
+++ b/MathLib/Point3d.h
@@ -23,8 +23,6 @@ namespace MathLib
 {
 typedef MathLib::TemplatePoint<double,3> Point3d;
 
-bool operator< (MathLib::Point3d const & p0, MathLib::Point3d const & p1);
-
 /**
  * lexicographical comparison of points taking an epsilon into account
  * @param p0 first input Point3d
diff --git a/MathLib/TemplatePoint.h b/MathLib/TemplatePoint.h
index b8be4e918af..d6429bf2fe9 100644
--- a/MathLib/TemplatePoint.h
+++ b/MathLib/TemplatePoint.h
@@ -111,6 +111,25 @@ bool operator==(TemplatePoint<T,DIM> const& a, TemplatePoint<T,DIM> const& b)
 	return (sqr_dist < eps*eps);
 }
 
+template <typename T, std::size_t DIM>
+bool operator< (TemplatePoint<T,DIM> const& a, TemplatePoint<T,DIM> const& b)
+{
+	for (std::size_t i = 0; i < DIM; ++i)
+	{
+		if (a[i] > b[i]) {
+			return false;
+		} else {
+			if (a[i] < b[i]) {
+				return true;
+			}
+		}
+		// continue with next dimension, because a[0] == b[0]
+	}
+
+	// The values in all dimenisions are equal.
+	return false;
+}
+
 /** Distance between points p0 and p1 in the maximum norm. */
 template <typename T>
 T maxNormDist(const MathLib::TemplatePoint<T>* p0, const MathLib::TemplatePoint<T>* p1)
-- 
GitLab