From 0dc97de993d28f4015a2a0ad2cc4af62acc56a42 Mon Sep 17 00:00:00 2001 From: attila Date: Thu, 21 Nov 2024 17:29:20 +0100 Subject: [PATCH] Add Ranges::eraseUpTo --- modules/juce_graphics/detail/juce_Ranges.cpp | 35 ++++++++++++++++++++ modules/juce_graphics/detail/juce_Ranges.h | 8 +++++ 2 files changed, 43 insertions(+) diff --git a/modules/juce_graphics/detail/juce_Ranges.cpp b/modules/juce_graphics/detail/juce_Ranges.cpp index 2c88c9fb1a..4449d7a7a8 100644 --- a/modules/juce_graphics/detail/juce_Ranges.cpp +++ b/modules/juce_graphics/detail/juce_Ranges.cpp @@ -663,6 +663,41 @@ public: expectRangedValuesItem (rangedValues.getItem (5), { 45, 60 }, 'd'); } + beginTest ("RangedValues::eraseUpTo() - erasing before all ranges has no effect"); + { + auto rangedValues = createRangedValuesObjectForErase(); + + rangedValues.eraseUpTo (rangedValues.getRanges().get (0).getStart()); + + expectRangedValuesItem (rangedValues.getItem (0), { 0, 10 }, 'a'); + expectRangedValuesItem (rangedValues.getItem (1), { 11, 20 }, 'b'); + expectRangedValuesItem (rangedValues.getItem (2), { 23, 30 }, 'c'); + expectRangedValuesItem (rangedValues.getItem (3), { 35, 45 }, 'c'); + expectRangedValuesItem (rangedValues.getItem (4), { 45, 60 }, 'd'); + } + + beginTest ("RangedValues::eraseUpTo() - erasing values up to, not including 15"); + { + auto rangedValues = createRangedValuesObjectForErase(); + + rangedValues.eraseUpTo (15); + + expectRangedValuesItem (rangedValues.getItem (0), { 15, 20 }, 'b'); + expectRangedValuesItem (rangedValues.getItem (1), { 23, 30 }, 'c'); + expectRangedValuesItem (rangedValues.getItem (2), { 35, 45 }, 'c'); + expectRangedValuesItem (rangedValues.getItem (3), { 45, 60 }, 'd'); + } + + beginTest ("RangedValues::eraseUpTo() - erasing up to the end of all ranges clears the container"); + { + auto rangedValues = createRangedValuesObjectForErase(); + const auto ranges = rangedValues.getRanges(); + + rangedValues.eraseUpTo (ranges.get (ranges.size() - 1).getEnd()); + + expect (rangedValues.isEmpty()); + } + beginTest ("RangedValues::drop() - drop shifts ranges downward on the right side"); { auto rangedValues = createRangedValuesObjectForErase(); diff --git a/modules/juce_graphics/detail/juce_Ranges.h b/modules/juce_graphics/detail/juce_Ranges.h index 7507242709..b27f2ac360 100644 --- a/modules/juce_graphics/detail/juce_Ranges.h +++ b/modules/juce_graphics/detail/juce_Ranges.h @@ -638,6 +638,14 @@ public: return erase ({ i, ranges.get (ranges.size() - 1).getEnd() }); } + Ranges::Operations eraseUpTo (int64 i) + { + if (ranges.isEmpty()) + return {}; + + return erase ({ ranges.get (0).getStart(), i }); + } + /** Create a RangedValues object from non-overlapping ranges. */ template auto setForEach (Iterable begin, Iterable end)