Issue with template function
Nicholas Wilson via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Feb 7 04:04:10 PST 2015
On Friday, 6 February 2015 at 17:09:29 UTC, Charles wrote:
> I'm trying to create a template function that can take in any
> type of array and convert it to a ubyte array. I'm not
> concerned with endianness at the moment, but I ran into a
> roadblock when trying to do this with strings. It already works
> with ints, chars, etc.
>
> Here's the relevant test code:
>
> module byteReader;
>
> public import std.system : Endian;
>
> ubyte[] toBytes(T)(T[] arr)
> {
> if (arr == null)
> {
> return null;
> }
>
> ubyte[] result = new ubyte[arr.length];
>
> foreach (key, val; arr)
> {
> result[key] = cast(ubyte) val; // This is line 16
> }
>
> return result;
> }
>
> string readString(ubyte[] buffer, uint offset, uint length)
> {
> assert( buffer.length >= offset + length );
>
> char[] chars = new char[length];
> foreach(key, val; buffer[offset .. offset + length])
> {
> chars[key] = cast(char) val;
> }
>
> return cast(string)chars;
>
> }
>
> void main() {
> import std.stdio;
> readString(toBytes!char(['t','e','s','t']),0,4).writeln;
> readString(toBytes!string("test"),0,4).writeln; //
> This is line 39
> }
>
> Here's the output:
> byteReader.d(16): Error: cannot cast val of type string to
> type ubyte
> byteReader.d(39): Error: template instance
> byteReader.toBytes!string error instantiating
Are you wanting to to convert each element in arr to a byte thus
truncating and losing data (when T.sizeof != 1)?
as in
toBytes([1,2,3, 42, 500 /*this will be truncated to 244
*/]);// T == int here
or are you wanting to convert each element to a ubyte array and
then concatenate it to the result.
as is
ubyte[] toBytes(T)(T[] arr)
{
ubyte[T.sizeof] buf;
if (arr is null)
{
return null;
}
ubyte[] result = new ubyte[arr.length * T.sizeof];
foreach (i, val; arr)
{
buf[] = cast(ubyte[T.sizeof])&(arr[i])[0 .. T.sizeof]
result ~= buf;
}
return result;
}
?
More information about the Digitalmars-d-learn
mailing list