54#ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED
65# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME
66# define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR
68 template <
typename GUM_SCALAR >
76#ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME
77#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR *
78#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
79 template <
typename GUM_SCALAR>
86#ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME
87#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR
88 template <
typename GUM_SCALAR>
95#ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME
96#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR *
97#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
98 template <
typename GUM_SCALAR>
108# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME
113# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME
122 Idx table_alone_offset = 0;
126 for (
const auto var: table_vars) {
127 if (inst_vars.exists(var)) table_alone_offset += inst_vars[var] * offset;
129 var1offset.insert(var, offset);
130 offset *= var->domainSize();
141 std::vector< Idx > table_and_result_offset;
142 std::vector< Idx > table_and_result_domain;
143 Idx result_domain_size = 1;
144 bool has_before_incr =
true;
145 bool found_inst_var =
false;
147 for (
const auto var: table_vars) {
148 if (!inst_vars.exists(var)) {
149 table_and_result_domain.push_back(var->domainSize());
150 table_and_result_offset.push_back(var1offset[var]);
151 result_domain_size *= var->domainSize();
152 result_varSeq << var;
154 if (found_inst_var) has_before_incr =
false;
156 found_inst_var =
true;
169 std::vector< Idx > table_and_result_value = table_and_result_domain;
170 std::vector< Idx > table_and_result_down = table_and_result_offset;
172 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
173 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
184 for (
const auto var: result_varSeq)
187 result->endMultipleChanges();
189# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
192 const GUM_SCALAR& any_element = *(table->unsafeGet(0));
194 for (
Idx i = 0; i < result_domain_size; ++i) {
195 result->unsafeSet(i,
new GUM_SCALAR(any_element));
203 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* ptable
204 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
205 &(table->unsafeGet(table_alone_offset)));
206 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult
207 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(&(result->unsafeGet(0)));
212 if (has_before_incr) {
213 for (
Idx i = 0; i < result_domain_size; ++i) {
214# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
215 **presult = **ptable;
228 Idx table_offset = 0;
230 for (
Idx j = 0; j < result_domain_size; ++j) {
231# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
232 **presult = *(ptable[table_offset]);
234 *presult = ptable[table_offset];
238 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
239 --table_and_result_value[k];
241 if (table_and_result_value[k]) {
242 table_offset += table_and_result_offset[k];
246 table_and_result_value[k] = table_and_result_domain[k];
247 table_offset -= table_and_result_down[k];
258# undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE
260# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
261# undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
The class for generic Hash Tables.
Multidimensional matrix stored as an array in memory.
<agrum/base/multidim/multiDimImplementation.h>
void beginMultipleChanges() override
Call this method before doing important changes in this MultiDimContainer.
The generic class for storing (ordered) sequences of objects.
Size Idx
Type for indexes.
gum is the global namespace for all aGrUM entities
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME
a specialized partial instantiation function for multiDimArrays
Header file of gum::Sequence, a class for storing (ordered) sequences of objects.