00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _BOOLEAN_EXPRESSION_HPP_
00021 #define _BOOLEAN_EXPRESSION_HPP_
00022
00023 #include <Expression.hpp>
00024 #include <RealExpression.hpp>
00025
00026 class BooleanExpression
00027 : public Expression
00028 {
00029 protected:
00030 bool __boolValue;
00031
00032 private:
00033 std::ostream& put(std::ostream& os) const
00034 {
00035 os << __boolValue;
00036 return os;
00037 }
00038
00039 public:
00044 bool boolValue() const
00045 {
00046 return __boolValue;
00047 }
00048
00049 BooleanExpression(const BooleanExpression& e)
00050 : Expression(e),
00051 __boolValue(e.__boolValue)
00052 {
00053 ;
00054 }
00055
00056 BooleanExpression()
00057 : Expression(Expression::boolean)
00058 {
00059 ;
00060 }
00061
00062 virtual ~BooleanExpression()
00063 {
00064 ;
00065 }
00066 };
00067
00068 class BooleanExpressionValue
00069 : public BooleanExpression
00070 {
00071 public:
00072 void execute()
00073 {
00074 ;
00075 }
00076
00077 BooleanExpressionValue(bool b)
00078 {
00079 __boolValue = b;
00080 }
00081
00082 BooleanExpressionValue(const BooleanExpressionValue& re)
00083 : BooleanExpression(re)
00084 {
00085 ;
00086 }
00087
00088 ~BooleanExpressionValue()
00089 {
00090 ;
00091 }
00092 };
00093
00094 template <bool (*F)(const bool x)>
00095 class BooleanExpressionUnaryOperator
00096 : public BooleanExpression
00097 {
00098 private:
00099 ReferenceCounting<BooleanExpression> __r;
00100
00101 public:
00102 void execute()
00103 {
00104 (*__r).execute();
00105 __boolValue = (*F)((*__r).boolValue());
00106 }
00107
00108 BooleanExpressionUnaryOperator(ReferenceCounting<BooleanExpression> r)
00109 : __r(r)
00110 {
00111 ;
00112 }
00113
00114 BooleanExpressionUnaryOperator(const BooleanExpressionUnaryOperator<F>& e)
00115 : __r(e.__r)
00116 {
00117 ;
00118 }
00119
00120 ~BooleanExpressionUnaryOperator()
00121 {
00122 ;
00123 }
00124 };
00125
00126 template <bool(*B)(const real_t x, const real_t y)>
00127 class BooleanExpressionCompareOperator
00128 : public BooleanExpression
00129 {
00130 private:
00131 ReferenceCounting<RealExpression> __r1;
00132 ReferenceCounting<RealExpression> __r2;
00133
00134 real_t __r1Value;
00135 real_t __r2Value;
00136
00137 public:
00138 void execute()
00139 {
00140 (*__r1).execute();
00141 __r1Value = (*__r1).realValue();
00142 (*__r2).execute();
00143 __r2Value = (*__r2).realValue();
00144
00145 __boolValue = B(__r1Value, __r2Value);
00146 }
00147
00148 BooleanExpressionCompareOperator(ReferenceCounting<RealExpression> r1,
00149 ReferenceCounting<RealExpression> r2)
00150 : __r1(r1),
00151 __r2(r2),
00152 __r1Value(0),
00153 __r2Value(0)
00154 {
00155 ;
00156 }
00157
00158 BooleanExpressionCompareOperator(const BooleanExpressionCompareOperator<B>& e)
00159 : __r1(e.__r1),
00160 __r2(e.__r2),
00161 __r1Value(e.__r1Value),
00162 __r2Value(e.__r2Value)
00163 {
00164 ;
00165 }
00166
00167 ~BooleanExpressionCompareOperator()
00168 {
00169 ;
00170 }
00171 };
00172
00173 template <bool(*B)(const bool a, const bool b)>
00174 class BooleanExpressionBinaryOperator
00175 : public BooleanExpression
00176 {
00177 private:
00178 ReferenceCounting<BooleanExpression> __r1;
00179 ReferenceCounting<BooleanExpression> __r2;
00180
00181 public:
00182 void execute()
00183 {
00184 (*__r1).execute();
00185 (*__r2).execute();
00186 __boolValue = B((*__r1).boolValue(), (*__r2).boolValue());
00187 }
00188
00189 BooleanExpressionBinaryOperator(ReferenceCounting<BooleanExpression> r1,
00190 ReferenceCounting<BooleanExpression> r2)
00191 : __r1(r1),
00192 __r2(r2)
00193 {
00194 ;
00195 }
00196
00197 BooleanExpressionBinaryOperator(const BooleanExpressionBinaryOperator<B>& e)
00198 : __r1(e.__r1),
00199 __r2(e.__r2)
00200 {
00201 ;
00202 }
00203
00204 ~BooleanExpressionBinaryOperator()
00205 {
00206 ;
00207 }
00208 };
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 #endif // _BOOLEAN_EXPRESSION_HPP_
00233