October 08, 2015
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
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
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
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
1 2
Next ›   Last »