Skip to content

Commit 2a1ecb4

Browse files
committed
BarLineScatterCandleBubbleRenderer.XBounds conformance to RangeExpression and Sequence
Sequence conformance simplifies for-in loops Looking forward to when data types conforming to Collection, RangeExpression conformance by XBounds allows for slicing of the collections further simplifying algorithms on data/datasets.
1 parent f2795b9 commit 2a1ecb4

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

Source/Charts/Renderers/BarLineScatterCandleBubbleRenderer.swift

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,46 @@ open class BarLineScatterCandleBubbleRenderer: DataRenderer
7878
let low = chart.lowestVisibleX
7979
let high = chart.highestVisibleX
8080

81-
let entryFrom = dataSet.entryForXValue(low, closestToY: Double.nan, rounding: ChartDataSetRounding.down)
82-
let entryTo = dataSet.entryForXValue(high, closestToY: Double.nan, rounding: ChartDataSetRounding.up)
81+
let entryFrom = dataSet.entryForXValue(low, closestToY: .nan, rounding: .down)
82+
let entryTo = dataSet.entryForXValue(high, closestToY: .nan, rounding: .up)
8383

8484
self.min = entryFrom == nil ? 0 : dataSet.entryIndex(entry: entryFrom!)
8585
self.max = entryTo == nil ? 0 : dataSet.entryIndex(entry: entryTo!)
8686
range = Int(Double(self.max - self.min) * phaseX)
8787
}
8888
}
8989
}
90+
91+
extension BarLineScatterCandleBubbleRenderer.XBounds: RangeExpression {
92+
public func relative<C>(to collection: C) -> Swift.Range<Int>
93+
where C : Collection, Bound == C.Index
94+
{
95+
return Swift.Range<Int>(min...min + range)
96+
}
97+
98+
public func contains(_ element: Int) -> Bool {
99+
return (min...min + range).contains(element)
100+
}
101+
}
102+
103+
extension BarLineScatterCandleBubbleRenderer.XBounds: Sequence {
104+
public struct Iterator: IteratorProtocol {
105+
private let bounds: BarLineScatterCandleBubbleRenderer.XBounds
106+
private var value: Int
107+
108+
fileprivate init(bounds: BarLineScatterCandleBubbleRenderer.XBounds) {
109+
self.bounds = bounds
110+
self.value = bounds.min
111+
}
112+
113+
public mutating func next() -> Int? {
114+
guard value < bounds.max else { return nil }
115+
value += 1
116+
return value
117+
}
118+
}
119+
120+
public func makeIterator() -> Iterator {
121+
return Iterator(bounds: self)
122+
}
123+
}

Source/Charts/Renderers/BubbleChartRenderer.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ open class BubbleChartRenderer: BarLineScatterCandleBubbleRenderer
105105
let maxBubbleHeight: CGFloat = abs(viewPortHandler.contentBottom - viewPortHandler.contentTop)
106106
let referenceSize: CGFloat = min(maxBubbleHeight, maxBubbleWidth)
107107

108-
for j in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
108+
for j in _xBounds
109109
{
110110
guard let entry = dataSet.entryForIndex(j) as? BubbleChartDataEntry else { continue }
111111

@@ -185,7 +185,7 @@ open class BubbleChartRenderer: BarLineScatterCandleBubbleRenderer
185185

186186
let iconsOffset = dataSet.iconsOffset
187187

188-
for j in _xBounds.min..._xBounds.range + _xBounds.min
188+
for j in _xBounds
189189
{
190190
guard let e = dataSet.entryForIndex(j) as? BubbleChartDataEntry else { break }
191191

Source/Charts/Renderers/CandleStickChartRenderer.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ open class CandleStickChartRenderer: LineScatterCandleRadarRenderer
7777

7878
context.setLineWidth(dataSet.shadowWidth)
7979

80-
for j in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
80+
for j in _xBounds
8181
{
8282
// get the entry
8383
guard let e = dataSet.entryForIndex(j) as? CandleChartDataEntry else { continue }
@@ -313,7 +313,7 @@ open class CandleStickChartRenderer: LineScatterCandleRadarRenderer
313313
let lineHeight = valueFont.lineHeight
314314
let yOffset: CGFloat = lineHeight + 5.0
315315

316-
for j in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
316+
for j in _xBounds
317317
{
318318
guard let e = dataSet.entryForIndex(j) as? CandleChartDataEntry else { break }
319319

Source/Charts/Renderers/LineChartRenderer.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ open class LineChartRenderer: LineRadarRenderer
214214
// let the spline start
215215
cubicPath.move(to: CGPoint(x: CGFloat(cur.x), y: CGFloat(cur.y * phaseY)), transform: valueToPixelMatrix)
216216

217-
for j in stride(from: (_xBounds.min + 1), through: _xBounds.range + _xBounds.min, by: 1)
217+
for j in _xBounds.dropFirst()
218218
{
219219
prev = cur
220220
cur = dataSet.entryForIndex(j)
@@ -325,7 +325,7 @@ open class LineChartRenderer: LineRadarRenderer
325325
_lineSegments = [CGPoint](repeating: CGPoint(), count: pointsPerEntryPair)
326326
}
327327

328-
for j in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
328+
for j in _xBounds
329329
{
330330
var e: ChartDataEntry! = dataSet.entryForIndex(j)
331331

@@ -391,7 +391,7 @@ open class LineChartRenderer: LineRadarRenderer
391391
context.beginPath()
392392
var firstPoint = true
393393

394-
for x in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
394+
for x in _xBounds
395395
{
396396
e1 = dataSet.entryForIndex(x == 0 ? 0 : (x - 1))
397397
e2 = dataSet.entryForIndex(x)
@@ -544,7 +544,7 @@ open class LineChartRenderer: LineRadarRenderer
544544

545545
_xBounds.set(chart: dataProvider, dataSet: dataSet, animator: animator)
546546

547-
for j in stride(from: _xBounds.min, through: min(_xBounds.min + _xBounds.range, _xBounds.max), by: 1)
547+
for j in _xBounds
548548
{
549549
guard let e = dataSet.entryForIndex(j) else { break }
550550

@@ -649,7 +649,7 @@ open class LineChartRenderer: LineRadarRenderer
649649
(dataSet.circleHoleColor == nil ||
650650
dataSet.circleHoleColor == NSUIColor.clear)
651651

652-
for j in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
652+
for j in _xBounds
653653
{
654654
guard let e = dataSet.entryForIndex(j) else { break }
655655

Source/Charts/Renderers/ScatterChartRenderer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ open class ScatterChartRenderer: LineScatterCandleRadarRenderer
151151

152152
_xBounds.set(chart: dataProvider, dataSet: dataSet, animator: animator)
153153

154-
for j in stride(from: _xBounds.min, through: _xBounds.range + _xBounds.min, by: 1)
154+
for j in _xBounds
155155
{
156156
guard let e = dataSet.entryForIndex(j) else { break }
157157

0 commit comments

Comments
 (0)