stream.getc() doesn't recognize eof
Regan Heath
regan at netmail.co.nz
Thu Mar 13 10:19:58 PDT 2008
Brian White wrote:
>> So, because c == char.init and nothing has modified it, the path which
>> calls readBlock will return char.init when EOF is reached.
>
> Ah, thanks!
>
> I must say that this technique worries me somewhat. "readBlock" is an
> abstract function definable by any derived class and I don't believe
> that "c must remain unchanged where data is not stored" is a defined
> output requirement of that method.
Good point, might be safer to check for the 0 return and set c to
char.init explicitly.
You comment did get me thinking... Is there some way of expressing the
requirement using design by contract? I think the answer is, not
easily, you'd have to do something like:
// the problem being that we need a global to copy the input buffer into
// and it could be potentially huge.
// when really all we want is some way to detect whether
// data was written to that address _at all_
byte* buffer_in;
abstract size_t readBlock(void* buffer, size_t size)
in {
buffer_in = malloc(size);
memcpy(buffer_in, buffer, size);
}
out (result) {
assert(result > 0 ||
(result == 0 && memcmp(buffer_in, buffer, size) == 0));
}
/* note, no body, therefore function is still 'abstract' */
All that assuming it is legal to specify in/out contracts on an abstract
method without a body.
It should be possible, it would simply follow the same rules given for
inheritance here under "In, Out and Inheritance":
http://www.digitalmars.com/d/1.0/dbc.html
Regan
More information about the Digitalmars-d-learn
mailing list