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