16 #ifndef MATHTOOLS_SQR_EUCLIDEAN_NORM_H
17 #define MATHTOOLS_SQR_EUCLIDEAN_NORM_H
24 template<
typename COORD_ITERATOR>
25 auto SqrEuclideanFunc_value(COORD_ITERATOR begin, COORD_ITERATOR end) -> decltype(typeHelper(*begin))
27 decltype(typeHelper(*begin)) result = 0;
28 while (begin != end) {
29 result += (*begin) * (*begin);
35 template<std::
size_t N,
typename COORD_TYPE>
36 struct SqrEuclideanFuncArity
38 static typename NumTraits<COORD_TYPE>::Real value(
const COORD_TYPE* coordPtr)
40 const COORD_TYPE& coord = *(coordPtr + N - 1);
41 return SqrEuclideanFuncArity<N - 1, COORD_TYPE>::value(coordPtr) + coord*coord;
45 template<
typename COORD_TYPE>
46 struct SqrEuclideanFuncArity<1, COORD_TYPE>
48 static typename NumTraits<COORD_TYPE>::Real value(
const COORD_TYPE* coordPtr)
49 {
return (*coordPtr) * (*coordPtr); }
52 struct SqrEuclideanFunc
54 template<
typename COORD_ITERATOR>
55 static auto fromRange(COORD_ITERATOR begin, COORD_ITERATOR end) -> decltype(typeHelper(*begin))
56 {
return SqrEuclideanFunc_value(begin, end); }
58 template<std::
size_t N,
typename COORD_TYPE>
59 static typename NumTraits<COORD_TYPE>::Real fromPtr(
const COORD_TYPE* coordPtr)
60 {
return SqrEuclideanFuncArity<N, COORD_TYPE>::value(coordPtr); }
63 template<>
struct NormTraits<internal::SqrEuclideanFunc>
65 typedef ArityNormSpecializationTag NormCategory;
79 #endif // MATHTOOLS_NORMS_SQR_EUCLIDEAN_H
Computation of norms in K-vector space.
Definition: norm.h:60
Norm< internal::SqrEuclideanFunc > SqrEuclideanNorm
Provides computation of the squared euclidean norm.
Definition: sqr_euclidean_norm.h:75