digitalmars.D.learn - Immutable woes

• Bob Cowdery (24/24) Sep 21 2010 Hi
• Simen kjaeraas (8/22) Sep 21 2010 http://www.digitalmars.com/d/2.0/phobos/std_exception.html#assumeUnique
• Bob Cowdery (6/31) Sep 21 2010 Thanks, that at least builds now. I didn't see that trick in the book
• Simen kjaeraas (6/9) Sep 21 2010 I know. It used to be std.contracts, which makes a bit more sense. Then,
• Pelle (4/28) Sep 21 2010 immutable(float)[] xfer = buffer[0 .. \$/2].idup;
• Bob Cowdery (6/45) Sep 21 2010 Ok, so assumeUnique when I read it a bit more will still share data but
• Simen kjaeraas (7/11) Sep 21 2010 The thing is, slices (as you did in xfer = buffer[0 .. \$/2];) do not
Bob Cowdery <bob bobcowdery.plus.com> writes:
``` 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
```
Sep 21 2010
"Simen kjaeraas" <simen.kjaras gmail.com> writes:
```Bob Cowdery <bob bobcowdery.plus.com> wrote:

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.

http://www.digitalmars.com/d/2.0/phobos/std_exception.html#assumeUnique

float[] xfer = new float[512];
xfer = buffer[0 .. \$/2];
tid.send(assumeUnique(xfer));

--
Simen
```
Sep 21 2010
Bob Cowdery <bob bobcowdery.plus.com> writes:
``` Thanks, that at least builds now. I didn't see that trick in the book
but I've found it on the on-line library ref under std.exception. I
can't say I understand why its under std.exception.

bob

On 21/09/2010 08:48, Simen kjaeraas wrote:
Bob Cowdery <bob bobcowdery.plus.com> wrote:

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.

http://www.digitalmars.com/d/2.0/phobos/std_exception.html#assumeUnique

float[] xfer = new float[512];
xfer = buffer[0 .. \$/2];
tid.send(assumeUnique(xfer));

```
Sep 21 2010
"Simen kjaeraas" <simen.kjaras gmail.com> writes:
```Bob Cowdery <bob bobcowdery.plus.com> wrote:

Thanks, that at least builds now. I didn't see that trick in the book
but I've found it on the on-line library ref under std.exception. I
can't say I understand why its under std.exception.

I know. It used to be std.contracts, which makes a bit more sense. Then,
someone decided std.contracts should be all about exceptions, and
apparently forgot this exception.

--
Simen
```
Sep 21 2010
Pelle <pelle.mansson gmail.com> writes:
```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.
```
Sep 21 2010
Bob Cowdery <bob bobcowdery.plus.com> writes:
``` 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.

```
Sep 21 2010
"Simen kjaeraas" <simen.kjaras gmail.com> writes:
```Bob Cowdery <bob bobcowdery.plus.com> wrote:

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.

The thing is, slices (as you did in xfer = buffer[0 .. \$/2];) do not
copy data. I somehow misread your code as xfer[] = buffer[0 .. \$/2];