27 #ifndef DOXYGEN_SHOULD_SKIP_THIS 30 # define GUM_OPERATOR_PATTERN_ALLOWED 1 41 # define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimArrays 42 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y) 44 # undef GUM_MULTI_DIM_OPERATOR_NAME 45 # undef GUM_MULTI_DIM_OPERATOR 47 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME add2MultiDimArrays 48 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y) 50 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME 51 # undef GUM_MULTI_DIM_OPERATOR 53 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME add2MultiDimArrays4Pointers 54 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y)) 56 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME 57 # undef GUM_MULTI_DIM_OPERATOR 59 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \ 60 add2MultiDimArrays4Pointers 61 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y)) 63 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME 64 # undef GUM_MULTI_DIM_OPERATOR 68 # define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimArrays 69 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y) 71 # undef GUM_MULTI_DIM_OPERATOR_NAME 72 # undef GUM_MULTI_DIM_OPERATOR 74 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME subtract2MultiDimArrays 75 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y) 77 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME 78 # undef GUM_MULTI_DIM_OPERATOR 80 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME subtract2MultiDimArrays4Pointers 81 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y)) 83 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME 84 # undef GUM_MULTI_DIM_OPERATOR 86 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \ 87 subtract2MultiDimArrays4Pointers 88 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y)) 90 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME 91 # undef GUM_MULTI_DIM_OPERATOR 95 # define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimArrays 96 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y) 98 # undef GUM_MULTI_DIM_OPERATOR_NAME 99 # undef GUM_MULTI_DIM_OPERATOR 101 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME multiply2MultiDimArrays 102 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y) 104 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME 105 # undef GUM_MULTI_DIM_OPERATOR 107 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME multiply2MultiDimArrays4Pointers 108 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y)) 110 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME 111 # undef GUM_MULTI_DIM_OPERATOR 113 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \ 114 multiply2MultiDimArrays4Pointers 115 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y)) 117 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME 118 # undef GUM_MULTI_DIM_OPERATOR 122 # define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimArrays 123 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y) 125 # undef GUM_MULTI_DIM_OPERATOR_NAME 126 # undef GUM_MULTI_DIM_OPERATOR 128 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME divide2MultiDimArrays 129 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y) 131 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME 132 # undef GUM_MULTI_DIM_OPERATOR 134 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME divide2MultiDimArrays4Pointers 135 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y)) 137 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME 138 # undef GUM_MULTI_DIM_OPERATOR 140 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \ 141 divide2MultiDimArrays4Pointers 142 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y)) 144 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME 145 # undef GUM_MULTI_DIM_OPERATOR 155 # define GUM_MULTI_DIM_OPERATOR std::plus 157 # define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimFunctionGraphs 159 # undef GUM_MULTI_DIM_OPERATOR_NAME 161 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \ 162 add2MultiDimFunctionGraphs 164 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME 166 # undef GUM_MULTI_DIM_OPERATOR 172 # define GUM_MULTI_DIM_OPERATOR std::minus 174 # define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimFunctionGraphs 176 # undef GUM_MULTI_DIM_OPERATOR_NAME 178 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \ 179 subtract2MultiDimFunctionGraphs 181 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME 183 # undef GUM_MULTI_DIM_OPERATOR 189 # define GUM_MULTI_DIM_OPERATOR std::multiplies 191 # define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimFunctionGraphs 193 # undef GUM_MULTI_DIM_OPERATOR_NAME 195 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \ 196 multiply2MultiDimFunctionGraphs 198 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME 200 # undef GUM_MULTI_DIM_OPERATOR 206 # define GUM_MULTI_DIM_OPERATOR std::divides 208 # define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimFunctionGraphs 210 # undef GUM_MULTI_DIM_OPERATOR_NAME 212 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \ 213 divide2MultiDimFunctionGraphs 215 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME 217 # undef GUM_MULTI_DIM_OPERATOR 223 # define GUM_MULTI_DIM_OPERATOR Maximizes 225 # define GUM_MULTI_DIM_OPERATOR_NAME maximize2MultiDimFunctionGraphs 227 # undef GUM_MULTI_DIM_OPERATOR_NAME 229 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \ 230 maximize2MultiDimFunctionGraphs 232 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME 234 # undef GUM_MULTI_DIM_OPERATOR 240 # define GUM_MULTI_DIM_OPERATOR Minimizes 242 # define GUM_MULTI_DIM_OPERATOR_NAME minimize2MultiDimFunctionGraphs 244 # undef GUM_MULTI_DIM_OPERATOR_NAME 246 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \ 247 minimize2MultiDimFunctionGraphs 249 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME 251 # undef GUM_MULTI_DIM_OPERATOR 255 # define GUM_MULTI_DIM_OPERATOR_NAME_F combine2MultiDimArrays 256 # define GUM_MULTI_DIM_OPERATOR(x, y) f((x), (y)) 258 # undef GUM_MULTI_DIM_OPERATOR_NAME_F 259 # undef GUM_MULTI_DIM_OPERATOR 265 # define GUM_MULTI_DIM_OPERATOR_NAME operator+ 266 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "+" 267 # define GUM_MULTI_DIM_SYMMETRIC_OPERATOR 269 # undef GUM_MULTI_DIM_OPERATOR_NAME 270 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME 271 # undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR 274 # define GUM_MULTI_DIM_OPERATOR_NAME operator* 275 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "*" 276 # define GUM_MULTI_DIM_SYMMETRIC_OPERATOR 278 # undef GUM_MULTI_DIM_OPERATOR_NAME 279 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME 280 # undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR 283 # define GUM_MULTI_DIM_OPERATOR_NAME operator- 284 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "-" 286 # undef GUM_MULTI_DIM_OPERATOR_NAME 287 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME 290 # define GUM_MULTI_DIM_OPERATOR_NAME operator/ 291 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "/" 293 # undef GUM_MULTI_DIM_OPERATOR_NAME 294 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME 298 # define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimImplementations 299 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y) 301 # undef GUM_MULTI_DIM_OPERATOR_NAME 302 # undef GUM_MULTI_DIM_OPERATOR 304 # define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimImplementations 305 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y) 307 # undef GUM_MULTI_DIM_OPERATOR_NAME 308 # undef GUM_MULTI_DIM_OPERATOR 310 # define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimImplementations 311 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y) 313 # undef GUM_MULTI_DIM_OPERATOR_NAME 314 # undef GUM_MULTI_DIM_OPERATOR 316 # define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimImplementations 317 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y) 319 # undef GUM_MULTI_DIM_OPERATOR_NAME 320 # undef GUM_MULTI_DIM_OPERATOR 329 template <
typename GUM_SCALAR >
331 static bool first_init =
true;
336 std::string MultiDimArrayString(
"MultiDimArray");
337 std::string MultiDimFunctionGraphString(
"MultiDimFunctionGraph");
338 std::string BaseNameString(
"MultiDimImplementation");
341 registerOperator< GUM_SCALAR >(
343 registerOperator< GUM_SCALAR >(
345 registerOperator< GUM_SCALAR >(
347 registerOperator< GUM_SCALAR >(
351 registerOperator< GUM_SCALAR >(
"+",
352 MultiDimFunctionGraphString,
353 MultiDimFunctionGraphString,
355 registerOperator< GUM_SCALAR >(
"-",
356 MultiDimFunctionGraphString,
357 MultiDimFunctionGraphString,
359 registerOperator< GUM_SCALAR >(
"*",
360 MultiDimFunctionGraphString,
361 MultiDimFunctionGraphString,
363 registerOperator< GUM_SCALAR >(
"/",
364 MultiDimFunctionGraphString,
365 MultiDimFunctionGraphString,
369 registerOperator< GUM_SCALAR >(
370 "+", BaseNameString, BaseNameString, &add2MultiDimImplementations);
371 registerOperator< GUM_SCALAR >(
372 "-", BaseNameString, BaseNameString, &subtract2MultiDimImplementations);
373 registerOperator< GUM_SCALAR >(
374 "*", BaseNameString, BaseNameString, &multiply2MultiDimImplementations);
375 registerOperator< GUM_SCALAR >(
376 "/", BaseNameString, BaseNameString, ÷2MultiDimImplementations);
381 template <
typename GUM_SCALAR >
383 static bool first_init =
true;
388 std::string MultiDimArrayString(
"MultiDimArray");
389 std::string BaseNameString(
"MultiDimImplementation");
392 registerOperator< GUM_SCALAR* >(
"+",
396 registerOperator< GUM_SCALAR* >(
"-",
400 registerOperator< GUM_SCALAR* >(
"*",
404 registerOperator< GUM_SCALAR* >(
"/",
414 # undef GUM_OPERATOR_PATTERN_ALLOWED MultiDimArray< T > * multiply2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for multiplying two multiDimArraysThe function produces a tensorial product of...
A container for registering binary functions on multiDimImplementations.
void operators4MultiDimInit()
the function used to register all the operators on multidimImplementations over non-pointers types...
MultiDimArray< T *> * divide2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for dividing two multiDimArraysThe function produces a tensorial division of t...
the pattern used by all binary MultiDimImplementations operators
MultiDimArray< T *> * add2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for summing two multiDimArraysThe function produces a tensorial addition of t1...
MultiDimFunctionGraph< T > * subtract2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for subtracting two multiDimArraysThe function produces a tensorial subtractio...
gum is the global namespace for all aGrUM entities
the pattern used by all binary MultiDimFunctionGraphs operators
MultiDimArray< T *> * subtract2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for subtracting two multiDimArraysThe function produces a tensorial subtractio...
MultiDimArray< T *> * multiply2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for multiplying two multiDimArraysThe function produces a tensorial product of...
void pointerOperators4MultiDimInit()
the function used to register all the operators on multidimImplementations over pointers types...
MultiDimFunctionGraph< T > * multiply2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for multiplying two multiDimArraysThe function produces a tensorial product of...
MultiDimArray< T > * add2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for summing two multiDimArraysThe function produces a tensorial addition of t1...
MultiDimArray< T > * subtract2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for subtracting two multiDimArraysThe function produces a tensorial subtractio...
MultiDimFunctionGraph< T > * add2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for summing two multiDimArraysThe function produces a tensorial addition of t1...
MultiDimFunctionGraph< T > * divide2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for dividing two multiDimArraysThe function produces a tensorial division of t...
MultiDimArray< T > * divide2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for dividing two multiDimArraysThe function produces a tensorial division of t...
the pattern used by all binary MultiDimArrays operators
the pattern used by all "basename" binary operators