diff --git a/include/vectorwrapper/vectorops.hpp b/include/vectorwrapper/vectorops.hpp index 4f6ebc0..1cd6b1f 100644 --- a/include/vectorwrapper/vectorops.hpp +++ b/include/vectorwrapper/vectorops.hpp @@ -34,6 +34,23 @@ namespace vwr { template Vec::type> cross ( const Vec& parLeft, const Vec& parRight ); + template + Vec::type> min ( const Vec& parLeft, const Vec& parRight ); + template + Vec::type> max ( const Vec& parLeft, const Vec& parRight ); + + namespace implem { + template + inline Vec::type> min ( bt::number_seq, const Vec& parLeft, const Vec& parRight ) { + return {parLeft[Indices] < parRight[Indices] ? parLeft[Indices] : parRight[Indices]...}; + } + + template + inline Vec::type> max ( bt::number_seq, const Vec& parLeft, const Vec& parRight ) { + return {parLeft[Indices] < parRight[Indices] ? parRight[Indices] : parLeft[Indices]...}; + } + } //namespace implem + template inline typename std::common_type::scalar_type, typename Vec::scalar_type>::type dot (const Vec& parLeft, const Vec& parRight) { auto retval = parLeft.x() * parRight.x(); @@ -55,6 +72,16 @@ namespace vwr { parLeft.x() * parRight.y() - parLeft.y() * parRight.x() ); } + + template + inline Vec::type> min ( const Vec& parLeft, const Vec& parRight ) { + return implem::min(bt::number_range(), parLeft, parRight); + } + + template + inline Vec::type> max ( const Vec& parLeft, const Vec& parRight ) { + return implem::max(bt::number_range(), parLeft, parRight); + } } //namespace vwr #if defined VWR_OUTER_NAMESPACE diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index dfb8b00..3c61516 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -10,6 +10,7 @@ add_executable(${PROJECT_NAME} test_sequence_range.cpp test_offset_getters.cpp test_custom_type.cpp + test_min_max.cpp ) target_link_libraries(${PROJECT_NAME} diff --git a/test/unit/meson.build b/test/unit/meson.build index b110c0e..2bbe4e8 100644 --- a/test/unit/meson.build +++ b/test/unit/meson.build @@ -9,6 +9,7 @@ exec_target = executable(meson.project_name(), 'test_sequence_range.cpp', 'test_offset_getters.cpp', 'test_custom_type.cpp', + 'test_min_max.cpp', install: false, dependencies: [gtest_dep, vectorwrapper_dep], cpp_args: compiler_opts, diff --git a/test/unit/test_min_max.cpp b/test/unit/test_min_max.cpp new file mode 100644 index 0000000..fa47c04 --- /dev/null +++ b/test/unit/test_min_max.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2015-2017 Michele "King_DuckZ" Santullo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "vectorwrapper/vectorops.hpp" +#include "sample_vectors.hpp" +#include + +TEST(vwr, min) { + using namespace vwr; + + { + ivec3 a(1, 2, 3); + ivec3 b(0, 4, 3); + ivec3 c = min(a, b); + EXPECT_EQ(0, c.x()); + EXPECT_EQ(2, c.y()); + EXPECT_EQ(3, c.z()); + } + + { + ivec3 a(-2, -3, -4); + ivec3 b(100); + ivec3 c = min(a, b); + EXPECT_EQ(-2, c.x()); + EXPECT_EQ(-3, c.y()); + EXPECT_EQ(-4, c.z()); + } + + { + ivec3 a(100); + ivec3 b(-1000, -1100, -1200); + ivec3 c = min(a, b); + EXPECT_EQ(-1000, c.x()); + EXPECT_EQ(-1100, c.y()); + EXPECT_EQ(-1200, c.z()); + } + + { + ivec3 a(-20, 30, -40); + ivec3 b(a); + ivec3 c = min(a, b); + EXPECT_EQ(-20, c.x()); + EXPECT_EQ(30, c.y()); + EXPECT_EQ(-40, c.z()); + } +} + +TEST(vwr, max) { + using namespace vwr; + { + ivec2 a(1, 2); + ivec2 b(0, 4); + ivec2 c = max(a, b); + EXPECT_EQ(1, c.x()); + EXPECT_EQ(4, c.y()); + } + + { + ivec3 a(2, 3, 4); + ivec3 b(-100); + ivec3 c = max(a, b); + EXPECT_EQ(2, c.x()); + EXPECT_EQ(3, c.y()); + EXPECT_EQ(4, c.z()); + } + + { + ivec3 a(-100); + ivec3 b(1000, 1100, 1200); + ivec3 c = max(a, b); + EXPECT_EQ(1000, c.x()); + EXPECT_EQ(1100, c.y()); + EXPECT_EQ(1200, c.z()); + } + + { + ivec3 a(20, -30, 40); + ivec3 b(a); + ivec3 c = max(a, b); + EXPECT_EQ(20, c.x()); + EXPECT_EQ(-30, c.y()); + EXPECT_EQ(40, c.z()); + } +}