Ok, so assumeUnique when I read it a bit more will still share data but idup will copy data. Where are the docs for that. Something else not in the book - but then I guess there is a lot of detail not in the book. Thank goodness for forums.
bob On 21/09/2010 09:10, Pelle wrote: > On 09/21/2010 09:29 AM, Bob Cowdery wrote: >> Hi >> >> I'm stuggling with immutable. >> >> I have a fixed size buffer which is used as a circular buffer of floats >> and is effectively double buffering data I wish to transfer to another >> thread. At an appropriate point I take the top half or bottom half of >> the buffer and send it to another thread. >> >> To do this I need to copy the data to an immutable transfer buffer to >> use in the send. I'm sure this is simple but I can't figure it. >> >> if I say something like: >> float[] xfer = new float[512]; >> xfer = buffer[0 .. $/2]; >> tid.send(xfer); >> >> it rightly tells me 'thread local data not allowed'. If I make it: >> >> immutable (float)[] xfer; >> xfer = buffer[0 .. $/2]; >> tid.send(xfer); >> >> it tells me 'can't implicitly convert float[] to immutable (float)[]' >> >> If I try a float by float copy into xfer it can't because I've said the >> buffer is immutable. In the first example I can't figure out how to >> convert the slice into an immutable copy which I think is what I should >> be doing. >> >> Can someone point me in the right direction. >> >> Thanks >> Bob >> > > immutable(float)[] xfer = buffer[0 .. $/2].idup; > tid.send(xfer); > > Don't use assumeUnique for non-unique references.