36 #include "config_ff.h"
38 static char rcsid[] not_used = {
"$Id$" };
46 #include <dods-datatypes.h>
47 #include <D4Attributes.h>
50 #include <InternalErr.h>
57 FFArray::ptr_duplicate()
62 FFArray::FFArray(
const string &n,
const string &d, BaseType *v,
const string &iff) :
63 Array(n, d, v), d_input_format_file(iff)
74 long FFArray::Arr_constraint(
long *cor,
long *step,
long *edg,
string *dim_nms,
bool *has_stride)
76 long start, stride, stop;
82 Array::Dim_iter i = dim_begin();
83 while (i != dim_end()) {
84 start = (long) dimension_start(i,
true);
85 stride = (long) dimension_stride(i,
true);
86 stop = (long) dimension_stop(i,
true);
87 string dimname = dimension_name(i);
90 if (start + stop + stride == 0)
99 dim_nms[id] = dimname;
104 edg[id] = ((stop - start) / stride) + 1;
121 long FFArray::Seq_constraint(
long *cor,
long *step,
long *edg,
bool *has_stride)
123 int start, stride, stop;
128 Array::Dim_iter i = dim_begin();
129 while (i != dim_end()) {
130 start = (long) dimension_start(i,
true);
131 stride = (long) dimension_stride(i,
true);
132 stop = (long) dimension_stop(i,
true);
135 if (start + stop + stride == 0)
143 edg[id] = ((stop - start) / stride) + 1;
156 static int hyper_get(
void *dest,
void *src,
unsigned szof,
const int dim_num,
int index,
const int dimsz[],
157 const long start[],
const long edge[])
170 if (dim_num != (index + 1)) {
172 for (
int i = dim_num - 1; i > index; i--)
175 for (
int edge_tmp = 0; edge_tmp < edge[index]; edge_tmp++) {
176 void *srctmp = ((
char *) src + (start[index] + edge_tmp) * jump * szof);
177 dest = (
char *) dest + hyper_get(dest, srctmp, szof, dim_num, index + 1, dimsz, start, edge);
183 void *srctmp = (
char *) src + start[index] * szof;
184 memcpy(dest, srctmp, (
size_t) edge[index] * szof);
185 return (edge[index] * szof);
192 static void seq2vects(T * t,
FFArray & array)
195 int ndim = array.dimensions();
196 long *start =
new long[ndim];
197 long *stride =
new long[ndim];
198 long *edge =
new long[ndim];
200 long count = array.Seq_constraint(start, stride, edge, &has_stride);
203 T *t_hs =
new T[count];
204 int *dimsz =
new int[array.dimensions()];
207 Array::Dim_iter p = array.dim_begin();
208 while (p != array.dim_end()) {
209 dimsz[i] = array.dimension_size(p);
214 hyper_get(t_hs, t, array.var()->width(), ndim, 0, dimsz, start, edge);
216 array.set_read_p(
true);
217 array.val2buf((
void *) t_hs);
223 array.set_read_p(
true);
224 array.val2buf((
void *) t);
250 int ndims = dimensions();
251 vector<string> dname(ndims);
252 vector<long> start(ndims);
253 vector<long> stride(ndims);
254 vector<long> edge(ndims);
255 long count = Arr_constraint(&start[0], &stride[0], &edge[0], &dname[0], &has_stride);
258 throw Error(unknown_error,
"Constraint returned an empty dataset.");
261 string output_format = makeND_output_format(name(), var()->type(), var()->width(),
262 ndims, &start[0], &edge[0], &stride[0], &dname[0]);
269 switch (var()->type()) {
271 extract_array<dods_byte>(dataset(), d_input_format_file, output_format);
275 extract_array<dods_int16>(dataset(), d_input_format_file, output_format);
279 extract_array<dods_uint16>(dataset(), d_input_format_file, output_format);
283 extract_array<dods_int32>(dataset(), d_input_format_file, output_format);
287 extract_array<dods_uint32>(dataset(), d_input_format_file, output_format);
291 extract_array<dods_float32>(dataset(), d_input_format_file, output_format);
295 extract_array<dods_float64>(dataset(), d_input_format_file, output_format);
299 throw InternalErr(__FILE__, __LINE__,
300 (
string)
"FFArray::read: Unsupported array type " + var()->type_name() +
".");
310 bool FFArray::extract_array(
const string &ds,
const string &if_fmt,
const string &o_fmt)
312 vector<T> d(length());
313 long bytes = read_ff(ds.c_str(), if_fmt.c_str(), o_fmt.c_str(), (
char *) &d[0], width());
315 BESDEBUG(
"ff",
"FFArray::extract_array: Read " << bytes <<
" bytes." << endl);
318 throw Error(unknown_error,
"Could not read values from the dataset.");
322 set_value(d, d.size());