Commit 43597c11 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Wrapped the result type of vertical operations with RemoveET

parent f1d3d92a
Loading
Loading
Loading
Loading
+29 −20
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <type_traits>

#include <TNL/Algorithms/Reduction.h>
#include <TNL/Containers/Expressions/TypeTraits.h>

////
// By vertical operations we mean those applied across vector elements or
@@ -26,9 +27,10 @@ namespace Expressions {
////
// Vertical operations
template< typename Expression >
auto ExpressionMin( const Expression& expression ) -> std::decay_t< decltype( expression[0] ) >
auto ExpressionMin( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -39,9 +41,9 @@ auto ExpressionMin( const Expression& expression ) -> std::decay_t< decltype( ex

template< typename Expression >
auto ExpressionArgMin( const Expression& expression )
-> std::pair< std::decay_t< decltype( expression[0] ) >, typename Expression::IndexType >
-> RemoveET< std::pair< std::decay_t< decltype( expression[0] ) >, typename Expression::IndexType > >
{
   using ResultType = std::decay_t< decltype( expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -58,9 +60,10 @@ auto ExpressionArgMin( const Expression& expression )
}

template< typename Expression >
auto ExpressionMax( const Expression& expression ) -> std::decay_t< decltype( expression[0] ) >
auto ExpressionMax( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -71,9 +74,9 @@ auto ExpressionMax( const Expression& expression ) -> std::decay_t< decltype( ex

template< typename Expression >
auto ExpressionArgMax( const Expression& expression )
-> std::pair< std::decay_t< decltype( expression[0] ) >, typename Expression::IndexType >
-> RemoveET< std::pair< std::decay_t< decltype( expression[0] ) >, typename Expression::IndexType > >
{
   using ResultType = std::decay_t< decltype( expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -90,9 +93,10 @@ auto ExpressionArgMax( const Expression& expression )
}

template< typename Expression >
auto ExpressionSum( const Expression& expression ) -> std::decay_t< decltype( expression[0] + expression[0] ) >
auto ExpressionSum( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] + expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] + expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] + expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -101,9 +105,10 @@ auto ExpressionSum( const Expression& expression ) -> std::decay_t< decltype( ex
}

template< typename Expression >
auto ExpressionProduct( const Expression& expression ) -> std::decay_t< decltype( expression[0] * expression[0] ) >
auto ExpressionProduct( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] * expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] * expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] * expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -112,9 +117,10 @@ auto ExpressionProduct( const Expression& expression ) -> std::decay_t< decltype
}

template< typename Expression >
auto ExpressionLogicalAnd( const Expression& expression ) -> std::decay_t< decltype( expression[0] && expression[0] ) >
auto ExpressionLogicalAnd( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] && expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] && expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] && expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -123,9 +129,10 @@ auto ExpressionLogicalAnd( const Expression& expression ) -> std::decay_t< declt
}

template< typename Expression >
auto ExpressionLogicalOr( const Expression& expression ) -> std::decay_t< decltype( expression[0] || expression[0] ) >
auto ExpressionLogicalOr( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] || expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] || expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] || expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -134,9 +141,10 @@ auto ExpressionLogicalOr( const Expression& expression ) -> std::decay_t< declty
}

template< typename Expression >
auto ExpressionBinaryAnd( const Expression& expression ) -> std::decay_t< decltype( expression[0] & expression[0] ) >
auto ExpressionBinaryAnd( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] & expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] & expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] & expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();
@@ -145,9 +153,10 @@ auto ExpressionBinaryAnd( const Expression& expression ) -> std::decay_t< declty
}

template< typename Expression >
auto ExpressionBinaryOr( const Expression& expression ) -> std::decay_t< decltype( expression[0] | expression[0] ) >
auto ExpressionBinaryOr( const Expression& expression )
-> RemoveET< std::decay_t< decltype( expression[0] | expression[0] ) > >
{
   using ResultType = std::decay_t< decltype( expression[0] | expression[0] ) >;
   using ResultType = RemoveET< std::decay_t< decltype( expression[0] | expression[0] ) > >;
   using IndexType = typename Expression::IndexType;

   const auto view = expression.getConstView();