00001 //: xbool.h 00008 #ifndef xbool_h 00009 #define xbool_h 00010 00011 #include "setup.h" // include setup values 00012 #include <wx/wxprec.h> 00013 00014 #ifdef __BORLANDC__ 00015 #pragma hdrstop 00016 #endif 00017 00018 #ifndef WX_PRECOMP 00019 #include <wx/wx.h> 00020 #endif 00021 00022 00038 class xboolean : wxObject 00039 { public: 00041 enum xbool // MUST be public 00042 { Unknown = -1, // value is not yet set/unknown/irrelevant 00043 False = false, // value is surely false 00044 True = true // value is surely true 00045 } value; 00046 00049 xboolean(xbool xb = Unknown) 00050 { value = xb;} 00054 xboolean(bool b) 00055 { if(b) 00056 value = True; 00057 else 00058 value = False; 00059 } 00062 xboolean(const xboolean &xb) 00063 { value = xb.value;} 00065 virtual 00066 void CalculateValue(void) 00067 {} // By default, makes nothing 00069 virtual 00070 void CalculateValue(void) const 00071 {} // By default, makes nothing 00074 virtual 00075 xbool GetValue(void) 00076 { CalculateValue(); // re-calculate the xbool value 00077 return value; 00078 } 00081 virtual 00082 xbool GetValue(void) const 00083 { CalculateValue(); // re-calculate the xbool value 00084 return value; 00085 } 00089 virtual inline 00090 wxString GetValueString(void) 00091 { if(IsUnknown()) 00092 return _("U"); 00093 else if(IsFalse()) 00094 return _("F"); 00095 else if(IsTrue()) 00096 return _("T"); 00097 else 00098 return "?"; 00099 } 00102 inline 00103 bool IsFalse(void) 00104 { return False == GetValue();} 00107 inline 00108 bool IsTrue(void) 00109 { return True == GetValue();} 00112 inline 00113 bool IsUnknown(void) 00114 { return Unknown == GetValue();} 00117 xboolean operator ! (void) 00118 { xboolean res; 00119 if(Unknown == GetValue()) 00120 res.value = Unknown; 00121 else if(False == value) 00122 res.value = True; 00123 else if(True == value) 00124 res.value = False; 00125 return res; 00126 } 00127 #if defined (__GNUG__) 00128 00131 xboolean& operator = ( xboolean &xb) 00132 { value = xb.GetValue(); 00133 return *this; 00134 } 00135 #endif 00136 00139 xboolean& operator = ( const xboolean &xb) 00140 { value = xb.GetValue(); 00141 return *this; 00142 } 00146 xboolean& operator = (bool &b) 00147 { if(b) 00148 value = True; 00149 else 00150 value = False; 00151 return *this; 00152 } 00158 friend xboolean 00159 operator && ( xboolean &xbL, xboolean &xbR) 00160 { xboolean res; 00161 if((False == xbL.GetValue()) || (False == xbR.GetValue())) 00162 res.value = False; 00163 else if ((True == xbL.value) && (True == xbR.value)) 00164 res.value = True; 00165 else res.value = Unknown; 00166 return res; 00167 } 00173 friend xboolean 00174 operator && ( bool &bL, xboolean &xbR) 00175 { xboolean res; 00176 if((!bL) || (False == xbR.GetValue())) 00177 res.value = False; 00178 else if ((bL) && (True == xbR.value)) 00179 res.value = True; 00180 else res.value = Unknown; 00181 return res; 00182 } 00188 friend xboolean 00189 operator && ( xboolean &xbL, bool &bR) 00190 { xboolean res; 00191 if((False == xbL.GetValue()) 00192 || (!bR)) 00193 res.value = False; 00194 else if ((True == xbL.value) && (bR)) 00195 res.value = True; 00196 else res.value = Unknown; 00197 return res; 00198 } 00204 friend xboolean 00205 operator || ( xboolean &xbL, xboolean &xbR) 00206 { xboolean res; 00207 if((True == xbL.GetValue()) 00208 || (True == xbR.GetValue())) 00209 res.value = True; 00210 else if ((False == xbR.value) && (False == xbL.value)) 00211 res.value = False; 00212 else 00213 res.value = Unknown; 00214 return res; 00215 } 00221 friend xboolean 00222 operator || ( bool &bL, xboolean &xbR) 00223 { xboolean res; 00224 if((bL) || (True == xbR.GetValue())) 00225 res.value = True; 00226 else if ((!bL) && (False == xbR.value)) 00227 res.value = False; 00228 else 00229 res.value = Unknown; 00230 return res; 00231 } 00237 friend xboolean 00238 operator || ( xboolean &xbL, bool &bR) 00239 { xboolean res; 00240 if((True == xbL.GetValue()) || (bR)) 00241 res.value = True; 00242 else if ((!bR) && (False == xbL.value)) 00243 res.value = False; 00244 else 00245 res.value = Unknown; 00246 return res; 00247 } 00253 friend xboolean 00254 operator == ( xboolean &xbL, xboolean &xbR) 00255 { xboolean res; 00256 if((Unknown == xbL.GetValue()) 00257 || (Unknown == xbR.GetValue())) 00258 res.value = Unknown; 00259 else 00260 res.value = (xbL.value == xbR.value) 00261 ? True : False; 00262 return res; 00263 } 00268 xboolean 00269 operator == ( bool &b) 00270 { xboolean res; 00271 if(Unknown == GetValue()) 00272 res.value = Unknown; 00273 else 00274 res.value = (value == (short) b) 00275 ? True : False; 00276 return res; 00277 } 00282 xboolean 00283 operator != ( xboolean &xb) 00284 { xboolean res; 00285 if((Unknown == GetValue()) 00286 || (Unknown == xb.GetValue())) 00287 res.value = Unknown; 00288 else 00289 res.value = ( value != xb.value) 00290 ? True : False; 00291 return res; 00292 } 00297 xboolean 00298 operator != ( bool &b) 00299 { xboolean res; 00300 if(Unknown == GetValue()) 00301 res.value = Unknown; 00302 else 00303 res.value = (value != (short)b) 00304 ? True : False; 00305 return res; 00306 } 00307 };// of xboolean 00308 #endif //xbool_h