diff --git a/modules/juce_graphics/detail/juce_Ranges.cpp b/modules/juce_graphics/detail/juce_Ranges.cpp index 4449d7a7a8..ea05cd2f17 100644 --- a/modules/juce_graphics/detail/juce_Ranges.cpp +++ b/modules/juce_graphics/detail/juce_Ranges.cpp @@ -406,6 +406,33 @@ public: ranges.drop ({ -1000, 1000 }); expect (ranges.isEmpty()); } + + beginTest ("Ranges::covers()"); + { + Ranges ranges; + + ranges.set ({ 0, 48 }); + ranges.set ({ 48, 49 }); + ranges.set ({ 55, 94 }); + ranges.set ({ 94, 127 }); + ranges.set ({ 127, 150 }); + + expect (ranges.covers ({ 0, 48 })); + expect (ranges.covers ({ 0, 20 })); + expect (ranges.covers ({ 10, 30 })); + expect (ranges.covers ({ 30, 48 })); + expect (ranges.covers ({ 30, 49 })); + expect (ranges.covers ({ 55, 150 })); + expect (ranges.covers ({ 60, 145 })); + + expect (! ranges.covers ({ -1, 10 })); + expect (! ranges.covers ({ 1, 50 })); + expect (! ranges.covers ({ 50, 140 })); + expect (! ranges.covers ({ 149, 151 })); + + expect (ranges.covers ({ 10, 10 })); + expect (! ranges.covers ({ 151, 151 })); + } } }; diff --git a/modules/juce_graphics/detail/juce_Ranges.h b/modules/juce_graphics/detail/juce_Ranges.h index 18edc3a00c..a84987db5a 100644 --- a/modules/juce_graphics/detail/juce_Ranges.h +++ b/modules/juce_graphics/detail/juce_Ranges.h @@ -385,6 +385,25 @@ struct Ranges final return iter != ranges.end() ? std::make_optional (getIndex (iter)) : std::nullopt; } + /* Returns true if this object covers each element in the provided range. For empty ranges it + returns true if the start value is covered. + */ + bool covers (Range range) const + { + for (auto curr = find (range.getStart()), prev = curr; curr != cend(); ++curr) + { + if (prev != curr && prev->getEnd() != curr->getStart()) + return false; + + if (range.getEnd() <= curr->getEnd()) + return true; + + prev = curr; + } + + return false; + } + private: size_t getIndex (std::vector>::const_iterator it) const {