23 #ifndef COM_DAFER45_TBTK_ARRAY_MANAGER 24 #define COM_DAFER45_TBTK_ARRAY_MANAGER 57 static void print(
void * array,
const Index &ranges);
60 static void createRecursive(
Index ranges,
void **result);
63 static void createRecursive(
Index ranges,
void **result, T fill);
66 static void destroyRecursive(
void *array,
Index ranges);
69 static void flattenRecursive(
void *array,
Index ranges, T *result,
int offset);
72 static void unflattenRecursive(T *array,
Index ranges,
void **result,
int offset);
75 static void printRecursive(
void *array,
Index ranges);
82 createRecursive(ranges, &result);
89 if(ranges.
size() == 1){
90 *((T**)result) =
new T[ranges.
at(0)];
93 *((
void**)result) =
new void*[ranges.
at(0)];
95 int currentRange = ranges.
at(0);
98 for(
int n = 0; n < currentRange; n++)
99 createRecursive(ranges, &(((
void**)(*result))[n]));
107 createRecursive(ranges, &result, fill);
114 if(ranges.
size() == 1){
115 *((T**)result) =
new T[ranges.
at(0)];
116 for(
int n = 0; n < ranges.
at(0); n++)
117 (*((T**)result))[n] = fill;
120 *((
void**)result) =
new void*[ranges.
at(0)];
122 int currentRange = ranges.
at(0);
125 for(
int n = 0; n < currentRange; n++)
126 createRecursive(ranges, &(((
void**)(*result))[n]), fill);
132 destroyRecursive(array, ranges);
137 if(ranges.
size() == 1){
141 int currentRange = ranges.
at(0);
144 for(
int n = 0; n < currentRange; n++)
145 destroyRecursive(((
void**)array)[n], ranges);
147 delete [] (
void**)array;
154 for(
unsigned int n = 0; n < ranges.
size(); n++)
155 size *= ranges.
at(n);
157 T *result =
new T[size];
159 flattenRecursive(array, ranges, result, 0);
166 if(ranges.
size() == 1){
167 for(
int n = 0; n < ranges.
at(0); n++){
168 result[offset + n] = ((T*)array)[n];
172 int offsetMultiplier = 1;
173 for(
unsigned int n = 1; n < ranges.
size(); n++)
174 offsetMultiplier *= ranges.
at(n);
176 int currentRange = ranges.
at(0);
179 for(
int n = 0; n < currentRange; n++)
180 flattenRecursive(((
void**)array)[n], ranges, result, offset + offsetMultiplier*n);
188 unflattenRecursive(array, ranges, &result, 0);
190 return (
void*)result;
195 if(ranges.
size() == 1){
196 *((T**)result) =
new T[ranges.
at(0)];
197 for(
int n = 0; n < ranges.
at(0); n++)
198 (*((T**)result))[n] = array[offset + n];
201 *((
void**)result) =
new void*[ranges.
at(0)];
203 int offsetMultiplier = 1;
204 for(
int n = 1; n < ranges.
size(); n++)
205 offsetMultiplier *= ranges.
at(n);
207 int currentRange = ranges.
at(0);
210 for(
int n = 0; n < currentRange; n++)
211 unflattenRecursive(array, ranges, &(((
void**)(*result))[n]), offset + offsetMultiplier*n);
217 printRecursive(array, ranges);
222 if(ranges.
size() == 1){
223 for(
int n = 0; n < ranges.
at(0); n++)
228 int currentRange = ranges.
at(0);
230 for(
int n = 0; n < currentRange; n++)
231 printRecursive(((
void**)array)[n], ranges);
Data structure for flexible physical indices.
static void * unflatten(T *array, const Index &ranges)
Definition: ArrayManager.h:185
unsigned int size() const
Definition: Index.h:164
static T * flatten(void *array, const Index &ranges)
Definition: ArrayManager.h:152
static void print(void *array, const Index &ranges)
Definition: ArrayManager.h:216
static void * create(const Index &ranges)
Definition: ArrayManager.h:79
static std::ostream out
Definition: Streams.h:37
int popFront()
Definition: Index.h:172
Definition: AbstractOperator.h:26
static void destroy(void *array, const Index &ranges)
Definition: ArrayManager.h:131
Definition: ArrayManager.h:39
int & at(unsigned int n)
Definition: Index.h:156