23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
34 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
DivideVectors, srcA, srcB)
36 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
38 return srcA[i] / srcB[i];
41 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
44 Expression::Accelerate::div (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
48 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
51 Expression::IPP::div (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
60 return Expression::AVX::div (srcA.getAVX (i), srcB.getAVX (i));
68 return Expression::SSE::div (srcA.getSSE (i), srcB.getSSE (i));
74template <
size_t extent,
class SrcType>
82 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
84 return single / src[i];
87 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
90 Expression::IPP::div (single, src.evalNextVectorOpInExpressionChain (dst), dst,
sizeToInt (size()));
97 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
99 return Expression::AVX::div (Expression::AVX::fromSSE (singleAsSSE, singleAsSSE), src.getAVX (i));
105 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
107 return Expression::SSE::div (singleAsSSE, src.getSSE (i));
113template <
size_t extent,
class SrcType>
119 VCTR_COMMON_BINARY_SINGLE_VEC_EXPRESSION_MEMBERS (
DivideVecBySingle, src, single)
121 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
123 return src[i] / single;
126 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
129 Expression::Accelerate::div (src.evalNextVectorOpInExpressionChain (dst), single, dst, size());
133 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
136 Expression::IPP::div (src.evalNextVectorOpInExpressionChain (dst), single, dst, size());
143 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
145 return Expression::AVX::div (src.getAVX (i), Expression::AVX::fromSSE (singleAsSSE, singleAsSSE));
151 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
153 return Expression::SSE::div (src.getSSE (i), singleAsSSE);
166template <
class SrcAType,
class SrcBType>
169constexpr auto operator/ (SrcAType&& a, SrcBType&& b)
172 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
182requires is::anyVctrOrExpression<Src>
183constexpr auto operator/ (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
193requires is::anyVctrOrExpression<Src>
194constexpr auto operator/ (Src&& vec,
typename std::remove_cvref_t<Src>::value_type single)
Divides a single value by a vector.
Definition: Divide.h:76
Divides a vector like type by a single value.
Definition: Divide.h:115
Divides two vector like types.
Definition: Divide.h:30
Constrains a type to have a member function getAVX (size_t) const.
Definition: ContainerAndExpressionConcepts.h:78
Constrains a type to have a member function getSSE (size_t) const.
Definition: ContainerAndExpressionConcepts.h:82
Constrains a type to either be an expression template or any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:212
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:242
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:311
A combined concept to check if Intel IPP is a suitable option for a real valued floating point vector...
Definition: ContainerAndExpressionConcepts.h:266
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:324
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:278
constexpr auto operator/(SrcAType &&a, SrcBType &&b)
Returns an expression that divides vector or expression a by vector or expression b.
Definition: Divide.h:169
The main namespace of the VCTR project.
Definition: Array.h:24
constexpr void assertCommonSize(const A &a, const B &b)
Ensures that both sources have the same size.
Definition: Traits.h:253
typename detail::ValueType< std::remove_cvref_t< T > >::Type ValueType
If T is an expression template, it equals its return type, if it's a type that defines value_type as ...
Definition: Traits.h:201
int sizeToInt(size_t size)
Casts the size_t argument to an int.
Definition: PlatformVectorOpsHelpers.h:27
Definition: AVXRegister.h:28
The base class to every expression template.
Definition: ExpressionTemplate.h:37
Definition: SSERegister.h:28