Skip to content

Commit

Permalink
implemen generic Min() and Max() functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Voigt authored and Alexander Voigt committed Jan 27, 2017
1 parent bfe9c15 commit d659050
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/wrappers.hpp
Expand Up @@ -28,6 +28,7 @@
#include <sstream>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>
#include <Eigen/Core>
#include <boost/lexical_cast.hpp>
Expand Down Expand Up @@ -357,6 +358,36 @@ double MaxAbsValue(const Eigen::MatrixBase<Derived>& x)
return x.cwiseAbs().maxCoeff();
}

template<typename T>
T Max(T&&t)
{
return std::forward<T>(t);
}

template<typename T0, typename T1, typename... Ts>
typename std::common_type<T0, T1, Ts...>::type Max(T0&& val1, T1&& val2, Ts&&... vs)
{
if (val2 < val1)
return Max(val1, std::forward<Ts>(vs)...);
else
return Max(val2, std::forward<Ts>(vs)...);
}

template<typename T>
T Min(T&&t)
{
return std::forward<T>(t);
}

template<typename T0, typename T1, typename... Ts>
typename std::common_type<T0, T1, Ts...>::type Min(T0&& val1, T1&& val2, Ts&&... vs)
{
if (val2 < val1)
return Min(val2, std::forward<Ts>(vs)...);
else
return Min(val1, std::forward<Ts>(vs)...);
}

inline int Sign(double x)
{
return (x >= 0.0 ? 1 : -1);
Expand Down
30 changes: 30 additions & 0 deletions test/test_wrappers.cpp
Expand Up @@ -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.);
}

0 comments on commit d659050

Please sign in to comment.