35#include <gridfields/array.h>
37#include <libdap/BaseType.h>
38#include <libdap/Array.h>
39#include <libdap/debug.h>
40#include <libdap/util.h>
44#include "ugrid_utils.h"
48#define BESDEBUG( x, y )
56GF::e_Type getGridfieldsInternalTypeMap(
Type type)
69 case dods_float64_c: {
74 throw InternalErr(__FILE__, __LINE__,
75 "Unknown DAP type encountered when converting to gridfields internal type.");
79Type getGridfieldsReturnType(
Type type)
81 GF::e_Type gfInternalType = getGridfieldsInternalTypeMap(type);
84 switch (gfInternalType) {
86 retType = dods_int32_c;
90 retType = dods_float64_c;
94 throw InternalErr(__FILE__, __LINE__,
95 "Unknown GF::e_Type type encountered when resolving gridfields result type mapping for dap type "
96 + libdap::type_name(type));
97 }DBG(cerr <<
" getGridfieldsReturnType() - Return type for " << libdap::type_name(type) <<
98 " is " << libdap::type_name(retType) << endl);
103Type getGridfieldsReturnType(libdap::Array *a)
105 return getGridfieldsReturnType(a->var()->type());
108GF::Array *newGFIndexArray(
string name,
long size, vector<int*> *sharedIntArrays)
110 GF::Array *gfa =
new GF::Array(name, GF::INT);
111 int *values =
new int[size];
112 for (
long i = 0; i < size; i++) {
115 gfa->shareIntData(values, size);
116 sharedIntArrays->push_back(values);
130GF::Array *extractGridFieldArray(libdap::Array *a, vector<int*> *sharedIntArrays, vector<float*> *sharedFloatArrays)
132 if ((a->type() == dods_array_c && !a->var()->is_simple_type()) || a->var()->type() == dods_str_c
133 || a->var()->type() == dods_url_c)
134 throw Error(malformed_expr,
"The function requires a DAP numeric-type array argument.");
136 DBG(cerr <<
"extract_gridfield_array() - " <<
"Reading data values into DAP Array '" << a->name() <<
"'"<< endl);
143 switch (a->var()->type()) {
145 gfa =
new GF::Array(a->var()->name(), GF::INT);
146 int *values = extract_array_helper<dods_byte, int>(a);
147 gfa->shareIntData(values, a->length());
148 sharedIntArrays->push_back(values);
151 case dods_uint16_c: {
152 gfa =
new GF::Array(a->var()->name(), GF::INT);
153 int *values = extract_array_helper<dods_uint16, int>(a);
154 gfa->shareIntData(values, a->length());
155 sharedIntArrays->push_back(values);
159 gfa =
new GF::Array(a->var()->name(), GF::INT);
160 int *values = extract_array_helper<dods_int16, int>(a);
161 gfa->shareIntData(values, a->length());
162 sharedIntArrays->push_back(values);
165 case dods_uint32_c: {
166 gfa =
new GF::Array(a->var()->name(), GF::INT);
167 int *values = extract_array_helper<dods_uint32, int>(a);
168 gfa->shareIntData(values, a->length());
169 sharedIntArrays->push_back(values);
173 gfa =
new GF::Array(a->var()->name(), GF::INT);
174 int *values = extract_array_helper<dods_int32, int>(a);
175 gfa->shareIntData(values, a->length());
176 sharedIntArrays->push_back(values);
179 case dods_float32_c: {
180 gfa =
new GF::Array(a->var()->name(), GF::FLOAT);
181 float *values = extract_array_helper<dods_float32, float>(a);
182 gfa->shareFloatData(values, a->length());
183 sharedFloatArrays->push_back(values);
186 case dods_float64_c: {
187 gfa =
new GF::Array(a->var()->name(), GF::FLOAT);
188 float *values = extract_array_helper<dods_float64, float>(a);
189 gfa->shareFloatData(values, a->length());
190 sharedFloatArrays->push_back(values);
194 throw InternalErr(__FILE__, __LINE__,
"Unknown DAP type encountered when converting to gridfields array");
203vector<string> &split(
const string &s,
char delim, vector<string> &elems)
207 while (getline(ss, item, delim)) {
208 elems.push_back(item);
216vector<string> split(
const string &s,
char delim)
218 vector<string> elems;
219 return split(s, delim, elems);
223string getAttributeValue(BaseType *bt,
string aName)
225 AttrTable &at = bt->get_attr_table();
226 DBG(cerr <<
"getAttributeValue() - " <<
"Checking to see if the variable " << bt->name()
227 <<
"' has an attribute '"<< aName <<
"'"<<endl);
230 AttrTable::Attr_iter loc = at.simple_find(aName);
231 if (loc != at.attr_end()) {
232 return at.get_attr(loc, 0);
243bool matchesCfRoleOrStandardName(BaseType *bt,
string aValue)
246 if (!checkAttributeValue(bt, CF_ROLE, aValue)) {
248 if (!checkAttributeValue(bt, CF_STANDARD_NAME, aValue)) {
257bool checkAttributeValue(BaseType *bt,
string aName,
string aValue)
260 AttrTable &at = bt->get_attr_table();
261 DBG(cerr <<
"checkAttributeValue() - " <<
"Checking to see if the variable " << bt->name()
262 <<
"' has an attribute '"<< aName <<
"' with value '" << aValue <<
"'"<<endl);
265 AttrTable::Attr_iter loc = at.simple_find(aName);
266 if (loc != at.attr_end()) {
267 DBG(cerr <<
"checkAttributeValue() - " <<
"'" << bt->name() <<
"' has a attribute named '" << aName <<
"'"<< endl);
268 string value = at.get_attr(loc, 0);
269 DBG(cerr <<
"checkAttributeValue() - " <<
"Attribute '"<< aName <<
"' has value of '" << value <<
"'"<< endl);
270 if (value != aValue) {