October 08, 2015 Re: Bug? 0 is less than -10 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marc Schütz | On Wednesday, 7 October 2015 at 16:25:02 UTC, Marc Schütz wrote:
> Lionello Lunesu posted a PR that should fix this:
> https://github.com/D-Programming-Language/dmd/pull/1913
> See also the discussion in the linked bug report.
>
> Unfortunately it seems it's been forgotten since then...
Meanwhile I have even improved my solution posted to fix bug #259 to use less casts:
int opCmp(T, U)(const(T) a, const(U) b) pure @safe @nogc nothrow
if(isIntegral!T && isIntegral!U && !is(Unqual!T == Unqual!U))
{
static if(isSigned!T && isUnsigned!U && T.sizeof <= U.sizeof)
{
return (a < 0) ? -1 : opCmp(cast(U)a, b);
}
else static if(isUnsigned!T && isSigned!U && T.sizeof >= U.sizeof)
{
return (b < 0) ? 1 : opCmp(a, cast(T)b);
}
else // both signed or both unsigned or the unsigned type is smaller
{
// do what the compiler always did so far:
alias C = CommonType!(T, U); // use the larger of the both
return opCmp(cast(C)a, cast(C)b);
}
}
And on comparison with number literals everything will be optimized away, so no execution timer overhead at all!
|
October 08, 2015 Re: Bug? 0 is less than -10 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Laeeth Isharc | On 10/7/15 1:27 AM, Laeeth Isharc wrote:
> On Wednesday, 7 October 2015 at 02:53:32 UTC, Steven Schveighoffer wrote:
>> On 10/6/15 7:21 PM, Laeeth Isharc wrote:
>>> could we have ssize_t defined in phobos somewhere so your code ends up
>>> being portable ;) (It's trivial to do, obviously).
>>
>> ptrdiff_t
>>
>
> It seems unnatural to use such a name when the variable has nothing to
> do with pointers - it doesn't contribute to the readability. Yes, it's
> trivial, but small things cumulatively matter. Adam tends to use int
> and when that gets mixed up with an auto size_t (eg via length) then his
> code doesn't compile on 64 bit. And if it happens with his code, you
> can imagine this isn't a problem that inexperienced users never encounter.
ptrdiff_t is in the C spec, ssize_t is not. No reason to name all the types of snow here.
A machine-word-sized signed integer is ptrdiff_t.
-Steve
|
October 08, 2015 Re: Bug? 0 is less than -10 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Thursday, 8 October 2015 at 13:32:17 UTC, Steven Schveighoffer wrote:
> On 10/7/15 1:27 AM, Laeeth Isharc wrote:
>> On Wednesday, 7 October 2015 at 02:53:32 UTC, Steven Schveighoffer wrote:
>>> On 10/6/15 7:21 PM, Laeeth Isharc wrote:
>>>> could we have ssize_t defined in phobos somewhere so your code ends up
>>>> being portable ;) (It's trivial to do, obviously).
>>>
>>> ptrdiff_t
>>>
>>
>> It seems unnatural to use such a name when the variable has nothing to
>> do with pointers - it doesn't contribute to the readability. Yes, it's
>> trivial, but small things cumulatively matter. Adam tends to use int
>> and when that gets mixed up with an auto size_t (eg via length) then his
>> code doesn't compile on 64 bit. And if it happens with his code, you
>> can imagine this isn't a problem that inexperienced users never encounter.
>
> ptrdiff_t is in the C spec, ssize_t is not. No reason to name all the types of snow here.
>
> A machine-word-sized signed integer is ptrdiff_t.
>
> -Steve
Whatever - it's not that important to me. D isn't C, and has learnt from C's mistakes and infelicities. I love the beauty of C, but I'm glad I don't need to do my work in it. One reason why D is under appreciated is that these seemingly small differences make a big difference in practice, even if in theory they shouldn't. Initially I was quite offended by no loop aliasing. Until I saw how much time it saved me in avoiding silly mistakes. But really there are better things to worry about at the moment.
Laeeth.
|
October 09, 2015 Re: Bug? 0 is less than -10 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dominikus Dittes Scherkl | On Thursday, 8 October 2015 at 09:01:32 UTC, Dominikus Dittes Scherkl wrote: > On Wednesday, 7 October 2015 at 16:25:02 UTC, Marc Schütz wrote: >> Lionello Lunesu posted a PR that should fix this: >> https://github.com/D-Programming-Language/dmd/pull/1913 >> See also the discussion in the linked bug report. >> >> Unfortunately it seems it's been forgotten since then... > > Meanwhile I have even improved my solution posted to fix bug #259 to use less casts: > > int opCmp(T, U)(const(T) a, const(U) b) pure @safe @nogc nothrow > if(isIntegral!T && isIntegral!U && !is(Unqual!T == Unqual!U)) > { > static if(isSigned!T && isUnsigned!U && T.sizeof <= U.sizeof) ... > > And on comparison with number literals everything will be optimized away, so no execution timer overhead at all! I like your solution! +1 |
Copyright © 1999-2021 by the D Language Foundation