@@ -139,23 +139,26 @@ public final class _DataStorage {
139
139
} else {
140
140
var buffer = UnsafeMutableRawBufferPointer . allocate ( byteCount: range. count, alignment: MemoryLayout< UInt> . alignment)
141
141
defer { buffer. deallocate ( ) }
142
+
142
143
let sliceRange = NSRange ( location: range. lowerBound - _offset, length: range. count)
143
144
var enumerated = 0
144
145
d. enumerateBytes { ( ptr, byteRange, stop) in
145
- if NSIntersectionRange ( sliceRange, byteRange) . length > 0 {
146
- let lower = Swift . max ( byteRange. location, sliceRange. location)
147
- let upper = Swift . min ( byteRange. location + byteRange. length, sliceRange. location + sliceRange. length)
148
- let offset = lower - byteRange. location
149
- let effectiveRange = NSRange ( location: lower, length: upper - lower)
150
- if effectiveRange == sliceRange {
151
- memcpy ( buffer. baseAddress!, ptr, effectiveRange. length)
146
+ if byteRange. upperBound - _offset < range. lowerBound {
147
+ // before the range that we are looking for...
148
+ } else if byteRange. lowerBound - _offset > range. upperBound {
149
+ stop. pointee = true // we are past the range in question so we need to stop
150
+ } else {
151
+ // the byteRange somehow intersects the range in question that we are looking for...
152
+ let lower = Swift . max ( byteRange. lowerBound - _offset, range. lowerBound)
153
+ let upper = Swift . min ( byteRange. upperBound - _offset, range. upperBound)
154
+
155
+ let len = upper - lower
156
+ memcpy ( buffer. baseAddress!. advanced ( by: enumerated) , ptr. advanced ( by: lower - ( byteRange. lowerBound - _offset) ) , len)
157
+ enumerated += len
158
+
159
+ if upper == range. upperBound {
152
160
stop. pointee = true
153
- } else {
154
- memcpy ( buffer. baseAddress!. advanced ( by: enumerated) , ptr, effectiveRange. length)
155
161
}
156
- enumerated += byteRange. length
157
- } else if sliceRange. location + sliceRange. length < byteRange. location {
158
- stop. pointee = true
159
162
}
160
163
}
161
164
return try apply ( UnsafeRawBufferPointer ( buffer) )
@@ -170,22 +173,26 @@ public final class _DataStorage {
170
173
} else {
171
174
var buffer = UnsafeMutableRawBufferPointer . allocate ( byteCount: range. count, alignment: MemoryLayout< UInt> . alignment)
172
175
defer { buffer. deallocate ( ) }
176
+
173
177
let sliceRange = NSRange ( location: range. lowerBound - _offset, length: range. count)
174
178
var enumerated = 0
175
179
d. enumerateBytes { ( ptr, byteRange, stop) in
176
- if NSIntersectionRange ( sliceRange, byteRange) . length > 0 {
177
- let lower = Swift . max ( byteRange. location, sliceRange. location)
178
- let upper = Swift . min ( byteRange. location + byteRange. length, sliceRange. location + sliceRange. length)
179
- let effectiveRange = NSRange ( location: lower, length: upper - lower)
180
- if effectiveRange == sliceRange {
181
- memcpy ( buffer. baseAddress!, ptr, effectiveRange. length)
180
+ if byteRange. upperBound - _offset < range. lowerBound {
181
+ // before the range that we are looking for...
182
+ } else if byteRange. lowerBound - _offset > range. upperBound {
183
+ stop. pointee = true // we are past the range in question so we need to stop
184
+ } else {
185
+ // the byteRange somehow intersects the range in question that we are looking for...
186
+ let lower = Swift . max ( byteRange. lowerBound - _offset, range. lowerBound)
187
+ let upper = Swift . min ( byteRange. upperBound - _offset, range. upperBound)
188
+
189
+ let len = upper - lower
190
+ memcpy ( buffer. baseAddress!. advanced ( by: enumerated) , ptr. advanced ( by: lower - ( byteRange. lowerBound - _offset) ) , len)
191
+ enumerated += len
192
+
193
+ if upper == range. upperBound {
182
194
stop. pointee = true
183
- } else {
184
- memcpy ( buffer. baseAddress!. advanced ( by: enumerated) , ptr, effectiveRange. length)
185
195
}
186
- enumerated += byteRange. length
187
- } else if sliceRange. location + sliceRange. length < byteRange. location {
188
- stop. pointee = true
189
196
}
190
197
}
191
198
return try apply ( UnsafeRawBufferPointer ( buffer) )
0 commit comments