Passing a ubyte[] to a function taking a 'ref ubyte[16]'
    Johannes Pfau 
    nospam at example.com
       
    Sat Jun 23 11:23:26 PDT 2012
    
    
  
I'm working on the new design for std.hash and I hit an interesting
problem:
The OOP interface has to take buffers as slices with unknown length, as
the length differs between hashes and I have to put a common function
declaration in a interface. So I have this:
------------
interface Digest
{
    ubyte[] finish(ubyte[] buf);
}
------------
Now the template API can and should use the correct type, so there
finish is defined like this:
------------
struct MD5
{
    void finish(ref ubyte[16] data);
}
------------
And the interface implementation for MD5 has to call the MD5 structs
finish function:
------------
class MD5Digest : Digest
{
    private MD5 _digest;
    ubyte[] finish(ubyte[] buf)
    {
        enforce(buf.length >= 16);
        _digest.finish(buf); //How to do this?
    }
}
------------
So how to pass a ubyte[] to a function expecting a ref ubyte[16]
without allocating/using any extra memory (Not even stack)?
This seems to work, but it's very ugly:
------------
_digest.finish(*cast(ubyte[16]*)buf.ptr);
------------
I thought this might create a temporary, but it passes all unittests,
so it seems to work?
    
    
More information about the Digitalmars-d-learn
mailing list