The analogue of "fill-pointer" in D

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon May 18 04:00:27 PDT 2015


On Monday, 18 May 2015 at 10:24:25 UTC, Dennis Ritchie wrote:
> On Monday, 18 May 2015 at 10:14:33 UTC, Kagamin wrote:
>> On Monday, 18 May 2015 at 08:21:38 UTC, Dennis Ritchie wrote:
>>> Hi,
>>>
>>> In Common Lisp, there is such a thing as a fill-pointer 
>>> (Example 5):
>>> http://www.tutorialspoint.com/lisp/lisp_arrays.htm
>>>
>>> Does D some equivalent?
>>
>> Data stored in the array is indicated by the array length 
>> property, use capacity to figure out extra available space: 
>> http://dlang.org/phobos/object.html#.capacity
>
> No, afraid not. Function capacity is not an analogue of 
> fill-pointers!
>
> Lisp-programmer explains the usefulness of fill-pointers as 
> follows:
>
> "Fill pointer "cuts" the tail of the vector. For example, 
> vector elements 100, but if you set the fill pointer equal to 
> 3, the length of the array (returned by length) will be equal 
> to 3. The remaining elements are not visible.
>
> It seems to be nonsense. But this is nonsense, ideal for 
> buffers. If the buffer is implemented as an array, then fill 
> pointer just marks the boundary of the filled part of the 
> buffer, and adding a buffer (moving away from the fill 
> pointer-a) is carried out using the vector-push. Or a buffer 
> can be filled with the format-a. If you work with the same 
> buffer C, fill pointer simulates a pointer to the last 
> completed item."

There are a lot of ways of doing this in D.

std.array.appender makes a good imitation of this, just missing 
the vector-push, which can be implemented like this, roughly:

ptrdiff_t putNoAlloc(App, T)(App app, T el)
{
     if (app.capacity)
     {
         app.put(el);
         return app.data.length - 1;
     }
     else
         return -1;
}

It would also be trivial to hand-make a type that has whatever 
behaviour you want with regards to array appending, lengths etc.


More information about the Digitalmars-d-learn mailing list