Who wore it better?

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 15 13:16:33 PDT 2016


On 4/15/16 4:05 PM, Andrei Alexandrescu wrote:
> On 04/15/2016 03:13 PM, Steven Schveighoffer wrote:
>> On 4/15/16 2:48 PM, Andrei Alexandrescu wrote:
>>> On 4/15/16 2:46 PM, Steven Schveighoffer wrote:
>>>> inout(T)[] overlap(T)(inout(T)[] r1, inout(T)[] r2) @trusted pure
>>>> nothrow
>>>> {
>>>>      import std.algorithm: min, max;
>>>>      auto b = max(r1.ptr, r2.ptr);
>>>>      auto e = min(r1.ptr + r1.length, r2.ptr + r2.length);
>>>>      return b < e ? b[0 .. e - b] : null;
>>>> }
>>>
>>> Is that better or worse than the one without inout? -- Andrei
>>
>> Better. It generates one implementation for all 9 combinations of
>> mutability. Yours generates 9 identical binary functions.
>
> A valid but weak argument. There's been long talk about eliminating
> binary identical functions in the front end (some linkers already do
> it). That would be the real solution that would help cases unrelated to
> inout, too.

The main argument is this:

auto overlap(T, U)(T[] r1, U[] r2) @trusted pure nothrow

Can you tell, does overlap modify any data in r1 or r2?

If you find such advertisement useless, you of course do not need inout 
or const.

>> And yours possibly depends on a bug:
>> https://issues.dlang.org/show_bug.cgi?id=15930
>
> Red herring. Fixing the bug shouldn't break that code.

I don't know what the bug is. That's why I said "possibly." I was 
surprised your code compiled with both const/mutable parameters, but 
then I found the bug. It's possible it could be fixed and become 
correct. I'm not sure.

-Steve


More information about the Digitalmars-d mailing list