56 #include <BaseTypeFactory.h>
65 string(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") +
66 "<function name=\"make_array\" version=\"1.0\" href=\"http://docs.opendap.org/index.php/Server_Side_Processing_Functions#make_array\">\n" +
77 istringstream iss(shape);
78 string::size_type pos = 0;
87 if (brace !=
'[' || iss.fail())
88 throw Error(malformed_expr,
"make_array(): Expected a left brace at position " + long_to_string(pos) +
" in shape expression: " + shape);
93 if (size == 0 || iss.fail())
94 throw Error(malformed_expr,
"make_array(): Expected an integer at position " + long_to_string(pos) +
" in shape expression: " + shape);
99 if (brace !=
']' || iss.fail())
100 throw Error(malformed_expr,
"make_array(): Expected a right brace at position " + long_to_string(pos) +
" in shape expression: " + shape);
101 }
while (!iss.eof());
109 bool typematch_status =
false;
110 switch (requestedType) {
125 typematch_status=
true;
143 typematch_status=
true;
161 typematch_status=
true;
171 throw InternalErr(__FILE__, __LINE__,
"Unknown type error");
174 return typematch_status;
178 template<
class DAP_Primitive,
class DAP_BaseType>
180 read_values(
int argc, BaseType *argv[], Array *dest)
182 vector<DAP_Primitive> values;
183 values.reserve(argc-2);
185 string requestedTypeName = extract_string_argument(argv[0]);
186 Type requestedType = libdap::get_type(requestedTypeName.c_str());
187 BESDEBUG(
"functions",
"Requested array type: " << requestedTypeName<< endl);
190 for (
int i = 2; i < argc; ++i) {
191 BESDEBUG(
"functions",
"Adding value of type " << argv[i]->type_name() << endl);
193 throw Error(malformed_expr,
"make_array(): Expected values to be of type " + requestedTypeName +
194 " but argument " + long_to_string(i) +
195 " evaluated into a type " + argv[i]->type_name() +
" instead.");
197 BESDEBUG(
"functions",
"Adding value: " << static_cast<DAP_BaseType*>(argv[i])->value() << endl);
198 values.push_back(static_cast<DAP_BaseType*>(argv[i])->value());
201 BESDEBUG(
"functions",
"values size: " << values.size() << endl);
204 dest->set_value(values, values.size());
207 template<
class DAP_Primitive,
class DAP_BaseType>
209 read_values(D4RValueList *args, DMR &dmr, Array *dest)
211 vector<DAP_Primitive> values;
212 values.reserve(args->size()-2);
214 string requestedTypeName = extract_string_argument(args->get_rvalue(0)->value(dmr));
215 Type requestedType = libdap::get_type(requestedTypeName.c_str());
216 BESDEBUG(
"functions",
"Requested array type: " << requestedTypeName<< endl);
219 for (
unsigned int i = 2; i < args->size(); ++i) {
221 BESDEBUG(
"functions",
"Adding value of type " << args->get_rvalue(i)->value(dmr)->type_name() << endl);
222 if(!
isValidTypeMatch(requestedType,args->get_rvalue(i)->value(dmr)->type())){
223 throw Error(malformed_expr,
"make_array(): Expected values to be of type " + requestedTypeName +
224 " but argument " + long_to_string(i) +
225 " evaluated into a type " + args->get_rvalue(i)->value(dmr)->type_name() +
" instead.");
228 BESDEBUG(
"functions",
"Adding value: " << static_cast<DAP_BaseType*>(args->get_rvalue(i)->value(dmr))->value() <<endl);
229 values.push_back(static_cast<DAP_BaseType*>(args->get_rvalue(i)->value(dmr))->value());
232 BESDEBUG(
"functions",
"values size: " << values.size() << endl);
235 dest->set_value(values, values.size());
259 Str *response =
new Str(
"info");
260 response->set_value(make_array_info);
265 BESDEBUG(
"functions",
"function_make_dap2_array() - argc: " << long_to_string(argc) << endl);
269 throw Error(malformed_expr,
"make_array(type,shape,[value0,...]) requires at least two arguments.");
271 string requested_type_name = extract_string_argument(argv[0]);
272 string shape = extract_string_argument(argv[1]);
274 BESDEBUG(
"functions",
"function_make_dap2_array() - type: " << requested_type_name << endl);
275 BESDEBUG(
"functions",
"function_make_dap2_array() - shape: " << shape << endl);
278 Type requested_type = libdap::get_type(requested_type_name.c_str());
279 if (!is_simple_type(requested_type))
280 throw Error(malformed_expr,
"make_array() can only build arrays of simple types (integers, floats and strings).");
287 static unsigned long counter = 1;
290 name =
"g" + long_to_string(counter++);
291 }
while (dds.var(name));
293 Array *dest =
new Array(name, 0);
295 dest->add_var_nocopy(btf.NewVariable(requested_type));
297 unsigned long number_of_elements = 1;
298 vector<int>::iterator i = dims.begin();
299 while (i != dims.end()) {
300 number_of_elements *= *i;
301 dest->append_dim(*i++);
306 if (number_of_elements + 2 != (
unsigned long)argc)
307 throw Error(malformed_expr,
"make_array(): Expected " + long_to_string(number_of_elements) +
" parameters but found " + long_to_string(argc-2) +
" instead.");
309 switch (requested_type) {
313 read_values<dods_byte, Int32>(argc, argv, dest);
317 read_values<dods_int16, Int32>(argc, argv, dest);
321 read_values<dods_uint16, Int32>(argc, argv, dest);
325 read_values<dods_int32, Int32>(argc, argv, dest);
330 read_values<dods_uint32, Int32>(argc, argv, dest);
334 read_values<dods_float32, Float64>(argc, argv, dest);
338 read_values<dods_float64, Float64>(argc, argv, dest);
342 read_values<string, Str>(argc, argv, dest);
346 read_values<string, Url>(argc, argv, dest);
350 throw InternalErr(__FILE__, __LINE__,
"Unknown type error");
353 dest->set_send_p(
true);
354 dest->set_read_p(
true);
363 if (args == 0 || args->size() == 0) {
364 Str *response =
new Str(
"info");
365 response->set_value(make_array_info);
371 DBG(cerr <<
"args.size() = " << args.size() << endl);
372 if (args->size() < 2)
373 throw Error(malformed_expr,
"Wrong number of arguments to make_array(). See make_array() for more information");
375 string requested_type_name = extract_string_argument(args->get_rvalue(0)->value(dmr));
376 string shape = extract_string_argument(args->get_rvalue(1)->value(dmr));
379 BESDEBUG(
"functions",
"type: " << requested_type_name << endl);
380 BESDEBUG(
"functions",
"shape: " << shape << endl);
384 Type requested_type = libdap::get_type(requested_type_name.c_str());
385 if (!is_simple_type(requested_type))
386 throw Error(malformed_expr,
"make_array() can only build arrays of simple types (integers, floats and strings).");
393 static unsigned long counter = 1;
396 name =
"g" + long_to_string(counter++);
397 }
while (dmr.root()->var(name));
399 Array *dest =
new Array(name, 0);
401 dest->add_var_nocopy(btf.NewVariable(requested_type));
403 unsigned long number_of_elements = 1;
404 vector<int>::iterator i = dims.begin();
405 while (i != dims.end()) {
406 number_of_elements *= *i;
407 dest->append_dim(*i++);
412 if (number_of_elements + 2 != args->size())
413 throw Error(malformed_expr,
"make_array(): Expected " + long_to_string(number_of_elements) +
" parameters but found " + long_to_string(args->size()-2) +
" instead.");
415 switch (requested_type) {
419 read_values<dods_byte, Int32>(args, dmr, dest);
423 read_values<dods_int16, Int32>(args, dmr, dest);
427 read_values<dods_uint16, Int32>(args, dmr, dest);
431 read_values<dods_int32, Int32>(args, dmr, dest);
436 read_values<dods_uint32, Int32>(args, dmr, dest);
440 read_values<dods_float32, Float64>(args, dmr, dest);
444 read_values<dods_float64, Float64>(args, dmr, dest);
448 read_values<string, Str>(args, dmr, dest);
452 read_values<string, Url>(args, dmr, dest);
456 throw InternalErr(__FILE__, __LINE__,
"Unknown type error");
458 dest->set_send_p(
true);
459 dest->set_read_p(
true);
BaseType * function_make_dap4_array(D4RValueList *args, DMR &dmr)
The linear_scale() function applies the familiar y = mx + b equation to data.
void function_make_dap2_array(int argc, BaseType *argv[], DDS &dds, BaseType **btpp)
Build a new DAP Array variable.
vector< int > parse_dims(const string &shape)
Parse the shape 'expression'.
static class NCMLUtil overview
bool isValidTypeMatch(Type requestedType, Type argType)
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream