Commit 2d2fa9c2 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Added variadic min and max functions

parent 002dd913
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -43,6 +43,19 @@ ResultType min( const T1& a, const T2& b )
#endif
}

/**
 * \brief This function returns minimum of a variadic number of inputs.
 *
 * The inputs are folded with the \ref min function from the left to the right.
 */
template< typename T1, typename T2, typename T3, typename... Ts >
__cuda_callable__
typename std::common_type< T1, T2, T3, Ts... >::type
min( T1&& val1, T2&& val2, T3&& val3, Ts&&... vs )
{
   return min( min( std::forward<T1>(val1), std::forward<T2>(val2) ),
               std::forward<T3>(val3), std::forward<Ts>(vs)... );
}

/**
 * \brief This function returns maximum of two numbers.
@@ -68,6 +81,20 @@ ResultType max( const T1& a, const T2& b )
#endif
}

/**
 * \brief This function returns minimum of a variadic number of inputs.
 *
 * The inputs are folded with the \ref max function from the left to the right.
 */
template< typename T1, typename T2, typename T3, typename... Ts >
__cuda_callable__
typename std::common_type< T1, T2, T3, Ts... >::type
max( T1&& val1, T2&& val2, T3&& val3, Ts&&... vs )
{
   return max( max( std::forward<T1>(val1), std::forward<T2>(val2) ),
               std::forward<T3>(val3), std::forward<Ts>(vs)... );
}

/**
 * \brief This function returns absolute value of given number \e n.
 */
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ ADD_SUBDIRECTORY( Functions )
ADD_SUBDIRECTORY( Meshes )
ADD_SUBDIRECTORY( Pointers )

set( CPP_TESTS  AssertTest FileNameTest StringTest ObjectTest TimerTest TypeInfoTest )
set( CPP_TESTS  AssertTest FileNameTest MathTest ObjectTest StringTest TimerTest TypeInfoTest )
set( CUDA_TESTS  AssertCudaTest )
if( BUILD_CUDA )
   set( CUDA_TESTS  ${CUDA_TESTS} AllocatorsTest FileTest )
+79 −0
Original line number Diff line number Diff line
/***************************************************************************
                          MathTest.cpp  -  description
                             -------------------
    begin                : Dec 17, 2020
    copyright            : (C) 2020 by Tomas Oberhuber et al.
    email                : tomas.oberhuber@fjfi.cvut.cz
 ***************************************************************************/

/* See Copyright Notice in tnl/Copyright */

#ifdef HAVE_GTEST
#include <gtest/gtest.h>
#endif

#include <TNL/Math.h>

#ifdef HAVE_GTEST
TEST( MathTest, variadic_min )
{
   using TNL::min;

   EXPECT_EQ( min(1, 2, 3, 4), 1 );
   EXPECT_EQ( min(1, 2, 4, 3), 1 );
   EXPECT_EQ( min(1, 3, 2, 4), 1 );
   EXPECT_EQ( min(1, 3, 4, 2), 1 );
   EXPECT_EQ( min(1, 4, 2, 3), 1 );
   EXPECT_EQ( min(1, 4, 3, 2), 1 );
   EXPECT_EQ( min(2, 1, 3, 4), 1 );
   EXPECT_EQ( min(2, 1, 4, 3), 1 );
   EXPECT_EQ( min(2, 3, 1, 4), 1 );
   EXPECT_EQ( min(2, 3, 4, 1), 1 );
   EXPECT_EQ( min(2, 4, 1, 3), 1 );
   EXPECT_EQ( min(2, 4, 3, 1), 1 );
   EXPECT_EQ( min(3, 1, 2, 4), 1 );
   EXPECT_EQ( min(3, 1, 4, 2), 1 );
   EXPECT_EQ( min(3, 2, 1, 4), 1 );
   EXPECT_EQ( min(3, 2, 4, 1), 1 );
   EXPECT_EQ( min(3, 4, 1, 2), 1 );
   EXPECT_EQ( min(3, 4, 2, 1), 1 );
   EXPECT_EQ( min(4, 1, 2, 3), 1 );
   EXPECT_EQ( min(4, 1, 3, 2), 1 );
   EXPECT_EQ( min(4, 2, 1, 3), 1 );
   EXPECT_EQ( min(4, 2, 3, 1), 1 );
   EXPECT_EQ( min(4, 3, 1, 2), 1 );
   EXPECT_EQ( min(4, 3, 2, 1), 1 );
}

TEST( MathTest, variadic_max )
{
   using TNL::max;

   EXPECT_EQ( max(1, 2, 3, 4), 4 );
   EXPECT_EQ( max(1, 2, 4, 3), 4 );
   EXPECT_EQ( max(1, 3, 2, 4), 4 );
   EXPECT_EQ( max(1, 3, 4, 2), 4 );
   EXPECT_EQ( max(1, 4, 2, 3), 4 );
   EXPECT_EQ( max(1, 4, 3, 2), 4 );
   EXPECT_EQ( max(2, 1, 3, 4), 4 );
   EXPECT_EQ( max(2, 1, 4, 3), 4 );
   EXPECT_EQ( max(2, 3, 1, 4), 4 );
   EXPECT_EQ( max(2, 3, 4, 1), 4 );
   EXPECT_EQ( max(2, 4, 1, 3), 4 );
   EXPECT_EQ( max(2, 4, 3, 1), 4 );
   EXPECT_EQ( max(3, 1, 2, 4), 4 );
   EXPECT_EQ( max(3, 1, 4, 2), 4 );
   EXPECT_EQ( max(3, 2, 1, 4), 4 );
   EXPECT_EQ( max(3, 2, 4, 1), 4 );
   EXPECT_EQ( max(3, 4, 1, 2), 4 );
   EXPECT_EQ( max(3, 4, 2, 1), 4 );
   EXPECT_EQ( max(4, 1, 2, 3), 4 );
   EXPECT_EQ( max(4, 1, 3, 2), 4 );
   EXPECT_EQ( max(4, 2, 1, 3), 4 );
   EXPECT_EQ( max(4, 2, 3, 1), 4 );
   EXPECT_EQ( max(4, 3, 1, 2), 4 );
   EXPECT_EQ( max(4, 3, 2, 1), 4 );
}
#endif

#include "main.h"