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 #ifndef _operators_h
00037 #define _operators_h
00038
00039
00040 #include "GNURegex.h"
00041 #include "parser.h"
00042 #include "ce_expr.tab.hh"
00043
00044 using namespace std;
00045
00046 namespace libdap
00047 {
00048
00049 inline unsigned
00050 dods_max(int i1, int i2)
00051 {
00052 return (unsigned)((i1 > i2) ? i1 : i2);
00053 }
00054
00062 template<class T1, class T2> class Cmp
00063 {
00064 public:
00065 static bool eq(T1 v1, T2 v2)
00066 {
00067 return v1 == v2;
00068 }
00069 static bool ne(T1 v1, T2 v2)
00070 {
00071 return v1 != v2;
00072 }
00073 static bool gr(T1 v1, T2 v2)
00074 {
00075 return v1 > v2;
00076 }
00077 static bool ge(T1 v1, T2 v2)
00078 {
00079 return v1 >= v2;
00080 }
00081 static bool lt(T1 v1, T2 v2)
00082 {
00083 return v1 < v2;
00084 }
00085 static bool le(T1 v1, T2 v2)
00086 {
00087 return v1 <= v2;
00088 }
00089 static bool re(T1, T2)
00090 {
00091 cerr << "Illegal operation" << endl;
00092 return false;
00093 }
00094 };
00095
00104 template<class UT1, class T2> class USCmp
00105 {
00106 public:
00107 static bool eq(UT1 v1, T2 v2)
00108 {
00109 return v1 == dods_max(0, v2);
00110 }
00111 static bool ne(UT1 v1, T2 v2)
00112 {
00113 return v1 != dods_max(0, v2);
00114 }
00115 static bool gr(UT1 v1, T2 v2)
00116 {
00117 return v1 > dods_max(0, v2);
00118 }
00119 static bool ge(UT1 v1, T2 v2)
00120 {
00121 return v1 >= dods_max(0, v2);
00122 }
00123 static bool lt(UT1 v1, T2 v2)
00124 {
00125 return v1 < dods_max(0, v2);
00126 }
00127 static bool le(UT1 v1, T2 v2)
00128 {
00129 return v1 <= dods_max(0, v2);
00130 }
00131 static bool re(UT1, T2)
00132 {
00133 cerr << "Illegal operation" << endl;
00134 return false;
00135 }
00136 };
00137
00150 template<class T1, class UT2> class SUCmp
00151 {
00152 public:
00153 static bool eq(T1 v1, UT2 v2)
00154 {
00155 return dods_max(0, v1) == v2;
00156 }
00157 static bool ne(T1 v1, UT2 v2)
00158 {
00159 return dods_max(0, v1) != v2;
00160 }
00161 static bool gr(T1 v1, UT2 v2)
00162 {
00163 return dods_max(0, v1) > v2;
00164 }
00165 static bool ge(T1 v1, UT2 v2)
00166 {
00167 return dods_max(0, v1) >= v2;
00168 }
00169 static bool lt(T1 v1, UT2 v2)
00170 {
00171 return dods_max(0, v1) < v2;
00172 }
00173 static bool le(T1 v1, UT2 v2)
00174 {
00175 return dods_max(0, v1) <= v2;
00176 }
00177 static bool re(T1, UT2)
00178 {
00179 cerr << "Illegal operation" << endl;
00180 return false;
00181 }
00182 };
00183
00189 template<class T1, class T2> class StrCmp
00190 {
00191 public:
00192 static bool eq(T1 v1, T2 v2)
00193 {
00194 return v1 == v2;
00195 }
00196 static bool ne(T1 v1, T2 v2)
00197 {
00198 return v1 != v2;
00199 }
00200 static bool gr(T1 v1, T2 v2)
00201 {
00202 return v1 > v2;
00203 }
00204 static bool ge(T1 v1, T2 v2)
00205 {
00206 return v1 >= v2;
00207 }
00208 static bool lt(T1 v1, T2 v2)
00209 {
00210 return v1 < v2;
00211 }
00212 static bool le(T1 v1, T2 v2)
00213 {
00214 return v1 <= v2;
00215 }
00216 static bool re(T1 v1, T2 v2)
00217 {
00218 Regex r(v2.c_str());
00219 return r.match(v1.c_str(), v1.length()) > 0;
00220 }
00221 };
00222
00250 template<class T1, class T2, class C>
00251 bool rops(T1 a, T2 b, int op)
00252 {
00253 switch (op) {
00254 case SCAN_EQUAL:
00255 return C::eq(a, b);
00256 case SCAN_NOT_EQUAL:
00257 return C::ne(a, b);
00258 case SCAN_GREATER:
00259 return C::gr(a, b);
00260 case SCAN_GREATER_EQL:
00261 return C::ge(a, b);
00262 case SCAN_LESS:
00263 return C::lt(a, b);
00264 case SCAN_LESS_EQL:
00265 return C::le(a, b);
00266 case SCAN_REGEXP:
00267 return C::re(a, b);
00268 default:
00269 cerr << "Unknown operator" << endl;
00270 return false;
00271 }
00272 }
00273
00274 }
00275
00276 #endif // _operators_h