52#ifndef DOXYGEN_SHOULD_SKIP_THIS
55# define GUM_OPERATOR_PATTERN_ALLOWED 1
66# define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimArrays
67# define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
69# undef GUM_MULTI_DIM_OPERATOR_NAME
70# undef GUM_MULTI_DIM_OPERATOR
72# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME add2MultiDimArrays
73# define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
75# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
76# undef GUM_MULTI_DIM_OPERATOR
78# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME add2MultiDimArrays4Pointers
79# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y))
81# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
82# undef GUM_MULTI_DIM_OPERATOR
84# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME add2MultiDimArrays4Pointers
85# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y))
87# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
88# undef GUM_MULTI_DIM_OPERATOR
92# define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimArrays
93# define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
95# undef GUM_MULTI_DIM_OPERATOR_NAME
96# undef GUM_MULTI_DIM_OPERATOR
98# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME subtract2MultiDimArrays
99# define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
101# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
102# undef GUM_MULTI_DIM_OPERATOR
104# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME subtract2MultiDimArrays4Pointers
105# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y))
107# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
108# undef GUM_MULTI_DIM_OPERATOR
110# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME subtract2MultiDimArrays4Pointers
111# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y))
113# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
114# undef GUM_MULTI_DIM_OPERATOR
118# define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimArrays
119# define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
121# undef GUM_MULTI_DIM_OPERATOR_NAME
122# undef GUM_MULTI_DIM_OPERATOR
124# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME multiply2MultiDimArrays
125# define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
127# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
128# undef GUM_MULTI_DIM_OPERATOR
130# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME multiply2MultiDimArrays4Pointers
131# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y))
133# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
134# undef GUM_MULTI_DIM_OPERATOR
136# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME multiply2MultiDimArrays4Pointers
137# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y))
139# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
140# undef GUM_MULTI_DIM_OPERATOR
144# define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimArrays
145# define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
147# undef GUM_MULTI_DIM_OPERATOR_NAME
148# undef GUM_MULTI_DIM_OPERATOR
150# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME divide2MultiDimArrays
151# define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
153# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
154# undef GUM_MULTI_DIM_OPERATOR
156# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME divide2MultiDimArrays4Pointers
157# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y))
159# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
160# undef GUM_MULTI_DIM_OPERATOR
162# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME divide2MultiDimArrays4Pointers
163# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y))
165# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
166# undef GUM_MULTI_DIM_OPERATOR
176# define GUM_MULTI_DIM_OPERATOR std::plus
178# define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimFunctionGraphs
180# undef GUM_MULTI_DIM_OPERATOR_NAME
182# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME add2MultiDimFunctionGraphs
184# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
186# undef GUM_MULTI_DIM_OPERATOR
192# define GUM_MULTI_DIM_OPERATOR std::minus
194# define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimFunctionGraphs
196# undef GUM_MULTI_DIM_OPERATOR_NAME
198# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME subtract2MultiDimFunctionGraphs
200# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
202# undef GUM_MULTI_DIM_OPERATOR
208# define GUM_MULTI_DIM_OPERATOR std::multiplies
210# define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimFunctionGraphs
212# undef GUM_MULTI_DIM_OPERATOR_NAME
214# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME multiply2MultiDimFunctionGraphs
216# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
218# undef GUM_MULTI_DIM_OPERATOR
224# define GUM_MULTI_DIM_OPERATOR std::divides
226# define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimFunctionGraphs
228# undef GUM_MULTI_DIM_OPERATOR_NAME
230# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME divide2MultiDimFunctionGraphs
232# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
234# undef GUM_MULTI_DIM_OPERATOR
240# define GUM_MULTI_DIM_OPERATOR Maximizes
242# define GUM_MULTI_DIM_OPERATOR_NAME maximize2MultiDimFunctionGraphs
244# undef GUM_MULTI_DIM_OPERATOR_NAME
246# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME maximize2MultiDimFunctionGraphs
248# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
250# undef GUM_MULTI_DIM_OPERATOR
256# define GUM_MULTI_DIM_OPERATOR Minimizes
258# define GUM_MULTI_DIM_OPERATOR_NAME minimize2MultiDimFunctionGraphs
260# undef GUM_MULTI_DIM_OPERATOR_NAME
262# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME minimize2MultiDimFunctionGraphs
264# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
266# undef GUM_MULTI_DIM_OPERATOR
270# define GUM_MULTI_DIM_OPERATOR_NAME_F combine2MultiDimArrays
271# define GUM_MULTI_DIM_OPERATOR(x, y) f((x), (y))
273# undef GUM_MULTI_DIM_OPERATOR_NAME_F
274# undef GUM_MULTI_DIM_OPERATOR
280# define GUM_MULTI_DIM_OPERATOR_NAME operator+
281# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "+"
282# define GUM_MULTI_DIM_SYMMETRIC_OPERATOR
284# undef GUM_MULTI_DIM_OPERATOR_NAME
285# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
286# undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR
289# define GUM_MULTI_DIM_OPERATOR_NAME operator*
290# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "*"
291# define GUM_MULTI_DIM_SYMMETRIC_OPERATOR
293# undef GUM_MULTI_DIM_OPERATOR_NAME
294# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
295# undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR
298# define GUM_MULTI_DIM_OPERATOR_NAME operator-
299# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "-"
301# undef GUM_MULTI_DIM_OPERATOR_NAME
302# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
305# define GUM_MULTI_DIM_OPERATOR_NAME operator/
306# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "/"
308# undef GUM_MULTI_DIM_OPERATOR_NAME
309# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
313# define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimImplementations
314# define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
316# undef GUM_MULTI_DIM_OPERATOR_NAME
317# undef GUM_MULTI_DIM_OPERATOR
319# define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimImplementations
320# define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
322# undef GUM_MULTI_DIM_OPERATOR_NAME
323# undef GUM_MULTI_DIM_OPERATOR
325# define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimImplementations
326# define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
328# undef GUM_MULTI_DIM_OPERATOR_NAME
329# undef GUM_MULTI_DIM_OPERATOR
331# define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimImplementations
332# define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
334# undef GUM_MULTI_DIM_OPERATOR_NAME
335# undef GUM_MULTI_DIM_OPERATOR
344 template <
typename GUM_ELEMENT >
347 static std::once_flag first;
348 std::call_once(first, []() {
349 std::string MultiDimArrayString(
"MultiDimArray");
350 std::string MultiDimFunctionGraphString(
"MultiDimFunctionGraph");
351 std::string BaseNameString(
"MultiDimImplementation");
373 MultiDimFunctionGraphString,
374 MultiDimFunctionGraphString,
377 MultiDimFunctionGraphString,
378 MultiDimFunctionGraphString,
381 MultiDimFunctionGraphString,
382 MultiDimFunctionGraphString,
385 MultiDimFunctionGraphString,
386 MultiDimFunctionGraphString,
393 &add2MultiDimImplementations);
397 &subtract2MultiDimImplementations);
401 &multiply2MultiDimImplementations);
405 ÷2MultiDimImplementations);
410 template <
typename GUM_ELEMENT >
413 static std::once_flag first;
414 std::call_once(first, []() {
415 std::string MultiDimArrayString(
"MultiDimArray");
416 std::string BaseNameString(
"MultiDimImplementation");
438 template <
typename GUM_ELEMENT >
443 template <
typename GUM_ELEMENT >
451# undef GUM_OPERATOR_PATTERN_ALLOWED
void operators4MultiDimInit()
the function used to register all the operators on multidimImplementations over non-pointers types.
MultiDimArray< T * > * multiply2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for multiplying two multiDimArrays
MultiDimArray< T > * subtract2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for subtracting two multiDimArrays
MultiDimArray< T > * divide2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for dividing two multiDimArrays
void pointerOperators4MultiDimInit()
the function used to register all the operators on multidimImplementations over pointers types.
MultiDimFunctionGraph< T > * divide2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for dividing two multiDimArrays
MultiDimArray< T * > * divide2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for dividing two multiDimArrays
MultiDimArray< T > * add2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for summing two multiDimArrays
MultiDimArray< T * > * subtract2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for subtracting two multiDimArrays
MultiDimFunctionGraph< T > * multiply2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for multiplying two multiDimArrays
MultiDimFunctionGraph< T > * subtract2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for subtracting two multiDimArrays
MultiDimArray< T * > * add2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for summing two multiDimArrays
MultiDimArray< T > * multiply2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for multiplying two multiDimArrays
MultiDimFunctionGraph< T > * add2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for summing two multiDimArrays
gum is the global namespace for all aGrUM entities
void registerOperator(std::string_view operation_name, std::string_view type1, std::string_view type2, typename OperatorRegister4MultiDim< GUM_ELEMENT >::OperatorPtr function)
A function to more easily register new operators in MultiDims.
the pattern used by all "basename" binary operators
the pattern used by all binary MultiDimArrays operators
the pattern used by all binary MultiDimFunctionGraphs operators
the pattern used by all binary MultiDimImplementations operators
A container for registering binary functions on multiDimImplementations.
Efficient functionals for combining multiDims.