[swift-users] Range<UInt64>.count can abort
davesweeris at mac.com
davesweeris at mac.com
Sat Apr 16 10:29:42 CDT 2016
Is there any reason that Distance has to be a simple Int? Since it’s defined per-type, UInt64 could use a custom struct without impacting the performance of other types:
struct UInt64Distance : Comparable { //I'm not sure what else it needs to conform to
var distance: UInt64
var isPositive: Bool
}
func == (lhs: UInt64Distance, rhs: UInt64Distance) -> Bool {
return lhs.distance == rhs.distance && lhs.isPositive == rhs.isPositive
}
func < (lhs: UInt64Distance, rhs: UInt64Distance) -> Bool {
switch (lhs.isPositive, rhs.isPositive) {
case (false, false): return lhs.distance > rhs.distance
case (false, true ): return true
case (true, false): return false
case (true, true ): return lhs.distance < rhs.distance
}
}
... //The rest of `Comparable`
(I’m assuming it’d need `Comparable`, but a quick glance around with cmd-click in Xcode didn’t tell me what, if any, protocols `Distance` needs to conform to.)
- Dave Sweeris
> On Apr 15, 2016, at 6:26 PM, Dmitri Gribenko via swift-users <swift-users at swift.org> wrote:
>
> On Fri, Apr 15, 2016 at 4:23 PM, Jens Alfke via swift-users
> <swift-users at swift.org> wrote:
>> I’m writing some code that deals with ranges of “sequence numbers”, which
>> are consecutively-assigned positive 64-bit integers, thus Range<UInt64> in
>> Swift. I’m having trouble handling half-open ranges with no maximum, which
>> are very commonly used for representing all items created since a certain
>> time.
>>
>> The trouble is, if I represent these with Ranges whose endIndex is
>> UInt64.max, those ranges tend to bomb:
>>
>> let r: Range<UInt64> = 5..<UInt64.max
>> r.count // FATAL ERROR
>>
>>
>> The problem is that Range.count’s type is Element.Distance, and
>> UInt64.Distance is a typealias of … Int. Huh? It’s pretty clear that the
>> distance between two UInt64s can’t be represented by a signed Int64. Why
>> isn’t Distance UInt64?
>
> Hi Jens,
>
> The distance is signed so that we can represent negative distances.
> r.distance(from:to:) should be able to measure distances backwards.
>
> We are aware of this issue, but we don't know of a good solution.
> We'd appreciate your suggestions.
>
> Dmitri
>
> --
> main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
> (j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160416/98a74bb1/attachment.html>
More information about the swift-users
mailing list