Skip to content

Commit 7adedd8

Browse files
committed
Some safety fixes.
1 parent 81e2de8 commit 7adedd8

File tree

2 files changed

+33
-50
lines changed

2 files changed

+33
-50
lines changed

Sources/SwiftRoaring/RoaringBitmap.swift

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
5050
* Creates a new bitmap from a pointer of uint32_t integers
5151
*/
5252
public init(values: [UInt32]) {
53-
let ptr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: values)
54-
self.ptr = croaring.roaring_bitmap_of_ptr(values.count, ptr)!
53+
self.ptr = croaring.roaring_bitmap_of_ptr(values.count, values)!
5554
}
5655

5756
public required init(arrayLiteral: Element...) {
@@ -186,18 +185,14 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
186185
}
187186

188187
/**
189-
* Inplace version of roaring_bitmap_or, modifies x1. TDOO: decide whether x1 ==
190-
*x2 ok
191-
*
188+
* Inplace version of roaring_bitmap_or, modifies x1.
192189
*/
193190
public func formUnion(_ x: RoaringBitmap) {
194191
croaring.roaring_bitmap_or_inplace(self.ptr, x.ptr)
195192

196193
}
197194
/**
198-
* Inplace version of roaring_bitmap_or, modifies x1. TDOO: decide whether x1 ==
199-
*x2 ok
200-
*
195+
* Inplace version of roaring_bitmap_or, modifies x1.
201196
*/
202197
public static func |=(left: RoaringBitmap, right: RoaringBitmap){
203198
left.formUnion(right)
@@ -207,16 +202,14 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
207202
* Compute the union of 'number' bitmaps. See also roaring_bitmap_or_many_heap.
208203
* Caller is responsible for freeing the
209204
* result.
210-
*
211205
*/
212206
public func unionMany(_ xs: [RoaringBitmap]) -> RoaringBitmap {
213-
var ptrArray: [UnsafePointer<roaring_bitmap_t>?] = []
214-
ptrArray.append(self.ptr)
215-
for x in xs {
216-
ptrArray.append(x.ptr)
207+
let ptr = UnsafeMutablePointer<Optional<UnsafePointer<roaring_bitmap_t>>>.allocate(capacity: xs.count + 1)
208+
ptr[0] = UnsafePointer<roaring_bitmap_t>(self.ptr)
209+
for (index, bitmap) in xs.enumerated() {
210+
ptr[index + 1] = UnsafePointer<roaring_bitmap_t>(bitmap.ptr)
217211
}
218-
let ptrArrayPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: ptrArray)
219-
return RoaringBitmap(ptr: croaring.roaring_bitmap_or_many(ptrArray.count, ptrArrayPtr))
212+
return RoaringBitmap(ptr: croaring.roaring_bitmap_or_many(xs.count + 1, ptr))
220213

221214
}
222215

@@ -228,14 +221,12 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
228221
*
229222
*/
230223
public func unionManyHeap(_ xs: [RoaringBitmap]) -> RoaringBitmap {
231-
var ptrArray: [UnsafePointer<roaring_bitmap_t>?] = []
232-
ptrArray.append(self.ptr)
233-
for x in xs {
234-
ptrArray.append(x.ptr)
224+
let ptr = UnsafeMutablePointer<Optional<UnsafePointer<roaring_bitmap_t>>>.allocate(capacity: xs.count + 1)
225+
ptr[0] = UnsafePointer<roaring_bitmap_t>(self.ptr)
226+
for (index, bitmap) in xs.enumerated() {
227+
ptr[index + 1] = UnsafePointer<roaring_bitmap_t>(bitmap.ptr)
235228
}
236-
let ptrArrayPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: ptrArray)
237-
return RoaringBitmap(ptr: croaring.roaring_bitmap_or_many_heap(UInt32(ptrArray.count), ptrArrayPtr))
238-
229+
return RoaringBitmap(ptr: croaring.roaring_bitmap_or_many_heap(UInt32(xs.count + 1), ptr))
239230
}
240231

241232
/**
@@ -278,14 +269,12 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
278269
*
279270
*/
280271
public func symmetricDifferenceMany(_ xs: [RoaringBitmap]) -> RoaringBitmap {
281-
var ptrArray: [UnsafePointer<roaring_bitmap_t>?] = []
282-
for x in xs {
283-
ptrArray.append(x.ptr)
272+
let ptr = UnsafeMutablePointer<Optional<UnsafePointer<roaring_bitmap_t>>>.allocate(capacity: xs.count + 1)
273+
ptr[0] = UnsafePointer<roaring_bitmap_t>(self.ptr)
274+
for (index, bitmap) in xs.enumerated() {
275+
ptr[index + 1] = UnsafePointer<roaring_bitmap_t>(bitmap.ptr)
284276
}
285-
ptrArray.append(self.ptr)
286-
let ptrArrayPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: ptrArray)
287-
return RoaringBitmap(ptr: croaring.roaring_bitmap_xor_many(ptrArray.count, ptrArrayPtr))
288-
277+
return RoaringBitmap(ptr: croaring.roaring_bitmap_xor_many(xs.count + 1, ptr))
289278
}
290279

291280

@@ -493,8 +482,7 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
493482
*
494483
*/
495484
public func addMany(values: [UInt32]) {
496-
let ptr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: values)
497-
croaring.roaring_bitmap_add_many(self.ptr, values.count, ptr)
485+
croaring.roaring_bitmap_add_many(self.ptr, values.count, values)
498486
}
499487

