BitArray/BitFields - Resumed and polishing

Era Scarecrow rtcvb32 at yahoo.com
Thu Jan 3 13:45:23 PST 2013


On Thursday, 3 January 2013 at 21:15:19 UTC, Dmitry Olshansky 
wrote:
> 04-Jan-2013 00:11, Era Scarecrow wrote:

> Appending a slice *to* BitArray is perfectly fine as in fact 
> any range of bool (or bit if you like). Any array-like or 
> string-like container has to support appending a range of 
> element type (and insertion for that matter). The table you 
> mention is then an array of BitArray that is sliced (getting a 
> range) and these slices are appended to some other BitArray. 
> BitArrays in this table could also be appended to just fine (so 
> you construct sequences out of others easily).
>
> The key point is that *appending a range to container* is fine 
> (and idiomatic) and *slicing is O(1), fast and non-allocating*.

  So the slice is a non-allocating view of data some data. I can 
see adding more limitations for that then.

>> I can also see where if you append to a slice it automatically 
>> making a new block of memory would be useful as well, as you 
>> know you're going to start fresh.
>
> Maybe but I can see it being a nasty surprise in a tight loop.

  Only on the first iteration, unless you do a LOT of slicing & 
appending on non-compact blocks, but if you're appending to a 
slice in normal arrays it will dup it anyways (if it doesn't own 
the following memory) so the behavior doesn't really change.

>> I can make a short test set of functions and post them if you 
>> like, doing ranges & slices otherwise might not allow such 
>> diversity (simplicity?) in the code.
>
> Would be great to put them together as we have implementation 
> details sorted out but have trouble with usage patterns.

  K, I'll likely re-work my multi-level huffman algorithmn and a 
LZW compression, although the LZW wouldn't make use of the more 
exotic features. Got half the LZW written, but I likely won't get 
this done for a few days.

>>> There is an extra rule however, it is the following. If the 
>>> object in question is not a range and doesn't have opApply 
>>> but has opSlice() then it slices it first, then again it 
>>> checks the 2 ways on this slice - as range or opApply.
>>
>> I didn't know that; I know it attempted a slice but not that 
>> the slice has to be a range. Likely that needs to be 
>> emphasized in the documentation.
>
> That's pretty much how std.container tries to work. There is 
> little documentation on the subject though, same note IRC is in 
> TDPL book (highly recommend that one if you don't have it 
> already).

  Got a copy, in fact this is one of the first prints. I've likely 
read this book a half dozen times to get a full feel of the 
language (other than templates which I've learned elsewhere)

>> I agree, but if it's going to be a value type that's heavy on 
>> small string optimization with as little referencing as 
>> possible, then it has to know what size to depend on, since 
>> resizing beyond the Max may not be an option if we take that 
>> part out.
>
> I meant it's still resizing up to any point, just that it does 
> dup's underlying array on copy (if not small, if small then 
> postblit does nothing). It's questionable to dup on copy but 
> the idea is that it won't be often.
>
> If you mean to make type that doesn't resize beyond some 
> maximum (so it's always "small") then indeed having fixed size 
> as template parameter makes more sense.

  That was the idea. A true value type with no hidden allocation. 
There are many cases for it, but I think having the BitArray 
which can allocate has a larger audience than a fixed size. Won't 
know for sure though, maybe it's the other way around.


More information about the Digitalmars-d-learn mailing list