Loading src/TNL/Containers/Expressions/VerticalOperations.h +29 −20 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading Loading
src/TNL/Containers/Expressions/VerticalOperations.h +29 −20 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading