X-Git-Url: http://git.tdb.fi/?p=poefilter.git;a=blobdiff_plain;f=source%2Fchoicecondition.h;h=424dca6a8fce12be193e6a9fb02f8048db309a7a;hp=170af0e0634a27c4615eb6d5b35e1db8c6168601;hb=8b9d1f472e7bfbb1e097bb6d8bcad026e9636822;hpb=1805b8e549e6b5c0a53b2f735b8f2eb725f40b2e diff --git a/source/choicecondition.h b/source/choicecondition.h index 170af0e..424dca6 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 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,14 +44,20 @@ 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 ChoiceCondition *ChoiceCondition::clone() const { - return new ChoiceCondition(value); + return new ChoiceCondition(values); } template @@ -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(); ) + { + 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