53 #include <BaseTypeFactory.h>
69 istringstream iss(shape);
70 string::size_type pos = 0;
79 if (brace !=
'[' || iss.fail())
80 throw Error(malformed_expr,
"make_array(): Expected a left brace at position " + long_to_string(pos) +
" in shape expression: " + shape);
85 if (size == 0 || iss.fail())
86 throw Error(malformed_expr,
"make_array(): Expected an integer at position " + long_to_string(pos) +
" in shape expression: " + shape);
91 if (brace !=
']' || iss.fail())
92 throw Error(malformed_expr,
"make_array(): Expected a right brace at position " + long_to_string(pos) +
" in shape expression: " + shape);
98 template<
class DAP_Primitive,
class DAP_BaseType>
100 read_values(
int argc, BaseType *argv[], Array *dest)
102 vector<DAP_Primitive> values;
103 values.reserve(argc-2);
106 for (
int i = 2; i < argc; ++i) {
107 BESDEBUG(
"functions",
"Adding value: " << static_cast<DAP_BaseType*>(argv[i])->value() <<endl);
108 values.push_back(static_cast<DAP_BaseType*>(argv[i])->value());
111 BESDEBUG(
"functions",
"values size: " << values.size() << endl);
114 dest->set_value(values, values.size());
133 string(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") +
134 "<function name=\"make_array\" version=\"1.0\" href=\"http://docs.opendap.org/index.php/Server_Side_Processing_Functions#make_array\">\n" +
138 Str *response =
new Str(
"info");
139 response->set_value(info);
146 throw Error(malformed_expr,
"make_array(type,shape,[value0,...]) requires at least two arguments.");
148 string type_name = extract_string_argument(argv[0]);
149 string shape = extract_string_argument(argv[1]);
151 BESDEBUG(
"functions",
"type: " << type_name << endl);
152 BESDEBUG(
"functions",
"shape: " << shape << endl);
155 Type type = libdap::get_type(type_name.c_str());
156 if (!is_simple_type(type))
157 throw Error(malformed_expr,
"make_array() can only build arrays of simple types (integers, floats and strings).");
164 static unsigned long counter = 1;
167 name =
"g" + long_to_string(counter++);
168 }
while (dds.var(name));
170 Array *dest =
new Array(name, 0);
172 dest->add_var_nocopy(btf.NewVariable(type));
174 unsigned long number_of_elements = 1;
175 vector<int>::iterator i = dims.begin();
176 while (i != dims.end()) {
177 number_of_elements *= *i;
178 dest->append_dim(*i++);
183 if (number_of_elements + 2 != (
unsigned long)argc)
184 throw Error(malformed_expr,
"make_array(): Expected " + long_to_string(number_of_elements) +
" but found " + long_to_string(argc-2) +
" instead.");
190 read_values<dods_byte, Int32>(argc, argv, dest);
194 read_values<dods_int16, Int32>(argc, argv, dest);
198 read_values<dods_uint16, Int32>(argc, argv, dest);
202 read_values<dods_int32, Int32>(argc, argv, dest);
207 read_values<dods_uint32, Int32>(argc, argv, dest);
211 read_values<dods_float32, Float64>(argc, argv, dest);
215 read_values<dods_float64, Float64>(argc, argv, dest);
219 read_values<string, Str>(argc, argv, dest);
223 read_values<string, Url>(argc, argv, dest);
227 throw InternalErr(__FILE__, __LINE__,
"Unknown type error");
230 dest->set_send_p(
true);
231 dest->set_read_p(
true);
vector< int > parse_dims(const string &shape)
Parse the shape 'expression'.
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream
void function_make_array(int argc, BaseType *argv[], DDS &dds, BaseType **btpp)
Build a new DAP Array variable.