/*
 *******************************************************************************
 * Copyright (C) 1998-2003, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * Created on Dec 3, 2003
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/TaggedRecord.java,v $
 * $Date: 2003/12/17 04:54:40 $
 * $Revision: 1.2 $
 * 
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.layout;


import com.ibm.icu.impl.Utility;

public class TaggedRecord
{
    private String tag;
        
    public TaggedRecord(String theTag)
    {
        tag = theTag;
    }
        
    public String getTag()
    {
        return tag;
    }
        
    //
    // Straight insertion sort from Knuth vol. III, pg. 81
    //
    public static void sort(TaggedRecord[] table, int count)
    {
        for (int j = 1; j < count; j += 1) {
            int i;
            TaggedRecord v = table[j];
            String vTag = v.getTag();

            for (i = j - 1; i >= 0; i -= 1) {
                if (vTag.compareTo(table[i].getTag()) >= 0) {
                    break;
                }

                table[i + 1] = table[i];
            }

            table[i + 1] = v;
        }
    }
    
    public static int search(TaggedRecord[] table, int count, String tag)
    {
        int log2 = Utility.highBit(count);
        int power = 1 << log2;
        int extra = count - power;
        int probe = power;
        int index = 0;

        if (table[extra].getTag().compareTo(tag) <= 0) {
            index = extra;
        }

        while (probe > (1 << 0)) {
            probe >>= 1;

            if (table[index + probe].getTag().compareTo(tag) <= 0) {
                index += probe;
            }
        }

        if (table[index].getTag().equals(tag)) {
            return index;
        }

        return -1;
    }
}
    
