00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "config.h"
00038
00039 static char rcsid[] not_used =
00040 {"$Id: RValue.cc 18315 2008-03-03 20:14:44Z jimg $"
00041 };
00042
00043 #include <cassert>
00044 #include <iostream>
00045
00046 #include "BaseType.h"
00047 #include "expr.h"
00048 #include "RValue.h"
00049 #include "DDS.h"
00050 #include "dods-limits.h"
00051 #include "util.h"
00052
00053 using namespace std;
00054
00055 namespace libdap {
00056
00057 rvalue_list *
00058 make_rvalue_list(rvalue *rv)
00059 {
00060 assert(rv);
00061
00062 rvalue_list *rvals = new rvalue_list;
00063
00064 return append_rvalue_list(rvals, rv);
00065 }
00066
00067
00068
00069
00070
00071
00072 rvalue_list *
00073 append_rvalue_list(rvalue_list *rvals, rvalue *rv)
00074 {
00075 rvals->push_back(rv);
00076
00077 return rvals;
00078 }
00079
00080
00092 BaseType **
00093 build_btp_args(rvalue_list *args, DDS &dds, const string &dataset)
00094 {
00095 int argc = 0;
00096
00097 if (args)
00098 argc = args->size();
00099
00100
00101 if (!size_ok(sizeof(BaseType*), argc+1))
00102 throw Error(malformed_expr,
00103 string("Malformed argument list (")
00104 + long_to_string(argc)
00105 + string(")."));
00106
00107
00108 BaseType **argv = new BaseType*[argc + 1];
00109
00110 int index = 0;
00111 if (argv && argc) {
00112 for (rvalue::Args_iter i = args->begin(); i != args->end() && index < argc+1; ++i) {
00113 argv[index++] = (*i)->bvalue(dataset, dds);
00114 }
00115 }
00116
00117 if (index != argc) {
00118 delete[] argv;
00119 throw InternalErr(__FILE__, __LINE__, "index out of range.");
00120 }
00121
00122 argv[index] = 0;
00123
00124 return argv;
00125 }
00126
00127 rvalue::rvalue(BaseType *bt): d_value(bt), d_func(0), d_args(0)
00128 {}
00129
00130 rvalue::rvalue(btp_func f, vector<rvalue *> *a) : d_value(0), d_func(f), d_args(a)
00131 {}
00132
00133 rvalue::rvalue(): d_value(0), d_func(0), d_args(0)
00134 {}
00135
00136 rvalue::~rvalue()
00137 {
00138
00139
00140
00141
00142 }
00143
00144 string
00145 rvalue::value_name()
00146 {
00147 assert(d_value);
00148
00149 return d_value->name();
00150 }
00151
00161 BaseType *
00162 rvalue::bvalue(const string &dataset, DDS &dds)
00163 {
00164 if (d_value) {
00165 return d_value;
00166 }
00167 else if (d_func) {
00168
00169
00170 BaseType **argv = build_btp_args(d_args, dds, dataset);
00171 BaseType *ret_val = (*d_func)(d_args->size(), argv, dds, dataset);
00172 delete[] argv;
00173 return ret_val;
00174 }
00175 else {
00176 return 0;
00177 }
00178 }
00179
00180 }
00181