Weird error when compiling.

Agustin agustin.l.alvarez at hotmail.com
Sun Oct 20 15:12:10 PDT 2013


On Sunday, 20 October 2013 at 22:04:49 UTC, Agustin wrote:
> On Sunday, 20 October 2013 at 21:54:37 UTC, Agustin wrote:
>> On Sunday, 20 October 2013 at 02:14:55 UTC, TheFlyingFiddle 
>> wrote:
>>>> Anyway to evaluate the name of the class and return its hash 
>>>> at compile time?
>>>
>>> I couldn't find the built in hash unction for strings so i 
>>> used the one from http://dlang.org/hash-map.html as an 
>>> example. More advanced and better hash functions can be found 
>>> online.
>>>
>>> public class ComponentDetail(T) : Component {
>>> 	////////////////////////////////////////////////////////////
>>> 	/// Component's ID as static member.
>>> 	public static hash_t ID = hash!(T);
>>> }
>>>
>>> hash_t hash(T)()
>>> {
>>>   hash_t hash;
>>>   foreach (char c; T.stringof)
>>>       hash = (hash * 9) + c;
>>>   return hash;
>>> }
>>
>> Works perfectly :), now if i want to implement the same but
>> rather do something like
>>
>> template GetHash(string character, hash_t hash = 0, size_t 
>> index
>> = 0) {
>> 	static if (character[index])
>> 		enum GetHash = GetHash(character, hash = (hash * 9) +
>> character[index], ++index);
>> 	else
>> 		enum GetHash = hash;
>> }
>>
>> How should i implement it?
>
> I came up with something like
>
>
> template GetHash(string character, hash_t hash = 0, size_t 
> index = 0) {
> 	static if (index < character.length)
> 		enum GetHash = GetHash!(character, (hash * 9) + 
> character[index], index + 1);
> 	else
> 		enum GetHash = hash;
> }

And the final template is

template Hash(string text, hash_t hash = 0, size_t index = 0) {
	static if (index < text.length)
		enum Hash = Hash!(text, (hash ^ text[index]) * 1099511628211UL, 
index + 1);
	else
		enum Hash = hash;
}

:D


More information about the Digitalmars-d-learn mailing list