500488
/**
@@ -680,18 +668,16 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
680668
* Returns how many bytes were written which should be
681669
* roaring_bitmap_size_in_bytes(ra).
682670
*/
683-
public func serialize(buffer: [Int8]) -> size_t {
684-
let ptr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: buffer)
685-
return croaring.roaring_bitmap_serialize(self.ptr, ptr)
671+
public func serialize(buffer: inout [Int8]) -> size_t {
672+
return croaring.roaring_bitmap_serialize(self.ptr, &buffer)
686673
}
687674

688675
/** use with roaring_bitmap_serialize
689676
* see roaring_bitmap_portable_deserialize if you want a format that's
690677
* compatible with Java and Go implementations
691678
*/
692679
public static func deserialize(buffer: [Int8]) -> RoaringBitmap {
693-
let bufferPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: buffer)
694-
return RoaringBitmap(ptr: croaring.roaring_bitmap_deserialize(bufferPtr)!)
680+
return RoaringBitmap(ptr: croaring.roaring_bitmap_deserialize(buffer)!)
695681
}
696682

697683
/**
@@ -713,8 +699,7 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
713699
* call roaring_bitmap_portable_deserialize_safe.
714700
*/
715701
public static func portableDeserialize(buffer: [Int8]) -> RoaringBitmap {
716-
let bufferPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: buffer)
717-
return RoaringBitmap(ptr: croaring.roaring_bitmap_portable_deserialize(bufferPtr)!)
702+
return RoaringBitmap(ptr: croaring.roaring_bitmap_portable_deserialize(buffer)!)
718703
}
719704

720705
/**
@@ -725,8 +710,7 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
725710
* In case of failure, a null pointer is returned.
726711
*/
727712
public static func portableDeserializeSafe(buffer: [Int8], maxbytes: size_t) -> RoaringBitmap {
728-
let bufferPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: buffer)
729-
return RoaringBitmap(ptr: croaring.roaring_bitmap_portable_deserialize_safe(bufferPtr, maxbytes)!)
713+
return RoaringBitmap(ptr: croaring.roaring_bitmap_portable_deserialize_safe(buffer, maxbytes)!)
730714
}
731715

732716
/**
@@ -737,8 +721,7 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
737721
* https://github.com/RoaringBitmap/RoaringFormatSpec
738722
*/
739723
public static func portableDeserializeSize(buffer: [Int8], maxbytes: size_t) -> size_t {
740-
let bufferPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: buffer)
741-
return croaring.roaring_bitmap_portable_deserialize_size(bufferPtr, maxbytes)
724+
return croaring.roaring_bitmap_portable_deserialize_size(buffer, maxbytes)
742725
}
743726

744727

@@ -760,11 +743,11 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
760743
* roaring_bitmap_portable_size_in_bytes(ra). See format specification at
761744
* https://github.com/RoaringBitmap/RoaringFormatSpec
762745
*/
763-
public func portableSerialize(buffer: [Int8]) -> size_t {
764-
let bufferPtr: UnsafeMutablePointer = UnsafeMutablePointer(mutating: buffer)
765-
return croaring.roaring_bitmap_portable_serialize(self.ptr, bufferPtr)
746+
public func portableSerialize(buffer: inout [Int8]) -> size_t {
747+
return croaring.roaring_bitmap_portable_serialize(self.ptr, &buffer)
766748
}
767749

750+
768751
/**
769752
* If the size of the roaring bitmap is strictly greater than rank, then this
770753
function returns true and set the value to the the given rank.
@@ -862,7 +845,7 @@ public class RoaringBitmap: Sequence, Equatable, CustomStringConvertible,
862845
}
863846
return Int(truncatingIfNeeded:hash)
864847
}
865-
848+
866849
public func hash(into hasher: inout Hasher) {
867850
for i in self {
868851
i.hash(into: &hasher)

Tests/swiftRoaringTests/swiftRoaringTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@ class swiftRoaringTests: XCTestCase {
268268
func testSerialize(){
269269
rbm.addRangeClosed(min:0, max:500)
270270
let size = rbm.sizeInBytes()
271-
let buffer = [Int8](repeating: 0, count: size)
272-
XCTAssertEqual(rbm.serialize(buffer: buffer), size)
271+
var buffer = [Int8](repeating: 0, count: size)
272+
XCTAssertEqual(rbm.serialize(buffer: &buffer), size)
273273
let deserializedRbm = RoaringBitmap.deserialize(buffer: buffer)
274274
XCTAssertTrue(deserializedRbm == rbm)
275275

@@ -278,8 +278,8 @@ class swiftRoaringTests: XCTestCase {
278278
func testPortableSerialize(){
279279
rbm.addRangeClosed(min:0, max:500)
280280
let size = rbm.portableSizeInBytes()
281-
let buffer = [Int8](repeating: 0, count: size)
282-
XCTAssertEqual(rbm.portableSerialize(buffer: buffer), size)
281+
var buffer = [Int8](repeating: 0, count: size)
282+
XCTAssertEqual(rbm.portableSerialize(buffer: &buffer), size)
283283
let deserializedRbm = RoaringBitmap.portableDeserialize(buffer: buffer)
284284
XCTAssertTrue(deserializedRbm == rbm)
285285
let safeSize = RoaringBitmap.portableDeserializeSize(buffer: buffer, maxbytes: size)

0 commit comments

Comments
 (0)