RangeCondition(Type, Type);
virtual RangeCondition<T> *clone() const;
+ virtual bool equals(const Condition &) const;
virtual bool can_merge(const Condition &, const CompoundCondition &) const;
- virtual RangeCondition<T> *merge(const std::vector<Condition *> &, const CompoundCondition &) const;
+ virtual RangeCondition<T> *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
virtual bool is_viable() const { return min<=max; }
virtual void add_lines(std::list<FilterStatement> &) const;
};
return new RangeCondition<T>(min, max);
}
+template<typename T>
+bool RangeCondition<T>::equals(const Condition &other) const
+{
+ const RangeCondition<T> *other_range = dynamic_cast<const RangeCondition<T> *>(&other);
+ if(!other_range)
+ return false;
+
+ return (min==other_range->min && max==other_range->max);
+}
+
template<typename T>
bool RangeCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
{
}
template<typename T>
-RangeCondition<T> *RangeCondition<T>::merge(const std::vector<Condition *> &conditions, const CompoundCondition &parent) const
+RangeCondition<T> *RangeCondition<T>::merge(const std::vector<const Condition *> &conditions, const CompoundCondition &parent) const
{
if(conditions.empty())
return 0;
result = new RangeCondition<T>(Traits::get_min(), Traits::get_max());
else
result = new RangeCondition<T>(Traits::get_max(), Traits::get_min());
- for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
+ for(std::vector<const Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
{
- const RangeCondition<T> *c = static_cast<RangeCondition<T> *>(*i);
+ const RangeCondition<T> *c = static_cast<const RangeCondition<T> *>(*i);
if(intersect)
{
result->min = std::max(result->min, c->min);