diff --git a/src/wrappers.hpp b/src/wrappers.hpp index 74cc4ccfb..6618d606a 100644 --- a/src/wrappers.hpp +++ b/src/wrappers.hpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -357,6 +358,36 @@ double MaxAbsValue(const Eigen::MatrixBase& x) return x.cwiseAbs().maxCoeff(); } +template +T Max(T&&t) +{ + return std::forward(t); +} + +template +typename std::common_type::type Max(T0&& val1, T1&& val2, Ts&&... vs) +{ + if (val2 < val1) + return Max(val1, std::forward(vs)...); + else + return Max(val2, std::forward(vs)...); +} + +template +T Min(T&&t) +{ + return std::forward(t); +} + +template +typename std::common_type::type Min(T0&& val1, T1&& val2, Ts&&... vs) +{ + if (val2 < val1) + return Min(val2, std::forward(vs)...); + else + return Min(val1, std::forward(vs)...); +} + inline int Sign(double x) { return (x >= 0.0 ? 1 : -1); diff --git a/test/test_wrappers.cpp b/test/test_wrappers.cpp index 700225a89..85c024581 100644 --- a/test/test_wrappers.cpp +++ b/test/test_wrappers.cpp @@ -517,3 +517,33 @@ BOOST_AUTO_TEST_CASE(test_Im_Eigen_Matrix) BOOST_CHECK_EQUAL(im2(1,0), 0.); BOOST_CHECK_EQUAL(im2(1,1), 10.0); } + +BOOST_AUTO_TEST_CASE(test_Min) +{ + BOOST_CHECK_EQUAL(Min(0.), 0.); + BOOST_CHECK_EQUAL(Min(1.), 1.); + BOOST_CHECK_EQUAL(Min(-1), -1); + + BOOST_CHECK_EQUAL(Min(0.,1.), 0.); + BOOST_CHECK_EQUAL(Min(1.,0.), 0.); + BOOST_CHECK_EQUAL(Min(1,0.), 0.); + BOOST_CHECK_EQUAL(Min(1.,0), 0.); + + BOOST_CHECK_EQUAL(Min(-1,0,1), -1); + BOOST_CHECK_EQUAL(Min(-1.,0.,1.), -1.); +} + +BOOST_AUTO_TEST_CASE(test_Max) +{ + BOOST_CHECK_EQUAL(Max(0.), 0.); + BOOST_CHECK_EQUAL(Max(1.), 1.); + BOOST_CHECK_EQUAL(Max(-1), -1); + + BOOST_CHECK_EQUAL(Max(0.,1.), 1.); + BOOST_CHECK_EQUAL(Max(1.,0.), 1.); + BOOST_CHECK_EQUAL(Max(1,0.), 1.); + BOOST_CHECK_EQUAL(Max(1.,0), 1.); + + BOOST_CHECK_EQUAL(Max(-1,0,1), 1); + BOOST_CHECK_EQUAL(Max(-1.,0.,1.), 1.); +}