+ unsigned count() const { return conditions.size(); }
+ const Condition &get(unsigned) const;
+
+ virtual Condition *flatten() const;
+protected:
+ Condition *dispatch_flatten(Condition *, Condition *) const;
+ static Condition *merge_two(Condition *, Condition *, const CompoundCondition &, bool);
+ static Condition *add_merged_to(Condition *, CompoundCondition *, bool);
+ static Condition *merge_contents_to(CompoundCondition *, CompoundCondition *);
+ virtual Condition *flatten(Condition *, Condition *) const = 0;
+ virtual Condition *flatten(AndCondition *, Condition *) const = 0;
+ virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
+ virtual Condition *flatten(OrCondition *, Condition *) const = 0;
+ virtual Condition *flatten(OrCondition *, AndCondition *) const = 0;
+ virtual Condition *flatten(OrCondition *, OrCondition *) const = 0;