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 16088 2007-03-28 21:42:19Z jimg $"
00041 };
00042
00043 #include <assert.h>
00044
00045 #include <iostream>
00046
00047 #include "BaseType.h"
00048 #include "expr.h"
00049 #include "RValue.h"
00050 #include "DDS.h"
00051
00052 using namespace std;
00053
00054 rvalue_list *
00055 make_rvalue_list(rvalue *rv)
00056 {
00057 assert(rv);
00058
00059 rvalue_list *rvals = new rvalue_list;
00060
00061 return append_rvalue_list(rvals, rv);
00062 }
00063
00064
00065
00066
00067
00068
00069 rvalue_list *
00070 append_rvalue_list(rvalue_list *rvals, rvalue *rv)
00071 {
00072 assert(rvals);
00073 assert(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 BaseType **argv = new BaseType *[argc + 1];
00102
00103 int index = 0;
00104 if (argc) {
00105 for (rvalue::Args_iter i = args->begin(); i != args->end(); i++) {
00106 argv[index++] = (*i)->bvalue(dataset, dds);
00107 }
00108 }
00109
00110 argv[index] = 0;
00111
00112 return argv;
00113 }
00114
00115 rvalue::rvalue(BaseType *bt): d_value(bt), d_func(0), d_args(0)
00116 {}
00117
00118 rvalue::rvalue(btp_func f, vector<rvalue *> *a) : d_value(0), d_func(f), d_args(a)
00119 {}
00120
00121 rvalue::rvalue(): d_value(0), d_func(0), d_args(0)
00122 {}
00123
00124 rvalue::~rvalue()
00125 {
00126
00127
00128
00129
00130 }
00131
00132 string
00133 rvalue::value_name()
00134 {
00135 assert(d_value);
00136
00137 return d_value->name();
00138 }
00139
00149 BaseType *
00150 rvalue::bvalue(const string &dataset, DDS &dds)
00151 {
00152 if (d_value) {
00153 return d_value;
00154 }
00155 else if (d_func) {
00156
00157
00158 BaseType **argv = build_btp_args(d_args, dds, dataset);
00159 BaseType *ret_val = (*d_func)(d_args->size(), argv, dds, dataset);
00160 delete[] argv;
00161 return ret_val;
00162 }
00163 else {
00164 return 0;
00165 }
00166 }
00167