isArray and std.container.Array

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Sep 29 03:18:07 PDT 2014


On Sunday, 28 September 2014 at 20:24:11 UTC, monarch_dodra wrote:
> On Sunday, 28 September 2014 at 19:06:09 UTC, Marc Schütz wrote:
>> On Sunday, 28 September 2014 at 16:12:53 UTC, Meta wrote:
>>> On Sunday, 28 September 2014 at 08:01:00 UTC, Nordlöw wrote:
>>>> Is there a reason why isArray!T doesn't match T when T is a 
>>>> std.container.Array? I'm asking because after looking into 
>>>> msgpack-d because of
>>>>
>>>> http://forum.dlang.org/thread/aclapseyptgcwntdavwt@forum.dlang.org#post-aclapseyptgcwntdavwt:40forum.dlang.org
>>>>
>>>> I realized that this is the reason why msgpack doesn't 
>>>> correctly pack std.container.Array.
>>>
>>> It's just an oversight in isArray as far as I can tell. I 
>>> don't know if there's any specific reason that Array is not 
>>> considered an array.
>>
>> I don't think so. std.container.Array is just a data structure 
>> that behaves like an array, but there could be countless other 
>> user defined data structures. It should not get preferred 
>> treatment over those other types. At most, isArray could check 
>> for the presence of .length, .ptr and indexing/slicing. But I 
>> think isArray was intended specifically for built-in arrays. 
>> It's description "is an array (static or dynamic [...])" is 
>> probably meant to express that, because it lists static and 
>> dynamic arrays, but doesn't mention array-like containers.
>
> Yes, everything here is correct.
>
> Interestingly though, "Array" is not actually "array-like" 
> (it's not a range, it doesn't slice), however "Array.Range" 
> *is* an array-like structure.
>
> In regards to "isArrayLike", it would probably be more 
> interesting to instead integrate it as a "isRandomAccessRange" 
> range refinement, which would also allow "opSlice" operations, 
> eg (myRange[0 .. 3] = 5).
>
> As for ".ptr", I think no range *trait* should expose (require) 
> that, as it would most probably be an underhanded way to leak 
> some abstraction, which would be better expressed as a direct 
> call *prior*, rather than a range proper. EG:
> myRange.ptr[0 .. 10].doSomeOperation();

The question is whether you want to call something "array-like" 
if it isn't stored contiguously in memory. Most algorithms don't 
depend on it, but it's a significant divergence from what isArray 
guarantees.


More information about the Digitalmars-d-learn mailing list