From 9c04e50386008e9fb449dbe222b02ed05cbb9763 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Sat, 23 Oct 2021 23:13:10 +0400
Subject: [PATCH] Vector concatenation.

---
 source/simple/geom/vector.hpp | 19 ++++++++++++++++---
 unit_tests/point.cpp          |  7 +++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/source/simple/geom/vector.hpp b/source/simple/geom/vector.hpp
index 31f1e57..087b2b7 100644
--- a/source/simple/geom/vector.hpp
+++ b/source/simple/geom/vector.hpp
@@ -421,6 +421,20 @@ namespace simple::geom
 			return result;
 		}
 
+		template <size_t N, typename O>
+		[[nodiscard]] constexpr
+		auto concat(vector<Coordinate, N, O> other) const
+		{
+			vector<Coordinate,Dimensions + N, support::concat_seq_t<
+				Order, support::offset_seq_t<size_t, Dimensions, O> >>
+			result{};
+			for(size_t i = 0; i < Dimensions; ++i)
+				result[i] = (*this)[i];
+			for(size_t i = 0; i < N; ++i)
+				result[Dimensions + i] = other[i];
+			return result;
+		}
+
 		// NOTE: emmm... ok??
 		// emmm yes, this is ok, bitwise not on a bool is a warning anyways, so in context of vector we make it elementwise logical not,
 		// as that logicaly behaves similar to bitwise not on flags
@@ -965,9 +979,8 @@ namespace simple::geom
 	template <typename F, typename... R> vector(F firts, R... rest)
 		-> vector<F, sizeof...(R) + 1>;
 
-	// ugh, clang is really nitpickey about default template arguments
-	// actually, might be this bug
-	// https://stackoverflow.com/questions/57133186/g-and-clang-different-behaviour-when-stdmake-index-sequence-and-stdin
+	// TODO: ugh, clang
+	// https://bugs.llvm.org/show_bug.cgi?id=42757
 	// very annoying in many different places :/
 	template <typename C, size_t D, typename O, void* SFINAE> vector(vector<C,D,O,SFINAE>)
 		-> vector<vector<C,D,O,SFINAE>,1>;
diff --git a/unit_tests/point.cpp b/unit_tests/point.cpp
index d29b994..a9b555e 100644
--- a/unit_tests/point.cpp
+++ b/unit_tests/point.cpp
@@ -103,6 +103,13 @@ void Mixing()
 
 	assert( (vector(1,2) == p.first<2>()) );
 	assert( (vector(2,3,4) == p.last<3>()) );
+
+	assert( vector(1,2,3,4,5,6) == p.concat(vector(5,6)) );
+	assert( vector(-1,0,1,2,3,4) == vector(-1,0).concat(p) );
+
+	vector<int, 2, std::index_sequence<1,0>> revector{2,3};
+	assert(( vector(0,1).concat(revector) == vector<int, 4, std::index_sequence<0,1,3,2>>(0,1,2,3) ));
+	assert(( revector.concat(vector(4,5,6)) == vector<int, 5, std::index_sequence<1,0,2,3,4>>(2,3,4,5,6) ));
 }
 
 void MultidimensionalElementAccess()
-- 
GitLab