endsWith() doesn't work with const(wchar[])s
Lutger Blijdestijn
lutger.blijdestijn at gmail.com
Sun Jan 16 03:36:54 PST 2011
Jonathan M Davis wrote:
> On Saturday 15 January 2011 09:02:55 Lutger Blijdestijn wrote:
>> Jonathan M Davis wrote:
>> > On Thursday 13 January 2011 21:21:06 %u wrote:
>> >> Hi,
>> >>
>> >> I've noticed that some functions, such as algorithm.endsWith, don't
>> >> work with constant arrays. Is this a bug, or is there a reason behind
>> >> it? It forces the user to perform dangerous casts to avoid object
>> >> creation, and it doesn't seem like the functions actually need to
>> >> perform any manipulations.
>> >
>> > Phobos doesn't really deal with const or immutable correctly at this
>> > point. A number of things which should be able to handle const or
>> > immutable can't. And then there are things which you'd think _should_
>> > be able to but can't because of the transivity of const and immutable.
>> > There are a number of outstanding bugs related to const and immutable
>> > which makes dealing with them at times a bit of a pain if not outright
>> > impossible. It's on the list of things to be focused on after the
>> > 64-bit port of dmd is done.
>> >
>> > As it stands, there are a number of algorithms which just won't work
>> > with const or immutable arrays.
>> >
>> > Regardless, a fully const array is never going to work with a function
>> > like endsWith() for the simple reason that such functions have to
>> > actually be able to process the range that they're given, and if the
>> > range is const, you can't call popFront() or popBack() on it, so it
>> > just isn't going to work.
>> >
>> > Now, if you take a _slice_ of a const array, it should work, because
>> > while the elements of the array will remain const, the slice itself
>> > won't be, so endsWith() can process it.
>> >
>> > - Jonathan M Davis
>>
>> A slice won't work because it is still const(T[]). It can implicitly
>> convert to const(T)[], but I believe that is a bug currently.
>
> No, I'm pretty sure that that isn't a bug. A slice is a new array. A
> const(T)[] that points to the same elements of an array that's const(T[])
> can't change the elements any more than the const(T[]) can. So, const is
> not violated for the elements. And since the slice is a new array, the
> fact that you can alter the slice itself is completely valid. You can
> resize the slice or set to an entirely different block of memory or
> whatever, at it won't affect the original array, so it does not violate
> the const-ness of the const(T[]) array.
Yes, I agree the behavior is correct, it's indeed the inconsistency I was
referring to. At this moment I'm not sure how it is gonna work out. I failed
searching bugzilla, but relying on this behavior would make me a bit
nervous.
About the slicing, this works:
const(int[]) n = [1,2,3];
const(int)[] a = n[];
assert(endsWith(a, 3));
but this doesn't:
auto b = n[];
assert(endsWith(b, 3));
In conclusion, you still have to 'convert' the array to a different type,
even though casting is not required for arrays (and arrays only).
otoh, treating a const array as a range doesn't make any sense in the first
place, since ranges must be mutable by definition. Arrays *are* special in
the sense that they act both as a container and 'iterator' over that
container.
> So, no, it's not a bug. The bug is that this sort of behavior doesn't work
> for general ranges - just arrays - and that we don't currently have a
> means of making it work with general ranges. It cripples const and
> immutable ranges, but it doesn't cripple const and immutable arrays.
>
> - Jonathan M Davis
More information about the Digitalmars-d
mailing list