45#include "InternalErr.h"
47#include "dods-datatypes.h"
48#include "dods-limits.h"
49#include "parser-util.h"
57D4RValueList::m_duplicate(
const D4RValueList &src)
59 for (std::vector<D4RValue *>::const_iterator i = src.d_rvalues.begin(), e = src.d_rvalues.end(); i != e; ++i) {
61 d_rvalues.push_back(
new D4RValue(*rv));
65D4RValueList::~D4RValueList()
67 for (std::vector<D4RValue *>::iterator i = d_rvalues.begin(), e = d_rvalues.end(); i != e; ++i)
72D4RValue::m_duplicate(
const D4RValue &src)
74 d_value_kind = src.d_value_kind;
76 d_variable = src.d_variable;
79 d_args = (src.d_args != 0) ?
new D4RValueList(*src.d_args) : 0;
81 d_constant = (src.d_constant != 0) ? src.d_constant->
ptr_duplicate() : 0;
84template<
typename T,
class DAP_TYPE>
86build_constant_array(vector<T> &values, DAP_TYPE &dt)
88 Array *array =
new Array(
"", &dt);
89 array->append_dim(values.size());
94 array->set_value(values, values.size());
96 array->set_read_p(
true);
98 static unsigned long counter = 1;
99 array->set_name(
string(
"g") + long_to_string(counter++));
104D4RValue::D4RValue(
unsigned long long ull) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
106 UInt64 *ui =
new UInt64(
"constant");
111D4RValue::D4RValue(
long long ll) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
113 Int64 *i =
new Int64(
"constant");
118D4RValue::D4RValue(
double r) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
120 Float64 *f =
new Float64(
"constant");
125D4RValue::D4RValue(std::string cpps) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
127 Str *s =
new Str(
"constant");
132D4RValue::D4RValue(std::vector<dods_byte> &byte_args)
133 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
136 d_constant = build_constant_array(byte_args, b);
139D4RValue::D4RValue(std::vector<dods_int8> &byte_int8)
140 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
143 d_constant = build_constant_array(byte_int8, b);
146D4RValue::D4RValue(std::vector<dods_uint16> &byte_uint16)
147 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
150 d_constant = build_constant_array(byte_uint16, b);
153D4RValue::D4RValue(std::vector<dods_int16> &byte_int16)
154 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
157 d_constant = build_constant_array(byte_int16, b);
160D4RValue::D4RValue(std::vector<dods_uint32> &byte_uint32)
161 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
164 d_constant = build_constant_array(byte_uint32, b);
167D4RValue::D4RValue(std::vector<dods_int32> &byte_int32)
168 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
171 d_constant = build_constant_array(byte_int32, b);
174D4RValue::D4RValue(std::vector<dods_uint64> &byte_uint64)
175 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
178 d_constant = build_constant_array(byte_uint64, b);
181D4RValue::D4RValue(std::vector<dods_int64> &byte_int64)
182 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
185 d_constant = build_constant_array(byte_int64, b);
188D4RValue::D4RValue(std::vector<dods_float32> &byte_float32)
189 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
192 d_constant = build_constant_array(byte_float32, b);
195D4RValue::D4RValue(std::vector<dods_float64> &byte_float64)
196 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant)
199 d_constant = build_constant_array(byte_float64, b);
202D4RValue::~D4RValue() {
225 if (check_uint64(cpps.c_str())) {
226 return new D4RValue(strtoull(cpps.c_str(), &ptr, 0));
228 else if (check_int64(cpps.c_str())) {
229 return new D4RValue(strtoll(cpps.c_str(), &ptr, 0));
231 else if (check_float64(cpps.c_str())) {
233 return new D4RValue(w32strtod(cpps.c_str(), &ptr));
235 return new D4RValue(strtod(cpps.c_str(), &ptr));
272 switch (d_value_kind) {
275 d_variable->set_read_p(
true);
279 return (*d_func)(d_args, dmr);
285 throw InternalErr(__FILE__, __LINE__,
"Unknown rvalue type.");
302 switch (d_value_kind) {
305 d_variable->set_read_p(
true);
309 throw Error(malformed_expr,
"An expression that included a function call was used in a place where that won't work.");
315 throw InternalErr(__FILE__, __LINE__,
"Unknown rvalue type.");
The basic data type for the DODS DAP types.
virtual bool read()
Read data into a local buffer.
virtual BaseType * ptr_duplicate()=0
A class for error processing.
A class for software fault reporting.
top level DAP object to house generic methods
string remove_quotes(const string &s)
D4RValue * D4RValueFactory(std::string cpps)
Build an appropriate RValue.