12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2014, International Business Machines Corporation and
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * created on: 2014feb10
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * created by: Markus W. Scherer
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl.coll;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// TODO: There must be a Java class for a growable array of ints without auto-boxing to Integer?!
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// Keep the API parallel to the C++ version for ease of porting. Port methods only as needed.
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// If & when we start using something else, we might keep this as a thin wrapper for porting.
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class UVector32 {
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UVector32() {}
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public boolean isEmpty() { return length == 0; }
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int size() { return length; }
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int elementAti(int i) { return buffer[i]; }
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int[] getBuffer() { return buffer; }
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void addElement(int e) {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ensureAppendCapacity();
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buffer[length++] = e;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void setElementAt(int elem, int index) { buffer[index] = elem; }
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void insertElementAt(int elem, int index) {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ensureAppendCapacity();
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.arraycopy(buffer, index, buffer, index + 1, length - index);
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buffer[index] = elem;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ++length;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void removeAllElements() {
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        length = 0;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void ensureAppendCapacity() {
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(length >= buffer.length) {
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int newCapacity = buffer.length <= 0xffff ? 4 * buffer.length : 2 * buffer.length;
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int[] newBuffer = new int[newCapacity];
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.arraycopy(buffer, 0, newBuffer, 0, length);
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buffer = newBuffer;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private int[] buffer = new int[32];
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private int length = 0;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
49