X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fchoicecondition.h;h=91b5e71aa5e58bbc22ead2df8cf8a54bbc7ca7b8;hb=7db8b8a0a7561bb8b26ec78f89b408c91cba1878;hp=df4dacfd5c3e10f5e78abf9ad558f3e2e73a3b37;hpb=d0663f70ea5caea2db3c6d3c846ec67410db3498;p=poefilter.git diff --git a/source/choicecondition.h b/source/choicecondition.h index df4dacf..91b5e71 100644 --- a/source/choicecondition.h +++ b/source/choicecondition.h @@ -12,15 +12,16 @@ public: typedef typename Traits::Type Type; private: - Type value; + std::vector values; public: ChoiceCondition(Type); + ChoiceCondition(const std::vector &); - virtual Condition *clone() const; + virtual ChoiceCondition *clone() const; virtual bool can_merge(const Condition &, const CompoundCondition &) const; + virtual ChoiceCondition *merge(const std::vector &, const CompoundCondition &) const; virtual void add_lines(std::list &) const; - virtual void add_merged_lines(const std::vector &, const CompoundCondition &, std::list &) const; }; @@ -42,40 +43,56 @@ struct BaseTypeTraits typedef ChoiceCondition BaseTypeCondition; -template -ChoiceCondition::ChoiceCondition(Type v): - value(v) -{ } - -template -Condition *ChoiceCondition::clone() const +template +ChoiceCondition::ChoiceCondition(Type v) { - return new ChoiceCondition(value); + values.push_back(v); } -template -bool ChoiceCondition::can_merge(const Condition &other, const CompoundCondition &parent) const +template +ChoiceCondition::ChoiceCondition(const std::vector &v): + values(v) +{ } + +template +ChoiceCondition *ChoiceCondition::clone() const { - return dynamic_cast *>(&other) && dynamic_cast(&parent); + return new ChoiceCondition(values); } -template -void ChoiceCondition::add_lines(std::list &st) const +template +bool ChoiceCondition::can_merge(const Condition &other, const CompoundCondition &parent) const { - const char *keyword = Traits::get_keyword(); - FilterStatement::add_line(st, Msp::format("%s \"%s\"", keyword, value)); + return dynamic_cast *>(&other) && dynamic_cast(&parent); } -template -void ChoiceCondition::add_merged_lines(const std::vector &conditions, const CompoundCondition &parent, std::list &st) const +template +ChoiceCondition *ChoiceCondition::merge(const std::vector &conditions, const CompoundCondition &parent) const { - if(dynamic_cast(&parent)) + if(dynamic_cast(&parent) && !conditions.empty()) { - std::string line = Traits::get_keyword(); + ChoiceCondition *result = 0; for(std::vector::const_iterator i=conditions.begin(); i!=conditions.end(); ++i) - line += Msp::format(" \"%s\"", static_cast *>(*i)->value); - FilterStatement::add_line(st, line); + { + const std::vector &v = static_cast *>(*i)->values; + if(!result) + result = new ChoiceCondition(v); + else + result->values.insert(result->values.end(), v.begin(), v.end()); + } + return result; } + else + return 0; +} + +template +void ChoiceCondition::add_lines(std::list &st) const +{ + std::string line = Traits::get_keyword(); + for(typename std::vector::const_iterator i=values.begin(); i!=values.end(); ++i) + line += Msp::format(" \"%s\"", *i); + FilterStatement::add_line(st, line); } #endif