summaryrefslogtreecommitdiff
path: root/src/generic/problemresolver/incremental_expression.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/generic/problemresolver/incremental_expression.h')
-rw-r--r--src/generic/problemresolver/incremental_expression.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/generic/problemresolver/incremental_expression.h b/src/generic/problemresolver/incremental_expression.h
index 0f670d57..737925b4 100644
--- a/src/generic/problemresolver/incremental_expression.h
+++ b/src/generic/problemresolver/incremental_expression.h
@@ -113,6 +113,16 @@ public:
return expr;
}
+ bool operator==(const expression_weak_ref &other) const
+ {
+ return expr == other.expr;
+ }
+
+ bool operator==(const T *other) const
+ {
+ return expr == other;
+ }
+
~expression_weak_ref();
};
@@ -198,6 +208,33 @@ public:
parents.push_back(parent);
}
+private:
+ class parent_equals_weak_ref
+ {
+ const expression_container<T> *parent;
+
+ public:
+ parent_equals_weak_ref(const expression_container<T> *_parent)
+ : parent(_parent)
+ {
+ }
+
+ bool operator()(const expression_weak_ref<expression_container<T> > &other) const
+ {
+ return other == parent;
+ }
+ };
+
+public:
+ void remove_parent(expression_container<T> *parent)
+ {
+ // Will be inefficient if this happens a lot, but I don't expect
+ // it to be a common operation.
+ parents.erase(std::remove_if(parents.begin(), parents.end(),
+ parent_equals_weak_ref(parent)),
+ parents.end());
+ }
+
virtual T get_value() = 0;
virtual void dump(std::ostream &out) = 0;
};
@@ -256,6 +293,7 @@ public:
typename std::vector<cwidget::util::ref_ptr<expression<T> > >::iterator
new_end = std::remove(children.begin(), children.end(), child);
+ child->remove_parent(this);
children.erase(new_end, children.end());
}