recursive template (first attempt)

akcom CppCoder at gmail.com
Wed Apr 19 20:25:55 PDT 2006


I apologize if this is an easily resolved problem, this is my first
attempt at writing a template function.  the objective of this function
is to mimic the behavior of the AP hash function, but as a template
function obviously.  Here is what I have so far:

uint aphash( ubyte []buf )
{
	uint hash;
	
	for ( uint i = 0; i < buf.length; i++ )
	{
		hash ^= ((i & 1) == 0) ?	(  (hash <<  7) ^ (buf[i]) ^ (hash >> 3)) :
									(~((hash << 11) ^ (buf[i]) ^ (hash >> 5)));
	}
	return hash;
}

template aphasht( T : ubyte [] )
{
	uint aphasht( T t )
	{
		uint result;
		static if ( t.length == 0 )
		{
			return 0;
		}
		static if ( t.length & 1 )
		{
			result = aphasht( t[1..$] );
			return (result << 7) ^ t[0] ^ (result >> 3);
		}
		else
		{
			result = aphasht( t[1..$] );
			return (result << 11) ^ t[0] ^ (result >> 5);
		}
	}
}

void test()
{
	static ubyte []str = [ 0x01, 0x02, 0x03, 0x03 ];
	writefln( "aphash(str) = %X", aphash( str ) );
	writefln( "aphasht(str) = %X", aphasht!(ubyte [])( str ) );
}


When I attempt to compile it, I get the following errors:

dmd -w -c main.d
main.d(49): expression ((t).length) == 0u does not evaluate to a boolean
main.d(53): expression ((t).length) & 1u does not evaluate to a boolean
main.d(70): template instance main.aphasht!(ubyte[]) error instantiating

Could someone please point out my mistake, and if there is a more
elegant way of completing this task, I'd appreciate some input on that
as well.

Regards,
Alex



More information about the Digitalmars-d-learn mailing list