+
+/// Conjunction of two boolean variables (AND)
+class VarBoolAndBool: public VarBool, public Observer<VarBool>
+{
+ public:
+ VarBoolAndBool( intf_thread_t *pIntf, VarBool &rVar1, VarBool &rVar2 );
+ virtual ~VarBoolAndBool();
+
+ // Get the boolean value
+ virtual bool get() const { return m_rVar1.get() && m_rVar2.get(); }
+
+ // Called when one of the observed variables is changed
+ void onUpdate( Subject<VarBool> &rVariable, void* );
+
+ private:
+ /// Boolean variables
+ VarBool &m_rVar1, &m_rVar2;
+};
+
+
+/// Disjunction of two boolean variables (OR)
+class VarBoolOrBool: public VarBool, public Observer<VarBool>
+{
+ public:
+ VarBoolOrBool( intf_thread_t *pIntf, VarBool &rVar1, VarBool &rVar2 );
+ virtual ~VarBoolOrBool();
+
+ // Get the boolean value
+ virtual bool get() const { return m_rVar1.get() || m_rVar2.get(); }
+
+ // Called when one of the observed variables is changed
+ void onUpdate( Subject<VarBool> &rVariable, void* );
+
+ private:
+ /// Boolean variables
+ VarBool &m_rVar1, &m_rVar2;
+};
+
+
+/// Negation of a boolean variable (NOT)
+class VarNotBool: public VarBool, public Observer<VarBool>
+{
+ public:
+ VarNotBool( intf_thread_t *pIntf, VarBool &rVar );
+ virtual ~VarNotBool();
+
+ // Get the boolean value
+ virtual bool get() const { return !m_rVar.get(); }
+
+ // Called when the observed variable is changed
+ void onUpdate( Subject<VarBool> &rVariable, void* );
+
+ private:
+ /// Boolean variable
+ VarBool &m_rVar;
+};
+
+