22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATSCALARDIVEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
133 template<
typename MT
142 typedef typename MT::ResultType
RT;
143 typedef typename MT::ReturnType
RN;
144 typedef typename MT::CompositeType
CT;
172 template<
typename MT2 >
174 enum { value = useAssign };
211 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
443 template<
typename T >
445 return matrix_.canAlias( alias );
455 template<
typename T >
457 return matrix_.isAliased( alias );
481 template<
typename MT2
511 template<
typename MT2
541 template<
typename MT2
543 friend inline typename EnableIf< UseAssign<MT2> >::Type
578 template<
typename MT2
580 friend inline typename EnableIf< UseAssign<MT2> >::Type
653 template<
typename T1
656 inline const typename EnableIf< IsNumeric<T2>,
657 typename SMatScalarDivExprHelper<T1,T2,SO>::Type >::Type
665 typedef typename Helper::ScalarType ScalarType;
667 if( Helper::value ) {
668 return typename Helper::Type( ~mat, ScalarType(1)/ScalarType(scalar) );
671 return typename Helper::Type( ~mat, scalar );
698 template<
typename MT
702 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
703 ,
typename MultExprTrait< SMatScalarDivExpr<MT,ST1,SO>, ST2 >::Type >::Type
704 operator*(
const SMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
708 return mat.leftOperand() * ( scalar / mat.rightOperand() );
727 template<
typename ST1
731 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
732 ,
typename MultExprTrait< ST1, SMatScalarDivExpr<MT,ST2,SO> >::Type >::Type
733 operator*( ST1 scalar,
const SMatScalarDivExpr<MT,ST2,SO>& mat )
737 return mat.leftOperand() * ( scalar / mat.rightOperand() );
756 template<
typename MT
760 inline const typename EnableIf< IsNumeric<ST2>
761 ,
typename SMatScalarDivExprHelper<MT,typename MultTrait<ST1,ST2>::Type,SO>::Type >::Type
762 operator/(
const SMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
768 typedef typename MultTrait<ST1,ST2>::Type MultType;
769 typedef SMatScalarDivExprHelper<MT,MultType,SO> Helper;
771 if( Helper::value ) {
772 return typename Helper::Type( mat.leftOperand(), MultType(1)/( mat.rightOperand() * scalar ) );
775 return typename Helper::Type( mat.leftOperand(), mat.rightOperand() * scalar );
802 template<
typename MT
805 inline typename RowExprTrait< SMatScalarDivExpr<MT,ST,SO> >::Type
806 row(
const SMatScalarDivExpr<MT,ST,SO>& dm,
size_t index )
810 return row( dm.leftOperand(), index ) / dm.rightOperand();
828 template<
typename MT
831 inline typename ColumnExprTrait< SMatScalarDivExpr<MT,ST,SO> >::Type
832 column(
const SMatScalarDivExpr<MT,ST,SO>& dm,
size_t index )
836 return column( dm.leftOperand(), index ) / dm.rightOperand();
852 template<
typename MT,
typename ST1,
typename ST2 >
853 struct SMatScalarMultExprTrait< SMatScalarDivExpr<MT,ST1,false>, ST2 >
857 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
861 typedef typename SMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
862 typedef SMatScalarMultExpr< SMatScalarDivExpr<MT,ST1,false>, ST2,
false > T2;
867 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
868 IsNumeric<ST1>::value && IsNumeric<ST2>::value
869 ,
typename SelectType<condition,T1,T2>::Type
870 , INVALID_TYPE >::Type Type;
887 template<
typename MT,
typename ST1,
typename ST2 >
888 struct TSMatScalarMultExprTrait< SMatScalarDivExpr<MT,ST1,true>, ST2 >
892 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
896 typedef typename SMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
897 typedef SMatScalarMultExpr< SMatScalarDivExpr<MT,ST1,true>, ST2,
true > T2;
902 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
903 IsNumeric<ST1>::value && IsNumeric<ST2>::value
904 ,
typename SelectType<condition,T1,T2>::Type
905 , INVALID_TYPE >::Type Type;
922 template<
typename MT,
typename ST,
bool SO >
923 struct RowExprTrait< SMatScalarDivExpr<MT,ST,SO> >
927 typedef typename DivExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
944 template<
typename MT,
typename ST,
bool SO >
945 struct ColumnExprTrait< SMatScalarDivExpr<MT,ST,SO> >
949 typedef typename DivExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;