// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 2002-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

package com.ibm.icu.dev.tool.layout;


class Feature extends TaggedRecord
{
    private int[] lookupIndices;
    private int lookupCount;
    private int featureIndex;
    
    public Feature(String theFeatureTag)
    {
        super(theFeatureTag);
        
        lookupIndices = new int[10];
        lookupCount = 0;
        featureIndex = -1;
    }
    
    public void addLookup(int theLookupIndex)
    {
        if (lookupCount >= lookupIndices.length) {
            int[] newLookupIndices = new int[lookupIndices.length + 5];
            
            System.arraycopy(lookupIndices, 0, newLookupIndices, 0, lookupIndices.length);
            lookupIndices = newLookupIndices;
        }
        
        lookupIndices[lookupCount] = theLookupIndex;
        lookupCount += 1;
    }
    
    public void writeFeature(OpenTypeTableWriter writer)
    {
        writer.writeData(0);      // featureParams (must be NULL)
        
        writer.writeData(lookupCount);
        
        for (int i = 0; i < lookupCount; i += 1) {
            writer.writeData(lookupIndices[i]);
        }
    }
    
    public int getFeatureIndex()
    {
        return featureIndex;
    }
    
    public void setFeatureIndex(int index)
    {
        featureIndex = index;
    }
}
