53#ifndef DOXYGEN_SHOULD_SKIP_THIS
56# define GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED 1
62# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimArray
63# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
65# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
67# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
68# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
69# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
71# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
72# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
74# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
76# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
77# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
78# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
80# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
81# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
82 if (*(y) > *(x)) *(x) = *(y)
83# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
85# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
86# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
87# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
89# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMaxMultiDimArray4Pointers
90# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
91 if (*(y) > *(x)) *(x) = *(y)
92# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
94# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
95# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
96# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
100# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimArray
101# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
103# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
105# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
106# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
107# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
109# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
110# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
112# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
114# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
115# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
116# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
118# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
119# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
120 if (*(x) > *(y)) *(x) = *(y)
121# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
123# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
124# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
125# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
127# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMinMultiDimArray4Pointers
128# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
129 if (*(x) > *(y)) *(x) = *(y)
130# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
132# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
133# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
134# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
138# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimArray
139# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
140# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
142# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
143# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
144# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
146# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
147# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
148# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
150# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
151# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
152# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
154# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
155# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
156# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
158# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
159# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
160# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
162# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectSumMultiDimArray4Pointers
163# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
164# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
166# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
167# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
168# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
172# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimArray
173# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
174# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
176# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
177# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
178# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
180# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
181# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
182# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
184# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
185# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
186# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
188# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectProductMultiDimArray4Pointers
189# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
190# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
192# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
193# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
194# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
196# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
197 projectProductMultiDimArray4Pointers
198# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
199# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
201# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
202# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
203# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
209# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMax
210# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "max"
212# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
213# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
216# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMin
217# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "min"
219# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
220# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
223# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSum
224# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "sum"
226# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
227# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
230# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProduct
231# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "product"
233# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
234# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
238# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimImplementation
239# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
241# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
243# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
244# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
245# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
247# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimImplementation
248# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
250# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
252# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
253# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
254# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
256# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimImplementation
257# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
258# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
260# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
261# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
262# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
264# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimImplementation
265# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x *= y
266# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
268# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
269# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
270# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
279 template <
typename GUM_ELEMENT >
282 static std::once_flag first;
283 std::call_once(first, []() {
284 std::string MultiDimArrayString(
"MultiDimArray");
285 std::string BaseNameString(
"MultiDimImplementation");
304 &projectMaxMultiDimImplementation);
307 &projectMinMultiDimImplementation);
310 &projectSumMultiDimImplementation);
313 &projectProductMultiDimImplementation);
318 template <
typename GUM_ELEMENT >
321 static std::once_flag first;
322 std::call_once(first, []() {
323 std::string MultiDimArrayString(
"MultiDimArray");
324 std::string BaseNameString(
"MultiDimImplementation");
342 template <
typename GUM_ELEMENT >
347 template <
typename GUM_ELEMENT >
355# undef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
the pattern used by all the "basename" projections of multidim tables over all their variables
the pattern used by all the projections of multidim tables over all their variables
the pattern used by all the MultiDimImplementation projections
A container for registering complete projection functions on multiDimImplementations,...
Efficient functionals for projecting multidim tables over all their variables.
GUM_ELEMENT projectMaxMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
void registerCompleteProjection(std::string_view projection_name, std::string_view type_multidim, typename CompleteProjectionRegister4MultiDim< GUM_ELEMENT >::CompleteProjectionPtr function)
A function to more easily register new projection functions in MultiDims.
void pointerCompleteProjections4MultiDimInit()
The function used to register all the complete projections on multidimImplementations over pointers t...
GUM_ELEMENT * projectSumMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operator
GUM_ELEMENT * projectMaxMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
GUM_ELEMENT projectMinMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
void completeProjections4MultiDimInit()
the function used to register all the complete projection operators on multidimImplementations over n...
GUM_ELEMENT * projectMinMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
GUM_ELEMENT * projectProductMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operator
GUM_ELEMENT projectProductMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operator
GUM_ELEMENT projectSumMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operator
gum is the global namespace for all aGrUM entities