RangeCondition(Type);
RangeCondition(Type, Type);
- virtual Condition *clone() const;
+ virtual RangeCondition<T> *clone() const;
+ virtual bool can_merge(const Condition &, const CompoundCondition &) const;
+ virtual RangeCondition<T> *merge(const std::vector<Condition *> &, const CompoundCondition &) const;
virtual void add_lines(std::list<FilterStatement> &) const;
};
typedef RangeCondition<LinkedSocketsTraits> LinkedSocketsCondition;
-template<typename Traits>
-RangeCondition<Traits>::RangeCondition(Type v):
+template<typename T>
+RangeCondition<T>::RangeCondition(Type v):
min(v),
max(v)
{ }
-template<typename Traits>
-RangeCondition<Traits>::RangeCondition(Type n, Type x):
+template<typename T>
+RangeCondition<T>::RangeCondition(Type n, Type x):
min(n),
max(x)
{ }
-template<typename Traits>
-Condition *RangeCondition<Traits>::clone() const
+template<typename T>
+RangeCondition<T> *RangeCondition<T>::clone() const
+{
+ return new RangeCondition<T>(min, max);
+}
+
+template<typename T>
+bool RangeCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
{
- return new RangeCondition<Traits>(min, max);
+ return dynamic_cast<const RangeCondition<T> *>(&other) && dynamic_cast<const AndCondition *>(&parent);
}
-template<typename Traits>
-void RangeCondition<Traits>::add_lines(std::list<FilterStatement> &st) const
+template<typename T>
+RangeCondition<T> *RangeCondition<T>::merge(const std::vector<Condition *> &conditions, const CompoundCondition &parent) const
+{
+ if(dynamic_cast<const AndCondition *>(&parent) && !conditions.empty())
+ {
+ RangeCondition<T> *result = new RangeCondition<T>(Traits::get_min(), Traits::get_max());
+ for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
+ {
+ const RangeCondition<T> *c = static_cast<RangeCondition<T> *>(*i);
+ result->min = std::max(result->min, c->min);
+ result->max = std::min(result->max, c->max);
+ }
+ return result;
+ }
+ else
+ return 0;
+}
+
+template<typename T>
+void RangeCondition<T>::add_lines(std::list<FilterStatement> &st) const
{
const char *keyword = Traits::get_keyword();
if(min==max)