From effa8cd55df2f0584ba9a3e9a740075b9e542af2 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Thu, 10 Oct 2019 01:17:57 +0400
Subject: [PATCH] trunc function for vector with unit tests.

---
 source/simple/geom/vector.hpp | 17 +++++++++++++++++
 unit_tests/point.cpp          | 18 ++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/source/simple/geom/vector.hpp b/source/simple/geom/vector.hpp
index 07f5b7e..88bdde3 100644
--- a/source/simple/geom/vector.hpp
+++ b/source/simple/geom/vector.hpp
@@ -431,6 +431,14 @@ SIMPLE_GEOM_VECTOR_DEFINE_COMPARISON_OPERATOR(<=, bool_vector)
 			return *this;
 		}
 
+		constexpr vector& trunc()
+		{
+			using std::trunc;
+			for(auto&& coord : raw)
+				coord = trunc(coord);
+			return *this;
+		}
+
 		constexpr vector& abs()
 		{
 			using std::abs;
@@ -652,6 +660,15 @@ SIMPLE_GEOM_VECTOR_DEFINE_COMPARISON_OPERATOR(<=, bool_vector)
 		return v;
 	}
 
+	template <typename C, size_t D, typename O>
+	[[nodiscard]]
+	constexpr
+	vector<C,D,O> trunc(vector<C,D,O> v)
+	{
+		v.trunc();
+		return v;
+	}
+
 	template <typename C, size_t D, typename O>
 	[[nodiscard]]
 	constexpr
diff --git a/unit_tests/point.cpp b/unit_tests/point.cpp
index 126809d..4fbda40 100644
--- a/unit_tests/point.cpp
+++ b/unit_tests/point.cpp
@@ -344,11 +344,14 @@ void Algorithms()
 	assert( int4(-1, 3, -3, 1) == p3);
 
 	float4 fp (1.1f, 3.4f, 4.5f, 8.9f);
+	assert( float4(1.f, 3.f, 4.f, 8.f) == trunc(fp) );
 	assert( float4(1.f, 3.f, 4.f, 8.f) == floor(fp) );
 	assert( float4(2.f, 4.f, 5.f, 9.f) == ceil(fp) );
 	assert( float4(1.f, 3.f, 5.f, 9.f) == round(fp) );
 
 	float4 fp2;
+	(fp2 = fp).trunc();
+	assert( float4(1.f, 3.f, 4.f, 8.f) == fp2 );
 	(fp2 = fp).floor();
 	assert( float4(1.f, 3.f, 4.f, 8.f) == fp2 );
 	(fp2 = fp).ceil();
@@ -356,6 +359,21 @@ void Algorithms()
 	(fp2 = fp).round();
 	assert( float4(1.f, 3.f, 5.f, 9.f) == fp2 );
 
+	fp = float4(1.1f, -3.4f, 4.5f, -8.9f);
+	assert( float4(1.f, -3.f, 4.f, -8.f) == trunc(fp) );
+	assert( float4(1.f, -4.f, 4.f, -9.f) == floor(fp) );
+	assert( float4(2.f, -3.f, 5.f, -8.f) == ceil(fp) );
+	assert( float4(1.f, -3.f, 5.f, -9.f) == round(fp) );
+
+	(fp2 = fp).trunc();
+	assert( float4(1.f, -3.f, 4.f, -8.f) == fp2 );
+	(fp2 = fp).floor();
+	assert( float4(1.f, -4.f, 4.f, -9.f) == fp2 );
+	(fp2 = fp).ceil();
+	assert( float4(2.f, -3.f, 5.f, -8.f) == fp2 );
+	(fp2 = fp).round();
+	assert( float4(1.f, -3.f, 5.f, -9.f) == fp2 );
+
 	int4 p4 (2, 6, 3, 0);
 	assert( p4.magnitude() ==  49);
 	assert( p4.quadrance() ==  49);
-- 
GitLab