- declared FGCondition class and subclasses
- declared FGConditional abstract base class - declared fgReadCondition global function
This commit is contained in:
parent
4de352cbe8
commit
1f4788fbb5
1 changed files with 157 additions and 0 deletions
|
@ -691,5 +691,162 @@ fgTie (const string &name, T * obj, int index,
|
|||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Conditions.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* An encoded condition.
|
||||
*
|
||||
* This class encodes a single condition of some sort, possibly
|
||||
* connected with properties.
|
||||
*
|
||||
* This class should migrate to somewhere more general.
|
||||
*/
|
||||
class FGCondition
|
||||
{
|
||||
public:
|
||||
FGCondition ();
|
||||
virtual ~FGCondition ();
|
||||
virtual bool test () const = 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Condition for a single property.
|
||||
*
|
||||
* This condition is true only if the property returns a boolean
|
||||
* true value.
|
||||
*/
|
||||
class FGPropertyCondition : public FGCondition
|
||||
{
|
||||
public:
|
||||
FGPropertyCondition (const string &propname);
|
||||
virtual ~FGPropertyCondition ();
|
||||
virtual bool test () const { return _node->getBoolValue(); }
|
||||
private:
|
||||
const SGPropertyNode * _node;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Condition for a 'not' operator.
|
||||
*
|
||||
* This condition is true only if the child condition is false.
|
||||
*/
|
||||
class FGNotCondition : public FGCondition
|
||||
{
|
||||
public:
|
||||
// transfer pointer ownership
|
||||
FGNotCondition (FGCondition * condition);
|
||||
virtual ~FGNotCondition ();
|
||||
virtual bool test () const;
|
||||
private:
|
||||
FGCondition * _condition;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Condition for an 'and' group.
|
||||
*
|
||||
* This condition is true only if all of the conditions
|
||||
* in the group are true.
|
||||
*/
|
||||
class FGAndCondition : public FGCondition
|
||||
{
|
||||
public:
|
||||
FGAndCondition ();
|
||||
virtual ~FGAndCondition ();
|
||||
virtual bool test () const;
|
||||
// transfer pointer ownership
|
||||
virtual void addCondition (FGCondition * condition);
|
||||
private:
|
||||
vector<FGCondition *> _conditions;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Condition for an 'or' group.
|
||||
*
|
||||
* This condition is true if at least one of the conditions in the
|
||||
* group is true.
|
||||
*/
|
||||
class FGOrCondition : public FGCondition
|
||||
{
|
||||
public:
|
||||
FGOrCondition ();
|
||||
virtual ~FGOrCondition ();
|
||||
virtual bool test () const;
|
||||
// transfer pointer ownership
|
||||
virtual void addCondition (FGCondition * condition);
|
||||
private:
|
||||
vector<FGCondition *> _conditions;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Abstract base class for property comparison conditions.
|
||||
*/
|
||||
class FGComparisonCondition : public FGCondition
|
||||
{
|
||||
public:
|
||||
enum Type {
|
||||
LESS_THAN,
|
||||
GREATER_THAN,
|
||||
EQUALS
|
||||
};
|
||||
FGComparisonCondition (Type type, bool reverse = false);
|
||||
virtual ~FGComparisonCondition ();
|
||||
virtual bool test () const;
|
||||
virtual void setLeftProperty (const string &propname);
|
||||
virtual void setRightProperty (const string &propname);
|
||||
// will make a local copy
|
||||
virtual void setRightValue (const SGPropertyNode * value);
|
||||
private:
|
||||
Type _type;
|
||||
bool _reverse;
|
||||
const SGPropertyNode * _left_property;
|
||||
const SGPropertyNode * _right_property;
|
||||
const SGPropertyNode * _right_value;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Base class for a conditional components.
|
||||
*
|
||||
* This class manages the conditions and tests; the component should
|
||||
* invoke the test() method whenever it needs to decide whether to
|
||||
* active itself, draw itself, and so on.
|
||||
*/
|
||||
class FGConditional
|
||||
{
|
||||
public:
|
||||
FGConditional ();
|
||||
virtual ~FGConditional ();
|
||||
// transfer pointer ownership
|
||||
virtual void setCondition (FGCondition * condition);
|
||||
virtual const FGCondition * getCondition () const { return _condition; }
|
||||
virtual bool test () const;
|
||||
private:
|
||||
FGCondition * _condition;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Global function to make a condition out of properties.
|
||||
*
|
||||
* The top-level is always an implicit 'and' group, whatever the
|
||||
* node's name (it should usually be "condition").
|
||||
*
|
||||
* @param node The top-level condition node (usually named "condition").
|
||||
* @return A pointer to a newly-allocated condition; it is the
|
||||
* responsibility of the caller to delete the condition when
|
||||
* it is no longer needed.
|
||||
*/
|
||||
FGCondition * fgReadCondition (const SGPropertyNode * node);
|
||||
|
||||
|
||||
#endif // __FG_PROPS_HXX
|
||||
|
||||
|
|
Loading…
Reference in a new issue