Expression: Added ExpressionModifier class, used as base class for visitors that may modify its expressions.

This commit is contained in:
Eivind Kvedalen 2016-02-08 00:13:01 +01:00 committed by wmayer
parent 8c943d0ad7
commit 095c823fda
2 changed files with 22 additions and 0 deletions

View File

@ -46,6 +46,25 @@ public:
virtual void visit(Expression * e) = 0;
};
template<class P> class AppExport ExpressionModifier : public ExpressionVisitor {
public:
ExpressionModifier(P & _prop)
: prop(_prop) { }
virtual ~ExpressionModifier() { }
void setExpressionChanged() {
if (!signaller)
signaller = boost::shared_ptr<typename AtomicPropertyChangeInterface<P>::AtomicPropertyChange>(AtomicPropertyChangeInterface<P>::getAtomicPropertyChange(prop));
}
bool getChanged() const { return signaller != 0; }
protected:
P & prop;
boost::shared_ptr<typename AtomicPropertyChangeInterface<P>::AtomicPropertyChange> signaller;
};
/**
* Base class for expressions.
*

View File

@ -212,6 +212,7 @@ template<class P> class AtomicPropertyChangeInterface {
protected:
AtomicPropertyChangeInterface() : signalCounter(0) { }
public:
class AtomicPropertyChange {
public:
AtomicPropertyChange(P & prop) : mProp(prop) {
@ -234,6 +235,8 @@ protected:
P & mProp; /**< Referenced to property we work on */
};
static AtomicPropertyChange * getAtomicPropertyChange(P & prop) { return new AtomicPropertyChange(prop); }
private:
int signalCounter; /**< Counter for invoking transaction start/stop */