38 static char rcsid[]
not_used = {
"$Id$" };
46 #include <dods-datatypes.h>
47 #include <D4Attributes.h>
50 #include <InternalErr.h>
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);
90 if (start + stop + stride == 0)
93 dim_nms[id] = dimname;
98 edg[id] = ((stop - start) / stride) + 1;
115 long FFArray::Seq_constraint(
long *cor,
long *step,
long *edg,
bool *has_stride)
117 int start, stride, stop;
122 Array::Dim_iter i = dim_begin();
123 while (i != dim_end()) {
124 start = (long) dimension_start(i,
true);
125 stride = (long) dimension_stride(i,
true);
126 stop = (long) dimension_stop(i,
true);
129 if (start + stop + stride == 0)
134 edg[id] = ((stop - start) / stride) + 1;
147 static int hyper_get(
void *dest,
void *src,
unsigned szof,
const int dim_num,
int index,
const int dimsz[],
148 const long start[],
const long edge[])
161 if (dim_num != (index + 1)) {
163 for (
int i = dim_num - 1; i > index; i--)
166 for (
int edge_tmp = 0; edge_tmp < edge[index]; edge_tmp++) {
167 void *srctmp = ((
char *) src + (start[index] + edge_tmp) * jump * szof);
168 dest = (
char *) dest + hyper_get(dest, srctmp, szof, dim_num, index + 1, dimsz, start, edge);
174 void *srctmp = (
char *) src + start[index] * szof;
175 memcpy(dest, srctmp, (
size_t) edge[index] * szof);
176 return (edge[index] * szof);
183 static void seq2vects(T * t,
FFArray & array)
186 int ndim = array.dimensions();
187 long *start =
new long[ndim];
188 long *stride =
new long[ndim];
189 long *edge =
new long[ndim];
191 long count = array.Seq_constraint(start, stride, edge, &has_stride);
194 T *t_hs =
new T[count];
195 int *dimsz =
new int[array.dimensions()];
198 Array::Dim_iter p = array.dim_begin();
199 while (p != array.dim_end()) {
200 dimsz[i] = array.dimension_size(p);
205 hyper_get(t_hs, t, array.var()->width(), ndim, 0, dimsz, start,
edge);
207 array.set_read_p(
true);
208 array.val2buf((
void *) t_hs);
214 array.set_read_p(
true);
215 array.val2buf((
void *) t);
241 int ndims = dimensions();
242 vector<string> dname(ndims);
243 vector<long> start(ndims);
244 vector<long> stride(ndims);
245 vector<long>
edge(ndims);
246 long count = Arr_constraint(&start[0], &stride[0], &edge[0], &dname[0], &has_stride);
249 throw Error(unknown_error,
"Constraint returned an empty dataset.");
253 ndims, &start[0], &edge[0], &stride[0], &dname[0]);
260 switch (var()->type()) {
262 extract_array<dods_byte>(dataset(), d_input_format_file, output_format);
266 extract_array<dods_int16>(dataset(), d_input_format_file, output_format);
270 extract_array<dods_uint16>(dataset(), d_input_format_file, output_format);
274 extract_array<dods_int32>(dataset(), d_input_format_file, output_format);
278 extract_array<dods_uint32>(dataset(), d_input_format_file, output_format);
282 extract_array<dods_float32>(dataset(), d_input_format_file, output_format);
286 extract_array<dods_float64>(dataset(), d_input_format_file, output_format);
290 throw InternalErr(__FILE__, __LINE__,
291 (
string)
"FFArray::read: Unsupported array type " + var()->type_name() +
".");
301 bool FFArray::extract_array(
const string &ds,
const string &if_fmt,
const string &o_fmt)
303 vector<T> d(length());
304 long bytes =
read_ff(ds.c_str(), if_fmt.c_str(), o_fmt.c_str(), (
char *) &d[0], width());
306 BESDEBUG(
"ff",
"FFArray::extract_array: Read " << bytes <<
" bytes." << endl);
309 throw Error(unknown_error,
"Could not read values from the dataset.");
313 set_value(d, d.size());
virtual BaseType * ptr_duplicate()
const string makeND_output_format(const string &name, Type type, const int width, int ndim, const long *start, const long *edge, const long *stride, string *dname)
FFArray(const string &n, const string &d, BaseType *v, const string &iff)
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream
long read_ff(const char *dataset, const char *if_file, const char *o_format, char *o_buffer, unsigned long bsize)
Read from a file/database using the FreeForm API.