190 lines
4.6 KiB
Java
190 lines
4.6 KiB
Java
/*
|
|
* Copyright (C) 2006 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.text;
|
|
|
|
import com.android.internal.util.ArrayUtils;
|
|
import com.android.internal.util.GrowingArrayUtils;
|
|
|
|
import libcore.util.EmptyArray;
|
|
|
|
class PackedObjectVector<E>
|
|
{
|
|
private int mColumns;
|
|
private int mRows;
|
|
|
|
private int mRowGapStart;
|
|
private int mRowGapLength;
|
|
|
|
private Object[] mValues;
|
|
|
|
public
|
|
PackedObjectVector(int columns)
|
|
{
|
|
mColumns = columns;
|
|
mValues = EmptyArray.OBJECT;
|
|
mRows = 0;
|
|
|
|
mRowGapStart = 0;
|
|
mRowGapLength = mRows;
|
|
}
|
|
|
|
public E
|
|
getValue(int row, int column)
|
|
{
|
|
if (row >= mRowGapStart)
|
|
row += mRowGapLength;
|
|
|
|
Object value = mValues[row * mColumns + column];
|
|
|
|
return (E) value;
|
|
}
|
|
|
|
public void
|
|
setValue(int row, int column, E value)
|
|
{
|
|
if (row >= mRowGapStart)
|
|
row += mRowGapLength;
|
|
|
|
mValues[row * mColumns + column] = value;
|
|
}
|
|
|
|
public void
|
|
insertAt(int row, E[] values)
|
|
{
|
|
moveRowGapTo(row);
|
|
|
|
if (mRowGapLength == 0)
|
|
growBuffer();
|
|
|
|
mRowGapStart++;
|
|
mRowGapLength--;
|
|
|
|
if (values == null)
|
|
for (int i = 0; i < mColumns; i++)
|
|
setValue(row, i, null);
|
|
else
|
|
for (int i = 0; i < mColumns; i++)
|
|
setValue(row, i, values[i]);
|
|
}
|
|
|
|
public void
|
|
deleteAt(int row, int count)
|
|
{
|
|
moveRowGapTo(row + count);
|
|
|
|
mRowGapStart -= count;
|
|
mRowGapLength += count;
|
|
|
|
if (mRowGapLength > size() * 2)
|
|
{
|
|
// dump();
|
|
// growBuffer();
|
|
}
|
|
}
|
|
|
|
public int
|
|
size()
|
|
{
|
|
return mRows - mRowGapLength;
|
|
}
|
|
|
|
public int
|
|
width()
|
|
{
|
|
return mColumns;
|
|
}
|
|
|
|
private void
|
|
growBuffer()
|
|
{
|
|
Object[] newvalues = ArrayUtils.newUnpaddedObjectArray(
|
|
GrowingArrayUtils.growSize(size()) * mColumns);
|
|
int newsize = newvalues.length / mColumns;
|
|
int after = mRows - (mRowGapStart + mRowGapLength);
|
|
|
|
System.arraycopy(mValues, 0, newvalues, 0, mColumns * mRowGapStart);
|
|
System.arraycopy(mValues, (mRows - after) * mColumns, newvalues, (newsize - after) * mColumns, after * mColumns);
|
|
|
|
mRowGapLength += newsize - mRows;
|
|
mRows = newsize;
|
|
mValues = newvalues;
|
|
}
|
|
|
|
private void
|
|
moveRowGapTo(int where)
|
|
{
|
|
if (where == mRowGapStart)
|
|
return;
|
|
|
|
if (where > mRowGapStart)
|
|
{
|
|
int moving = where + mRowGapLength - (mRowGapStart + mRowGapLength);
|
|
|
|
for (int i = mRowGapStart + mRowGapLength; i < mRowGapStart + mRowGapLength + moving; i++)
|
|
{
|
|
int destrow = i - (mRowGapStart + mRowGapLength) + mRowGapStart;
|
|
|
|
for (int j = 0; j < mColumns; j++)
|
|
{
|
|
Object val = mValues[i * mColumns + j];
|
|
|
|
mValues[destrow * mColumns + j] = val;
|
|
}
|
|
}
|
|
}
|
|
else /* where < mRowGapStart */
|
|
{
|
|
int moving = mRowGapStart - where;
|
|
|
|
for (int i = where + moving - 1; i >= where; i--)
|
|
{
|
|
int destrow = i - where + mRowGapStart + mRowGapLength - moving;
|
|
|
|
for (int j = 0; j < mColumns; j++)
|
|
{
|
|
Object val = mValues[i * mColumns + j];
|
|
|
|
mValues[destrow * mColumns + j] = val;
|
|
}
|
|
}
|
|
}
|
|
|
|
mRowGapStart = where;
|
|
}
|
|
|
|
public void // XXX
|
|
dump()
|
|
{
|
|
for (int i = 0; i < mRows; i++)
|
|
{
|
|
for (int j = 0; j < mColumns; j++)
|
|
{
|
|
Object val = mValues[i * mColumns + j];
|
|
|
|
if (i < mRowGapStart || i >= mRowGapStart + mRowGapLength)
|
|
System.out.print(val + " ");
|
|
else
|
|
System.out.print("(" + val + ") ");
|
|
}
|
|
|
|
System.out.print(" << \n");
|
|
}
|
|
|
|
System.out.print("-----\n\n");
|
|
}
|
|
}
|