VCTR
Loading...
Searching...
No Matches
NormalizeSum.h
1/*
2 ==============================================================================
3 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
5 Copyright 2023 by sonible GmbH.
6
7 This file is part of VCTR - Versatile Container Templates Reconceptualized.
8
9 VCTR is free software: you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License version 3
11 only, as published by the Free Software Foundation.
12
13 VCTR is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU Lesser General Public License version 3 for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 version 3 along with VCTR. If not, see <https://www.gnu.org/licenses/>.
20 ==============================================================================
21*/
22
23namespace vctr::expressions
24{
25
26template <size_t extent, class SrcType>
27requires is::realFloatNumber<ValueType<SrcType>>
29{
30public:
31 using value_type = ValueType<SrcType>;
32
33 VCTR_COMMON_UNARY_EXPRESSION_MEMBERS (NormalizeSum, src)
34
35 void applyRuntimeArgs()
36 {
37 srcSum = sum << src;
38 }
39
40 VCTR_FORCEDINLINE constexpr value_type operator[] (size_t i) const
41 {
42 VCTR_ASSERT (srcSum != value_type (0));
43 VCTR_START_IGNORE_WARNING_MSVC (4723) // potential divide by 0
44 return src[i] / srcSum;
45 VCTR_END_IGNORE_WARNING_MSVC
46 }
47
48 //==============================================================================
49 // Platform Vector Operation Implementation
50 VCTR_FORCEDINLINE const value_type* evalNextVectorOpInExpressionChain (value_type* dst) const
52 {
53 VCTR_ASSERT (srcSum != value_type (0));
54 Expression::Accelerate::div (src.evalNextVectorOpInExpressionChain (dst), srcSum, dst, size());
55 return dst;
56 }
57
58 VCTR_FORCEDINLINE const value_type* evalNextVectorOpInExpressionChain (value_type* dst) const
60 {
61 VCTR_ASSERT (srcSum != value_type (0));
62 Expression::IPP::div (src.evalNextVectorOpInExpressionChain (dst), srcSum, dst, size());
63 return dst;
64 }
65
66private:
67 //==============================================================================
68 value_type srcSum = value_type (0);
69};
70
71}
72
73namespace vctr
74{
75
90}
Definition: NormalizeSum.h:29
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 Intel IPP is a suitable option for a real valued floating point vector...
Definition: ContainerAndExpressionConcepts.h:266
constexpr ExpressionChainBuilder< expressions::NormalizeSum > normalizeSum
Computes the sum of the source elements and divides all source elements by that sum.
Definition: NormalizeSum.h:89
constexpr ExpressionChainBuilder< expressions::Sum > sum
Computes the sum of the source values.
Definition: Sum.h:116
The main namespace of the VCTR project.
Definition: Array.h:24
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
An expression chain builder is an object which supplies various operator<< overloads which build chai...
Definition: ExpressionChainBuilder.h:136
The base class to every expression template.
Definition: ExpressionTemplate.h:37