digitalmars.D.learn - ubyte[] -> immutable(ubyte)[]
- Andrej Mitrovic <andrej.mitrovich test.com> Sep 03 2010
- Andrej Mitrovic <test test.test> Sep 09 2010
- bearophile <bearophileHUGS lycos.com> Sep 09 2010
- Andrej Mitrovic <test test.test> Sep 10 2010
- Kagamin <spam here.lot> Sep 09 2010
- Andrej Mitrovic <test test.test> Sep 10 2010
- Pelle <pelle.mansson gmail.com> Sep 10 2010
- Andrej Mitrovic <test test.test> Sep 10 2010
This is from TDPL page 407:
import std.algorithm,
std.concurrency,
std.stdio;
void main()
{
enum bufferSize = 1024 * 100;
auto tid = spawn(&fileWriter);
// Read loop
foreach (immutable(ubyte)[] buffer; stdin.byChunk(bufferSize))
{
send(tid, buffer);
}
}
void fileWriter()
{
// write loop
while (true)
{
auto buffer = receiveOnly!(immutable(ubyte)[])();
tgt.write(buffer);
}
}
Error:
C:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(1943):
Error: cannot implicitly convert expression (buffer) of type ubyte[]
to immutable(ubyte)[]
Yet interestingly I can't use type inference:
foreach (buffer; stdin.byChunk(bufferSize))
{
send(tid, buffer);
}
Error: stdin_stdout_copy.d(11): Error: cannot infer type for buffer
But in the original code I get back a mutable ubyte[] which I can't implicitly
convert to immutable (I'd need a copy first). There's no .dup or .idup property
for stdin.byChunk. So what am I supossed to do here?
Sep 03 2010
I'm trying to use algorithm.copy, but I get back nothing in the copy buffer.
How do I to copy an array of ubyte's?
iimport std.algorithm,
std.concurrency,
std.stdio;
void main()
{
enum bufferSize = 4;
auto tid = spawn(&fileWriter);
// Read loop
foreach (ubyte[] buffer; stdin.byChunk(bufferSize))
{
immutable(ubyte)[] copy_buffer;
copy(buffer, copy_buffer);
writeln(copy_buffer); // writes nothing
send(tid, copy_buffer);
}
}
void fileWriter()
{
while (true)
{
auto buffer = receiveOnly!(immutable(ubyte)[])();
// writeln(buffer);
}
}
Andrej Mitrovic Wrote:
This is from TDPL page 407:
import std.algorithm,
std.concurrency,
std.stdio;
void main()
{
enum bufferSize = 1024 * 100;
auto tid = spawn(&fileWriter);
// Read loop
foreach (immutable(ubyte)[] buffer; stdin.byChunk(bufferSize))
{
send(tid, buffer);
}
}
void fileWriter()
{
// write loop
while (true)
{
auto buffer = receiveOnly!(immutable(ubyte)[])();
tgt.write(buffer);
}
}
Error:
C:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(1943):
Error: cannot implicitly convert expression (buffer) of type ubyte[]
to immutable(ubyte)[]
Yet interestingly I can't use type inference:
foreach (buffer; stdin.byChunk(bufferSize))
{
send(tid, buffer);
}
Error: stdin_stdout_copy.d(11): Error: cannot infer type for buffer
But in the original code I get back a mutable ubyte[] which I can't implicitly
convert to immutable (I'd need a copy first). There's no .dup or .idup property
for stdin.byChunk. So what am I supossed to do here?
Sep 09 2010
Andrej Mitrovic:I'm trying to use algorithm.copy, but I get back nothing in the copy buffer. How do I to copy an array of ubyte's?
a[] = b[]; Bye, bearophile
Sep 09 2010
bearophile Wrote:Andrej Mitrovic:I'm trying to use algorithm.copy, but I get back nothing in the copy buffer. How do I to copy an array of ubyte's?
a[] = b[]; Bye, bearophile
No, that wouldn't work. It complains about conversion from mutable to immutable. idup works fine though.
Sep 10 2010
Andrej Mitrovic Wrote:foreach (ubyte[] buffer; stdin.byChunk(bufferSize)) { immutable(ubyte)[] copy_buffer; copy(buffer, copy_buffer); writeln(copy_buffer); // writes nothing send(tid, copy_buffer); }
Isn't destination the left argument? Why you don't use send(tid, buffer.idup); ?
Sep 09 2010
Yeah, one would think the destination is on the left (just like the standard C way of doing it), but it's not. I checked it in the docs and the source. And idup works, thanks. Kagamin Wrote:Andrej Mitrovic Wrote:foreach (ubyte[] buffer; stdin.byChunk(bufferSize)) { immutable(ubyte)[] copy_buffer; copy(buffer, copy_buffer); writeln(copy_buffer); // writes nothing send(tid, copy_buffer); }
Isn't destination the left argument? Why you don't use send(tid, buffer.idup); ?
Sep 10 2010
On 09/10/2010 04:40 AM, Andrej Mitrovic wrote:I'm trying to use algorithm.copy, but I get back nothing in the copy buffer. How do I to copy an array of ubyte's? iimport std.algorithm, std.concurrency, std.stdio; void main() { enum bufferSize = 4; auto tid = spawn(&fileWriter); // Read loop foreach (ubyte[] buffer; stdin.byChunk(bufferSize)) { immutable(ubyte)[] copy_buffer; copy(buffer, copy_buffer); writeln(copy_buffer); // writes nothing send(tid, copy_buffer); } } void fileWriter() { while (true) { auto buffer = receiveOnly!(immutable(ubyte)[])(); // writeln(buffer); } } Andrej Mitrovic Wrote:This is from TDPL page 407: import std.algorithm, std.concurrency, std.stdio; void main() { enum bufferSize = 1024 * 100; auto tid = spawn(&fileWriter); // Read loop foreach (immutable(ubyte)[] buffer; stdin.byChunk(bufferSize)) { send(tid, buffer); } } void fileWriter() { // write loop while (true) { auto buffer = receiveOnly!(immutable(ubyte)[])(); tgt.write(buffer); } } Error: C:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(1943): Error: cannot implicitly convert expression (buffer) of type ubyte[] to immutable(ubyte)[] Yet interestingly I can't use type inference: foreach (buffer; stdin.byChunk(bufferSize)) { send(tid, buffer); } Error: stdin_stdout_copy.d(11): Error: cannot infer type for buffer But in the original code I get back a mutable ubyte[] which I can't implicitly convert to immutable (I'd need a copy first). There's no .dup or .idup property for stdin.byChunk. So what am I supossed to do here?
std.algorithm.copy will copy an input range into an output range. An array is a valid output range, but does not append as you seem to expect. Instead, it fills the array. int[] a = new int[](3); copy([1,2,3],a); assert (a == [1,2,3]); To get an output range which appends to an array, use appender. In this case, however, you simply want buffer.idup; :-)
Sep 10 2010
Ah, idup. Too obvious, but I missed it. Thanks. Pelle Wrote:std.algorithm.copy will copy an input range into an output range. An array is a valid output range, but does not append as you seem to expect. Instead, it fills the array. int[] a = new int[](3); copy([1,2,3],a); assert (a == [1,2,3]); To get an output range which appends to an array, use appender. In this case, however, you simply want buffer.idup; :-)
Sep 10 2010









Andrej Mitrovic <test test.test> 