45#include "InternalErr.h"
47#include "dods-datatypes.h"
48#include "dods-limits.h"
49#include "parser-util.h"
57 for (std::vector<D4RValue *>::const_iterator i = src.d_rvalues.begin(), e = src.d_rvalues.end(); i != e; ++i) {
59 d_rvalues.push_back(
new D4RValue(*rv));
63D4RValueList::~D4RValueList() {
64 for (std::vector<D4RValue *>::iterator i = d_rvalues.begin(), e = d_rvalues.end(); i != e; ++i)
68void D4RValue::m_duplicate(
const D4RValue &src) {
69 d_value_kind = src.d_value_kind;
71 d_variable = src.d_variable;
74 d_args = (src.d_args != 0) ?
new D4RValueList(*src.d_args) : 0;
76 d_constant = (src.d_constant != 0) ? src.d_constant->ptr_duplicate() : 0;
79template <
typename T,
class DAP_TYPE>
static BaseType *build_constant_array(vector<T> &values, DAP_TYPE &dt) {
81 array->append_dim(values.size());
86 array->set_value(values, values.size());
88 array->set_read_p(
true);
90 static unsigned long counter = 1;
91 array->set_name(
string(
"g") + long_to_string(counter++));
96D4RValue::D4RValue(
unsigned long long ull)
97 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
98 UInt64 *ui =
new UInt64(
"constant");
103D4RValue::D4RValue(
long long ll) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
104 Int64 *i =
new Int64(
"constant");
109D4RValue::D4RValue(
double r) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
110 Float64 *f =
new Float64(
"constant");
115D4RValue::D4RValue(std::string cpps) : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
116 Str *s =
new Str(
"constant");
121D4RValue::D4RValue(std::vector<dods_byte> &byte_args)
122 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
124 d_constant = build_constant_array(byte_args, b);
127D4RValue::D4RValue(std::vector<dods_int8> &byte_int8)
128 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
130 d_constant = build_constant_array(byte_int8, b);
133D4RValue::D4RValue(std::vector<dods_uint16> &byte_uint16)
134 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
136 d_constant = build_constant_array(byte_uint16, b);
139D4RValue::D4RValue(std::vector<dods_int16> &byte_int16)
140 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
142 d_constant = build_constant_array(byte_int16, b);
145D4RValue::D4RValue(std::vector<dods_uint32> &byte_uint32)
146 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
148 d_constant = build_constant_array(byte_uint32, b);
151D4RValue::D4RValue(std::vector<dods_int32> &byte_int32)
152 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
154 d_constant = build_constant_array(byte_int32, b);
157D4RValue::D4RValue(std::vector<dods_uint64> &byte_uint64)
158 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
160 d_constant = build_constant_array(byte_uint64, b);
163D4RValue::D4RValue(std::vector<dods_int64> &byte_int64)
164 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
166 d_constant = build_constant_array(byte_int64, b);
169D4RValue::D4RValue(std::vector<dods_float32> &byte_float32)
170 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
172 d_constant = build_constant_array(byte_float32, b);
175D4RValue::D4RValue(std::vector<dods_float64> &byte_float64)
176 : d_variable(0), d_func(0), d_args(0), d_constant(0), d_value_kind(constant) {
178 d_constant = build_constant_array(byte_float64, b);
181D4RValue::~D4RValue() {
203 if (check_uint64(cpps.c_str())) {
204 return new D4RValue(strtoull(cpps.c_str(), &ptr, 0));
205 }
else if (check_int64(cpps.c_str())) {
206 return new D4RValue(strtoll(cpps.c_str(), &ptr, 0));
207 }
else if (check_float64(cpps.c_str())) {
209 return new D4RValue(w32strtod(cpps.c_str(), &ptr));
211 return new D4RValue(strtod(cpps.c_str(), &ptr));
245 switch (d_value_kind) {
248 d_variable->set_read_p(
true);
252 return (*d_func)(d_args, dmr);
258 throw InternalErr(__FILE__, __LINE__,
"Unknown rvalue type.");
273 switch (d_value_kind) {
276 d_variable->set_read_p(
true);
280 throw Error(malformed_expr,
281 "An expression that included a function call was used in a place where that won't work.");
287 throw InternalErr(__FILE__, __LINE__,
"Unknown rvalue type.");
A multidimensional array of identical data types.
The basic data type for the DODS DAP types.
virtual BaseType * value(DMR &dmr)
Get the value for a RValue object Return the BaseType * for a given RValue. For a dataset variable,...
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.