X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fchoicecondition.h;h=91b5e71aa5e58bbc22ead2df8cf8a54bbc7ca7b8;hb=f3d3b7227de162f824b8be6be4028a8848f11f2f;hp=6e2954dbf04790ea6ebfb1a3530463880dcf2b93;hpb=715006802a65fa5f541f2f4bcccbdd62d1a2bf09;p=poefilter.git diff --git a/source/choicecondition.h b/source/choicecondition.h index 6e2954d..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; }; @@ -43,12 +44,18 @@ typedef ChoiceCondition BaseTypeCondition; template -ChoiceCondition::ChoiceCondition(Type v): - value(v) +ChoiceCondition::ChoiceCondition(Type v) +{ + values.push_back(v); +} + +template +ChoiceCondition::ChoiceCondition(const std::vector &v): + values(v) { } template -Condition *ChoiceCondition::clone() const +ChoiceCondition *ChoiceCondition::clone() const { return new ChoiceCondition(values); } @@ -60,22 +67,32 @@ bool ChoiceCondition::can_merge(const Condition &other, const CompoundConditi } template -void ChoiceCondition::add_lines(std::list &st) const +ChoiceCondition *ChoiceCondition::merge(const std::vector &conditions, const CompoundCondition &parent) const { - const char *keyword = Traits::get_keyword(); - FilterStatement::add_line(st, Msp::format("%s \"%s\"", keyword, value)); + if(dynamic_cast(&parent) && !conditions.empty()) + { + ChoiceCondition *result = 0; + for(std::vector::const_iterator i=conditions.begin(); i!=conditions.end(); ++i) + { + 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_merged_lines(const std::vector &conditions, const CompoundCondition &parent, std::list &st) const +void ChoiceCondition::add_lines(std::list &st) const { - if(dynamic_cast(&parent)) - { - std::string line = Traits::get_keyword(); - 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); - } + 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