]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/condition.hxx
Collect properties from expression/condition trees.
[simgear.git] / simgear / props / condition.hxx
index 01ad8faa4d7f2f4c321a41c31fdba9a81049adc2..128cdfaf0c85fd374c723616af6335712a2c9f12 100644 (file)
 #ifndef __SG_CONDITION_HXX
 #define __SG_CONDITION_HXX
 
-#include <simgear/debug/logstream.hxx>
-#include <simgear/props/props.hxx>
-#include <simgear/props/props_io.hxx>
+#include <set>
+#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
+
+class SGPropertyNode;
 
-\f
 ////////////////////////////////////////////////////////////////////////
 // Conditions.
 ////////////////////////////////////////////////////////////////////////
  *
  * This class should migrate to somewhere more general.
  */
-class SGCondition
+class SGCondition : public SGReferenced
 {
 public:
   SGCondition ();
   virtual ~SGCondition ();
   virtual bool test () const = 0;
-};
-
-
-/**
- * Condition for a single property.
- *
- * This condition is true only if the property returns a boolean
- * true value.
- */
-class SGPropertyCondition : public SGCondition
-{
-public:
-  SGPropertyCondition ( SGPropertyNode *prop_root,
-                        const char * propname  );
-  virtual ~SGPropertyCondition ();
-  virtual bool test () const { return _node->getBoolValue(); }
-private:
-  SGConstPropertyNode_ptr _node;
-};
-
-
-/**
- * Condition for a 'not' operator.
- *
- * This condition is true only if the child condition is false.
- */
-class SGNotCondition : public SGCondition
-{
-public:
-                               // transfer pointer ownership
-  SGNotCondition (SGCondition * condition);
-  virtual ~SGNotCondition ();
-  virtual bool test () const;
-private:
-  SGCondition * _condition;
-};
-
-
-/**
- * Condition for an 'and' group.
- *
- * This condition is true only if all of the conditions
- * in the group are true.
- */
-class SGAndCondition : public SGCondition
-{
-public:
-  SGAndCondition ();
-  virtual ~SGAndCondition ();
-  virtual bool test () const;
-                               // transfer pointer ownership
-  virtual void addCondition (SGCondition * condition);
-private:
-  vector<SGCondition *> _conditions;
-};
-
-
-/**
- * Condition for an 'or' group.
- *
- * This condition is true if at least one of the conditions in the
- * group is true.
- */
-class SGOrCondition : public SGCondition
-{
-public:
-  SGOrCondition ();
-  virtual ~SGOrCondition ();
-  virtual bool test () const;
-                               // transfer pointer ownership
-  virtual void addCondition (SGCondition * condition);
-private:
-  vector<SGCondition *> _conditions;
-};
-
-
-/**
- * Abstract base class for property comparison conditions.
- */
-class SGComparisonCondition : public SGCondition
-{
-public:
-  enum Type {
-    LESS_THAN,
-    GREATER_THAN,
-    EQUALS
-  };
-  SGComparisonCondition (Type type, bool reverse = false);
-  virtual ~SGComparisonCondition ();
-  virtual bool test () const;
-  virtual void setLeftProperty( SGPropertyNode *prop_root,
-                                const char * propname );
-  virtual void setRightProperty( SGPropertyNode *prop_root,
-                                 const char * propname );
-                               // will make a local copy
-  virtual void setRightValue (const SGPropertyNode * value);
-private:
-  Type _type;
-  bool _reverse;
-  SGConstPropertyNode_ptr _left_property;
-  SGConstPropertyNode_ptr _right_property;
-  SGConstPropertyNode_ptr _right_value;
+  virtual void collectDependentProperties(std::set<const SGPropertyNode*>& props) const { }
 };
 
 
@@ -146,7 +46,7 @@ private:
  * invoke the test() method whenever it needs to decide whether to
  * active itself, draw itself, and so on.
  */
-class SGConditional
+class SGConditional : public SGReferenced
 {
 public:
   SGConditional ();
@@ -156,7 +56,7 @@ public:
   virtual const SGCondition * getCondition () const { return _condition; }
   virtual bool test () const;
 private:
-  SGCondition * _condition;
+  SGSharedPtr<SGCondition> _condition;
 };