view dmd/String.d @ 68:ee3a9f34dc48

final bits of codegen implementation to compile Phobos
author korDen
date Tue, 24 Aug 2010 16:44:34 +0400
parents ccbc1e0bb3f0
children 2e2a5c3f943a
line wrap: on
line source

module dmd.String;

import dmd.Array;

import core.stdc.string : strlen;
import std.string : cmp;

import std.stdio : writefln;

class String
{
    string str;

    this(string str)
	{
		this.str = str;
	}

    static hash_t calcHash(const(char)* str, size_t len)
	{
		hash_t hash = 0;

		for (;;)
		{
			switch (len)
			{
				case 0:
					return hash;

				case 1:
					hash *= 37;
					hash += *cast(ubyte*)str;
					return hash;

				case 2:
					hash *= 37;
					hash += *cast(ushort*)str;
					return hash;

				case 3:
					hash *= 37;
					hash += (*(cast(ushort*)str) << 8) +
						(cast(ubyte*)str)[2];
					return hash;

				default:
					hash *= 37;
					hash += *cast(uint*)str;
					str += 4;
					len -= 4;
					break;
			}
		}
	}
	
    static hash_t calcHash(string str)
	{
		return calcHash(str.ptr, str.length);
	}
	
    hash_t hashCode()
	{
		return calcHash(str.ptr, str.length);
	}
    
	uint len()
	{
		return str.length;
	}

    bool equals(Object obj)
	{
		return str == (cast(String)obj).str;
	}

    int opCmp(Object obj)
	{
		return cmp(str, (cast(String)obj).str);
	}
	
    string toChars()
	{
		return str;
	}

    void print()
	{
		writefln("String '%s'", str);
	}
}