55 #include "Structure.h"
64 #include <gridfields/array.h>
84 int length = a->length();
88 char *dodsTypeName = abi::__cxa_demangle(
typeid(DODS).name(), 0, 0, &status);;
89 char *tTypeName = abi::__cxa_demangle(
typeid(T).name(), 0, 0, &status);;
92 DBG(cerr <<
"extract_array_helper() - " <<
"Extracting data from DAP Array '" << a->name() <<
"'"<< endl);
93 DBG(cerr <<
"extract_array_helper() - " <<
"Allocating " << length <<
" of type "<< dodsTypeName << endl);
94 DODS *src =
new DODS[length];
96 DBG(cerr <<
"extract_array_helper() - " <<
"Copying values from DAP Array "<< a->name() <<
97 " to an array of type '" << dodsTypeName <<
"'. targetAddress=" << src << endl);
99 DBG(cerr <<
"extract_array_helper() - " <<
"Copy complete." << endl);
101 DBG(cerr <<
"extract_array_helper() - " <<
"Allocating " << length <<
" of type "<< tTypeName << endl);
102 T *dest =
new T[length];
104 DBG(cerr <<
"extract_array_helper() - " <<
"Casting/Copying array of type '" <<
105 dodsTypeName<<
"' to an array of type '" << tTypeName <<
"'" << endl);
106 for (
int i = 0; i < length; ++i)
107 dest[i] = (T) src[i];
109 DBG(cerr <<
"extract_array_helper() - " <<
"Copy complete." << endl);
113 DBG(cerr <<
"extract_array_helper() - " <<
"Releasing memory for an array of size "<< length <<
114 " and type '" << dodsTypeName <<
"'"<< endl);
117 DBG(cerr <<
"extract_array_helper() - " <<
"Returning extracted values from DAP Array '" << a->name() <<
"'"<< endl);
133 static GF::Array *extract_gridfield_array(Array *a) {
134 if ((a->type() == dods_array_c && !a->var()->is_simple_type())
135 || a->var()->type() == dods_str_c || a->var()->type() == dods_url_c)
136 throw Error(malformed_expr,
137 "The function requires a DAP numeric-type array argument.");
139 DBG(cerr <<
"extract_gridfield_array() - " <<
"Reading data values into DAP Array '" << a->name() <<
"'"<< endl);
146 switch (a->var()->type()) {
149 gfa =
new GF::Array(a->var()->name(),
GF::INT);
150 int *values = extract_array_helper<dods_byte, int>(a);
151 gfa->shareIntData(values, a->length());
156 gfa =
new GF::Array(a->var()->name(),
GF::INT);
157 int *values = extract_array_helper<dods_uint16, int>(a);
158 gfa->shareIntData(values, a->length());
163 gfa =
new GF::Array(a->var()->name(),
GF::INT);
164 int *values = extract_array_helper<dods_int16, int>(a);
165 gfa->shareIntData(values, a->length());
170 gfa =
new GF::Array(a->var()->name(),
GF::INT);
171 int *values = extract_array_helper<dods_uint32, int>(a);
172 gfa->shareIntData(values, a->length());
177 gfa =
new GF::Array(a->var()->name(),
GF::INT);
178 int *values = extract_array_helper<dods_int32, int>(a);
179 gfa->shareIntData(values, a->length());
184 gfa =
new GF::Array(a->var()->name(),
GF::FLOAT);
185 float *values = extract_array_helper<dods_float32, float>(a);
186 gfa->shareFloatData(values, a->length());
191 gfa =
new GF::Array(a->var()->name(),
GF::FLOAT);
192 float *values = extract_array_helper<dods_float64, float>(a);
193 gfa->shareFloatData(values, a->length());
197 throw InternalErr(__FILE__, __LINE__,
198 "Unknown DAP type encountered when converting to gridfields array");
227 throw InternalErr(__FILE__, __LINE__,
228 "Unknown DAP type encountered when converting to gridfields internal type.");
237 switch (gfInternalType) {
240 retType = dods_int32_c;
245 retType = dods_float64_c;
249 throw InternalErr(__FILE__, __LINE__,
250 "Unknown GF::e_Type type encountered when resolving gridfields result type mapping for dap type " +
251 libdap::type_name(type));
253 DBG(cerr <<
" getGridfieldsReturnType() - Return type for " << libdap::type_name(type) <<
254 " is " << libdap::type_name(retType) << endl);
266 GF::Array *gfa =
new GF::Array(name,
GF::INT);
267 int *values =
new int[size];
268 for(
long i=0; i<size ;i++){
271 gfa->shareIntData(values, size);
272 sharedIntArrays->push_back(values);
287 GF::Array *
extractGridFieldArray(libdap::Array *a, vector<int*> *sharedIntArrays, vector<float*> *sharedFloatArrays) {
288 if ((a->type() == dods_array_c && !a->var()->is_simple_type())
289 || a->var()->type() == dods_str_c || a->var()->type() == dods_url_c)
290 throw Error(malformed_expr,
291 "The function requires a DAP numeric-type array argument.");
293 DBG(cerr <<
"extract_gridfield_array() - " <<
"Reading data values into DAP Array '" << a->name() <<
"'"<< endl);
300 switch (a->var()->type()) {
303 gfa =
new GF::Array(a->var()->name(),
GF::INT);
304 int *values = extract_array_helper<dods_byte, int>(a);
305 gfa->shareIntData(values, a->length());
306 sharedIntArrays->push_back(values);
311 gfa =
new GF::Array(a->var()->name(),
GF::INT);
312 int *values = extract_array_helper<dods_uint16, int>(a);
313 gfa->shareIntData(values, a->length());
314 sharedIntArrays->push_back(values);
319 gfa =
new GF::Array(a->var()->name(),
GF::INT);
320 int *values = extract_array_helper<dods_int16, int>(a);
321 gfa->shareIntData(values, a->length());
322 sharedIntArrays->push_back(values);
327 gfa =
new GF::Array(a->var()->name(),
GF::INT);
328 int *values = extract_array_helper<dods_uint32, int>(a);
329 gfa->shareIntData(values, a->length());
330 sharedIntArrays->push_back(values);
335 gfa =
new GF::Array(a->var()->name(),
GF::INT);
336 int *values = extract_array_helper<dods_int32, int>(a);
337 gfa->shareIntData(values, a->length());
338 sharedIntArrays->push_back(values);
343 gfa =
new GF::Array(a->var()->name(),
GF::FLOAT);
344 float *values = extract_array_helper<dods_float32, float>(a);
345 gfa->shareFloatData(values, a->length());
346 sharedFloatArrays->push_back(values);
351 gfa =
new GF::Array(a->var()->name(),
GF::FLOAT);
352 float *values = extract_array_helper<dods_float64, float>(a);
353 gfa->shareFloatData(values, a->length());
354 sharedFloatArrays->push_back(values);
358 throw InternalErr(__FILE__, __LINE__,
359 "Unknown DAP type encountered when converting to gridfields array");
369 template<
typename T> T *
extractArray(libdap::Array *a) {
372 if ((a->type() == dods_array_c && !a->var()->is_simple_type())
373 || a->var()->type() == dods_str_c || a->var()->type() == dods_url_c)
374 throw Error(malformed_expr,
375 "The function requires a DAP numeric-type array argument.");
377 DBG(cerr <<
"extract_array() - " <<
"Reading data values into DAP Array '" << a->name() <<
"'"<< endl);
385 throw InternalErr(__FILE__, __LINE__,
386 string(
"The Array '") + a->name()
387 +
"'does not contain values. send_read_p() not called?");
395 switch (a->var()->type()) {
397 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_byte_c'" << endl);
398 return extract_array_helper<dods_byte, T>(a);
401 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_uint16_c'" << endl);
402 return extract_array_helper<dods_uint16, T>(a);
405 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_int16_c'" << endl);
406 return extract_array_helper<dods_int16, T>(a);
409 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_uint32_c'" << endl);
410 return extract_array_helper<dods_uint32, T>(a);
413 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_int32_c'" << endl);
414 return extract_array_helper<dods_int32, T>(a);
417 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_float32_c'" << endl);
419 return extract_array_helper<dods_float32, T>(a);
422 DBG(cerr <<
"extract_array() - extracting to an array of 'dods_float64_c'" << endl);
423 return extract_array_helper<dods_float64, T>(a);
426 throw InternalErr(__FILE__, __LINE__,
427 "The argument list built by the CE parser contained an unsupported numeric type.");
436 vector<string> &
split(
const string &s,
char delim, vector<string> &elems)
440 while (getline(ss, item, delim)) {
441 elems.push_back(item);
449 vector<string>
split(
const string &s,
char delim)
451 vector<string> elems;
452 return split(s, delim, elems);
458 AttrTable &at = bt->get_attr_table();
459 DBG(cerr <<
"getAttributeValue() - " <<
"Checking to see if the variable " << bt->name()
460 <<
"' has an attribute '"<< aName <<
"'"<<endl);
463 AttrTable::Attr_iter loc = at.simple_find(aName);
464 if (loc != at.attr_end()) {
465 DBG(cerr <<
"checkAttributeValue() - " <<
"'" << bt->name() <<
"' has a attribute named '" << aName <<
"'"<< endl);
467 string value = at.get_attr(loc, 0);
470 return at.get_attr(loc, 0);
496 AttrTable &at = bt->get_attr_table();
497 DBG(cerr <<
"checkAttributeValue() - " <<
"Checking to see if the variable " << bt->name()
498 <<
"' has an attribute '"<< aName <<
"' with value '" << aValue <<
"'"<<endl);
501 AttrTable::Attr_iter loc = at.simple_find(aName);
502 if (loc != at.attr_end()) {
503 DBG(cerr <<
"checkAttributeValue() - " <<
"'" << bt->name() <<
"' has a attribute named '" << aName <<
"'"<< endl);
504 string value = at.get_attr(loc, 0);
505 DBG(cerr <<
"checkAttributeValue() - " <<
"Attribute '"<< aName <<
"' has value of '" << value <<
"'"<< endl);
506 if (value != aValue) {
525 int dimCount = array->dimensions(
true);
529 "Expected a 2 dimensional array. The array '" + array->name()
530 +
"' has " + libdap::long_to_string(dimCount) +
" dimensions.");
533 libdap::Array::Dim_iter di = array->dim_begin();
534 if (di->c_size != 3) {
536 "Expected a 2 dimensional array with shape of 3xN! The array "
537 + array->name() +
" has a first " +
"dimension of size "
538 + libdap::long_to_string(di->c_size);
539 DBG(cerr << msg << endl);
540 throw Error(malformed_expr, msg);
GF::e_Type getGridfieldsInternalTypeMap(Type type)
bool checkAttributeValue(BaseType *bt, string aName, string aValue)
#define CF_ROLE
REQUIRED UGrid attribute vocabulary.
GF::Array * extractGridFieldArray(libdap::Array *a, vector< int * > *sharedIntArrays, vector< float * > *sharedFloatArrays)
Extract data from a DAP array and return those values in a gridfields array.
GF::Array * newGFIndexArray(string name, long size, vector< int * > *sharedIntArrays)
int getNfrom3byNArray(libdap::Array *array)
Retrieves the size of the second dimension from a 3xN array.
T * extractArray(libdap::Array *a)
Given a pointer to an Array that holds a numeric type, extract the values and return in an array of T...
T * extract_array_helper(libdap::Array *a)
DAP Array data extraction helper method.
bool matchesCfRoleOrStandardName(BaseType *bt, string aValue)
Checks the passed BaseType attributes as follows: If the BaseType has a "cf_role" attribute and it's ...
Type getGridfieldsReturnType(libdap::Array *a)
string getAttributeValue(BaseType *bt, string aName)
vector< string > split(const string &s, char delim)
Splits the string on the passed char.