FileDocCategorySizeDatePackage
TernarySearchTree3.javaAPI DocExample4095Wed Jun 09 17:52:46 BST 1999tuning.struct

TernarySearchTree3.java

package tuning.struct;

public class TernarySearchTree3
{

    TernarySearchTreeNode3 root;
    char buff[];

    public static void dummy(){TernarySearchTreeNode3.dummy();}
    public Object get(String s)
    {
        if(root == null)
        {
            return null;
        }
        else
        {
            s.getChars(0, s.length(), buff, 0);
            return root.search(buff, 0, s.length() - 1);
        }
    }

    public Object put(String s, Object obj)
    {
        s.getChars(0, s.length(), buff, 0);
        if(root == null)
            root = TernarySearchTreeNode3.newNode(buff[0]);
        return root.insert(buff, 0, s.length() - 1, obj);
    }

    public void release()
    {
        if(root != null)
        {
            root.clean();
            root = null;
        }
    }

    public TernarySearchTree3()
    {
        buff = new char[5000];
    }
}

class TernarySearchTreeNode3
{

    char splitchar;
    TernarySearchTreeNode3 low;
    TernarySearchTreeNode3 high;
    TernarySearchTreeNode3 equal;
    Object value;
    static TernarySearchTreeNode3 pool;
    static
    {
	TernarySearchTreeNode3 last;
	for (int i = 400000; i > 0; i--)
	{
	  last = pool;
	  pool = new TernarySearchTreeNode3();
	  pool.equal=last;
	}
    }

    public static void dummy(){System.out.println("dummy called");}

    public Object search(char ac[], int i, int j)
    {
        char c;
        for(TernarySearchTreeNode3 ternarysearchtreenode3 = this; ternarysearchtreenode3 != null;)
            if((c = ac[i]) < ternarysearchtreenode3.splitchar)
                ternarysearchtreenode3 = ternarysearchtreenode3.low;
            else
            if(c == ternarysearchtreenode3.splitchar)
            {
                if(i == j)
                    return ternarysearchtreenode3.value;
                i++;
                ternarysearchtreenode3 = ternarysearchtreenode3.equal;
            }
            else
            {
                ternarysearchtreenode3 = ternarysearchtreenode3.high;
            }

        return null;
    }

    public Object insert(char ac[], int i, int j, Object obj)
    {
        TernarySearchTreeNode3 ternarysearchtreenode3 = this;
        do
        {
            char c;
            for(c = ac[i]; c < ternarysearchtreenode3.splitchar; ternarysearchtreenode3 = ternarysearchtreenode3.low)
                if(ternarysearchtreenode3.low == null)
                    ternarysearchtreenode3.low = newNode(c);

            if(c == ternarysearchtreenode3.splitchar)
            {
                if(i == j)
                {
                    Object obj1 = ternarysearchtreenode3.value;
                    ternarysearchtreenode3.value = obj;
                    return obj1;
                }
                i++;
                c = ac[i];
                if(ternarysearchtreenode3.equal == null)
                    ternarysearchtreenode3.equal = newNode(c);
                ternarysearchtreenode3 = ternarysearchtreenode3.equal;
            }
            else
            {
                if(ternarysearchtreenode3.high == null)
                    ternarysearchtreenode3.high = newNode(c);
                ternarysearchtreenode3 = ternarysearchtreenode3.high;
            }
        }
        while(true);
    }

    public static TernarySearchTreeNode3 newNode(char c)
    {
	TernarySearchTreeNode3 ternarysearchtreenode3 = pool;
	pool = pool.equal;
	ternarysearchtreenode3.splitchar = c;
        ternarysearchtreenode3.low = ternarysearchtreenode3.equal = ternarysearchtreenode3.high = null;
        return ternarysearchtreenode3;
    }

    public void clean()
    {
        if(low != null)
        {
            low.clean();
            low = null;
        }
        if(high != null)
        {
            high.clean();
            high = null;
        }
        if(equal != null)
        {
            equal.clean();
            equal = null;
        }
        value = null;
    }
}