[swift-users] Range.count can abort

2016-04-18 Thread Jens Alfke via swift-users
I’m writing some code that deals with ranges of “sequence numbers”, which are 
consecutively-assigned positive 64-bit integers, thus Range 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 = 5..___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


Re: [swift-users] Range.count can abort

2016-04-16 Thread Jens Alfke via swift-users

> On Apr 16, 2016, at 12:53 PM, Dmitri Gribenko  wrote:
> 
> It needs to be a signed integer.  And a signed integer needs a distance type 
> itself.

Yeah, there’s an infinite regress implied there, since a distance type has to 
be one bit larger than its source type.

The only plausible solution is bignums. Any talk of adding those to Swift?

—Jens___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


Re: [swift-users] Range.count can abort

2016-04-16 Thread Dmitri Gribenko via swift-users
On Sat, Apr 16, 2016 at 8:29 AM,   wrote:
> 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:

It needs to be a signed integer.  And a signed integer needs a
distance type itself.

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j*/
___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


Re: [swift-users] Range.count can abort

2016-04-16 Thread David Sweeris via swift-users
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 
>  wrote:
> 
> On Fri, Apr 15, 2016 at 4:23 PM, Jens Alfke via swift-users
>  wrote:
>> I’m writing some code that deals with ranges of “sequence numbers”, which
>> are consecutively-assigned positive 64-bit integers, thus Range 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 = 5..> 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 (j){printf("%d\n",i);}}} /*Dmitri Gribenko */
> ___
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


Re: [swift-users] Range.count can abort

2016-04-15 Thread Dmitri Gribenko via swift-users
On Fri, Apr 15, 2016 at 4:41 PM, Jens Alfke  wrote:
>
>
> --Jens [via iPhone]
>
>> On Apr 15, 2016, at 4:26 PM, Dmitri Gribenko  wrote:
>>
>> The distance is signed so that we can represent negative distances.
>> r.distance(from:to:) should be able to measure distances backwards.
>
> Yeah, makes sense in general, just not for this particular case...
>>
>> We are aware of this issue, but we don't know of a good solution.
>> We'd appreciate your suggestions.
>
> Add Int128! ;-)
>
> Ok, maybe that just pushes the problem further down the road.

Indeed.

> How about making Distance be Double? ;-)

Double only has 53 bits of precision.

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j*/
___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


Re: [swift-users] Range.count can abort

2016-04-15 Thread Jens Alfke via swift-users


--Jens [via iPhone]

> On Apr 15, 2016, at 4:26 PM, Dmitri Gribenko  wrote:
> 
> The distance is signed so that we can represent negative distances.
> r.distance(from:to:) should be able to measure distances backwards.

Yeah, makes sense in general, just not for this particular case...
> 
> We are aware of this issue, but we don't know of a good solution.
> We'd appreciate your suggestions.

Add Int128! ;-)

Ok, maybe that just pushes the problem further down the road. How about making 
Distance be Double? ;-)

--Jens

___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users