X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frangecondition.h;h=7d85125b6dae6392be187bf4932bf14b54f57867;hb=5fcd94eb19afc9291a2f99b4b6fe1ec4ee4661d1;hp=ad54e0a0582f6e89cdd3b1834cc06a88aa334e70;hpb=0cb9452fe3f8cfd3beec53a84bc8df9306fbd44f;p=poefilter.git diff --git a/source/rangecondition.h b/source/rangecondition.h index ad54e0a..7d85125 100644 --- a/source/rangecondition.h +++ b/source/rangecondition.h @@ -20,8 +20,9 @@ public: RangeCondition(Type, Type); virtual RangeCondition *clone() const; + virtual bool equals(const Condition &) const; virtual bool can_merge(const Condition &, const CompoundCondition &) const; - virtual RangeCondition *merge(const std::vector &, const CompoundCondition &) const; + virtual RangeCondition *merge(const std::vector &, const CompoundCondition &) const; virtual bool is_viable() const { return min<=max; } virtual void add_lines(std::list &) const; }; @@ -71,6 +72,17 @@ struct DropLevelTraits typedef RangeCondition DropLevelCondition; +struct MapTierTraits +{ + typedef unsigned Type; + static unsigned get_min() { return 1; } + static unsigned get_max() { return 17; } + static const char *get_keyword() { return "MapTier"; } +}; + +typedef RangeCondition MapTierCondition; + + struct WidthTraits { typedef unsigned Type; @@ -133,6 +145,16 @@ RangeCondition *RangeCondition::clone() const return new RangeCondition(min, max); } +template +bool RangeCondition::equals(const Condition &other) const +{ + const RangeCondition *other_range = dynamic_cast *>(&other); + if(!other_range) + return false; + + return (min==other_range->min && max==other_range->max); +} + template bool RangeCondition::can_merge(const Condition &other, const CompoundCondition &parent) const { @@ -149,7 +171,7 @@ bool RangeCondition::can_merge(const Condition &other, const CompoundConditio } template -RangeCondition *RangeCondition::merge(const std::vector &conditions, const CompoundCondition &parent) const +RangeCondition *RangeCondition::merge(const std::vector &conditions, const CompoundCondition &parent) const { if(conditions.empty()) return 0; @@ -160,9 +182,9 @@ RangeCondition *RangeCondition::merge(const std::vector &cond result = new RangeCondition(Traits::get_min(), Traits::get_max()); else result = new RangeCondition(Traits::get_max(), Traits::get_min()); - for(std::vector::const_iterator i=conditions.begin(); i!=conditions.end(); ++i) + for(std::vector::const_iterator i=conditions.begin(); i!=conditions.end(); ++i) { - const RangeCondition *c = static_cast *>(*i); + const RangeCondition *c = static_cast *>(*i); if(intersect) { result->min = std::max(result->min, c->min);