Can't call splitter with range struct
David Skluzacek
david.skluzacek at gmail.com
Mon Mar 15 22:58:53 UTC 2021
I came across this problem as I was trying to see if could write
a quick range-based solution with std.zlib to do what was asked
about in a different Learn forum post - read a gzipped file.
This seems like it should work:
import std.stdio, std.algorithm, std.zlib;
import std.range.primitives;
void main(string[] args)
{
auto f = GZippedFile(File(args[1], "rb"));
f.splitter("\n").each!writeln;
}
struct GZippedFile
{
File file;
UnCompress uncompressor;
ubyte[] readBuffer;
const(char)[] buffer;
this(File f) {
file = f;
uncompressor = new UnCompress(HeaderFormat.gzip);
readBuffer = new ubyte[4096];
}
dchar front() const {
return buffer.front;
}
void popFront() {
if (buffer.empty) {
buffer = cast(const(char)[])
uncompressor.uncompress(file.rawRead(readBuffer));
}
else {
buffer.popFront();
}
}
bool empty() {
return buffer.empty && file.eof();
}
}
But I get:
Error: template std.algorithm.iteration.splitter cannot deduce
function from argument types !()(GZippedFile, string), candidates
are:
/usr/include/dlang/dmd/std/algorithm/iteration.d(4678):
splitter(alias pred = "a == b", Range, Separator)(Range r,
Separator s)
with pred = "a == b",
Range = GZippedFile,
Separator = string
must satisfy the following constraint:
is(typeof(binaryFun!pred(r.front, s)) : bool)
(...)
If I change the newline separator to a character literal, I get:
(...)
/usr/include/dlang/dmd/std/algorithm/iteration.d(5055):
splitter(alias pred = "a == b", Range, Separator)(Range r,
Separator s)
with pred = "a == b",
Range = GZippedFile,
Separator = char
must satisfy the following constraint:
is(typeof(binaryFun!pred(r.front, s.front)) : bool)
It seems like "\n" should pass the second constraint and '\n'
should pass the first. Using a dchar or dstring makes no
difference. Adding @property to front makes no difference. Is
this a bug?
More information about the Digitalmars-d-learn
mailing list