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