38static char rcsid[] not_used = {
"$Id$" };
46#include <libdap/dods-datatypes.h>
47#include <libdap/D4Attributes.h>
48#include <libdap/D4Group.h>
49#include <libdap/Error.h>
50#include <libdap/InternalErr.h>
54#include <libdap/util.h>
57FFArray::ptr_duplicate()
59 return new FFArray(*
this);
62FFArray::FFArray(
const string &n,
const string &d, BaseType *v,
const string &iff) :
63 Array(n, d, v), d_input_format_file(iff)
74long 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;
121long 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;
156static 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);
192static 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_length(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.data(), stride.data(), edge.data(), dname.data(), &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.data(), edge.data(), stride.data(), dname.data());
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() +
".");
310bool 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.data(), 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());