50#ifndef DOXYGEN_SHOULD_SKIP_THIS
53# define GUM_OPERATOR_PATTERN_ALLOWED 1
64# define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimArrays
65# define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
67# undef GUM_MULTI_DIM_OPERATOR_NAME
68# undef GUM_MULTI_DIM_OPERATOR
70# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME add2MultiDimArrays
71# define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
73# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
74# undef GUM_MULTI_DIM_OPERATOR
76# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME add2MultiDimArrays4Pointers
77# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y))
79# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
80# undef GUM_MULTI_DIM_OPERATOR
82# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME add2MultiDimArrays4Pointers
83# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y))
85# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
86# undef GUM_MULTI_DIM_OPERATOR
90# define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimArrays
91# define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
93# undef GUM_MULTI_DIM_OPERATOR_NAME
94# undef GUM_MULTI_DIM_OPERATOR
96# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME subtract2MultiDimArrays
97# define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
99# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
100# undef GUM_MULTI_DIM_OPERATOR
102# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME subtract2MultiDimArrays4Pointers
103# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y))
105# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
106# undef GUM_MULTI_DIM_OPERATOR
108# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME subtract2MultiDimArrays4Pointers
109# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y))
111# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
112# undef GUM_MULTI_DIM_OPERATOR
116# define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimArrays
117# define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
119# undef GUM_MULTI_DIM_OPERATOR_NAME
120# undef GUM_MULTI_DIM_OPERATOR
122# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME multiply2MultiDimArrays
123# define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
125# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
126# undef GUM_MULTI_DIM_OPERATOR
128# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME multiply2MultiDimArrays4Pointers
129# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y))
131# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
132# undef GUM_MULTI_DIM_OPERATOR
134# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME multiply2MultiDimArrays4Pointers
135# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y))
137# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
138# undef GUM_MULTI_DIM_OPERATOR
142# define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimArrays
143# define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
145# undef GUM_MULTI_DIM_OPERATOR_NAME
146# undef GUM_MULTI_DIM_OPERATOR
148# define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME divide2MultiDimArrays
149# define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
151# undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
152# undef GUM_MULTI_DIM_OPERATOR
154# define GUM_MULTI_DIM_OPERATOR_POINTER_NAME divide2MultiDimArrays4Pointers
155# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y))
157# undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
158# undef GUM_MULTI_DIM_OPERATOR
160# define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME divide2MultiDimArrays4Pointers
161# define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y))
163# undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
164# undef GUM_MULTI_DIM_OPERATOR
174# define GUM_MULTI_DIM_OPERATOR std::plus
176# define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimFunctionGraphs
178# undef GUM_MULTI_DIM_OPERATOR_NAME
180# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME add2MultiDimFunctionGraphs
182# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
184# undef GUM_MULTI_DIM_OPERATOR
190# define GUM_MULTI_DIM_OPERATOR std::minus
192# define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimFunctionGraphs
194# undef GUM_MULTI_DIM_OPERATOR_NAME
196# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME subtract2MultiDimFunctionGraphs
198# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
200# undef GUM_MULTI_DIM_OPERATOR
206# define GUM_MULTI_DIM_OPERATOR std::multiplies
208# define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimFunctionGraphs
210# undef GUM_MULTI_DIM_OPERATOR_NAME
212# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME multiply2MultiDimFunctionGraphs
214# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
216# undef GUM_MULTI_DIM_OPERATOR
222# define GUM_MULTI_DIM_OPERATOR std::divides
224# define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimFunctionGraphs
226# undef GUM_MULTI_DIM_OPERATOR_NAME
228# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME divide2MultiDimFunctionGraphs
230# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
232# undef GUM_MULTI_DIM_OPERATOR
238# define GUM_MULTI_DIM_OPERATOR Maximizes
240# define GUM_MULTI_DIM_OPERATOR_NAME maximize2MultiDimFunctionGraphs
242# undef GUM_MULTI_DIM_OPERATOR_NAME
244# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME maximize2MultiDimFunctionGraphs
246# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
248# undef GUM_MULTI_DIM_OPERATOR
254# define GUM_MULTI_DIM_OPERATOR Minimizes
256# define GUM_MULTI_DIM_OPERATOR_NAME minimize2MultiDimFunctionGraphs
258# undef GUM_MULTI_DIM_OPERATOR_NAME
260# define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME minimize2MultiDimFunctionGraphs
262# undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
264# undef GUM_MULTI_DIM_OPERATOR
268# define GUM_MULTI_DIM_OPERATOR_NAME_F combine2MultiDimArrays
269# define GUM_MULTI_DIM_OPERATOR(x, y) f((x), (y))
271# undef GUM_MULTI_DIM_OPERATOR_NAME_F
272# undef GUM_MULTI_DIM_OPERATOR
278# define GUM_MULTI_DIM_OPERATOR_NAME operator+
279# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "+"
280# define GUM_MULTI_DIM_SYMMETRIC_OPERATOR
282# undef GUM_MULTI_DIM_OPERATOR_NAME
283# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
284# undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR
287# define GUM_MULTI_DIM_OPERATOR_NAME operator*
288# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "*"
289# define GUM_MULTI_DIM_SYMMETRIC_OPERATOR
291# undef GUM_MULTI_DIM_OPERATOR_NAME
292# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
293# undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR
296# define GUM_MULTI_DIM_OPERATOR_NAME operator-
297# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "-"
299# undef GUM_MULTI_DIM_OPERATOR_NAME
300# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
303# define GUM_MULTI_DIM_OPERATOR_NAME operator/
304# define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "/"
306# undef GUM_MULTI_DIM_OPERATOR_NAME
307# undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
311# define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimImplementations
312# define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
314# undef GUM_MULTI_DIM_OPERATOR_NAME
315# undef GUM_MULTI_DIM_OPERATOR
317# define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimImplementations
318# define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
320# undef GUM_MULTI_DIM_OPERATOR_NAME
321# undef GUM_MULTI_DIM_OPERATOR
323# define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimImplementations
324# define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
326# undef GUM_MULTI_DIM_OPERATOR_NAME
327# undef GUM_MULTI_DIM_OPERATOR
329# define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimImplementations
330# define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
332# undef GUM_MULTI_DIM_OPERATOR_NAME
333# undef GUM_MULTI_DIM_OPERATOR
342 template <
typename GUM_SCALAR >
345 static std::once_flag first;
346 std::call_once(first, []() {
347 std::string MultiDimArrayString(
"MultiDimArray");
348 std::string MultiDimFunctionGraphString(
"MultiDimFunctionGraph");
349 std::string BaseNameString(
"MultiDimImplementation");
371 MultiDimFunctionGraphString,
372 MultiDimFunctionGraphString,
375 MultiDimFunctionGraphString,
376 MultiDimFunctionGraphString,
379 MultiDimFunctionGraphString,
380 MultiDimFunctionGraphString,
383 MultiDimFunctionGraphString,
384 MultiDimFunctionGraphString,
391 &add2MultiDimImplementations);
395 &subtract2MultiDimImplementations);
399 &multiply2MultiDimImplementations);
403 ÷2MultiDimImplementations);
408 template <
typename GUM_SCALAR >
411 static std::once_flag first;
412 std::call_once(first, []() {
413 std::string MultiDimArrayString(
"MultiDimArray");
414 std::string BaseNameString(
"MultiDimImplementation");
439# 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(const std::string &operation_name, const std::string &type1, const std::string &type2, typename OperatorRegister4MultiDim< GUM_SCALAR >::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.