// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * 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;
    }
}