/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.memory.model;
import java.util.Arrays;
/**
* A dedicated data structure for storing MemStatement objects, offering
* operations optimized for their use in the memory Sail.
*/
public class MemStatementList {
/*-----------*
* Variables *
*-----------*/
private MemStatement[] statements;
private int size;
/*--------------*
* Constructors *
*--------------*/
/**
* Creates a new MemStatementList.
*/
public MemStatementList() {
this(4);
}
public MemStatementList(int capacity) {
statements = new MemStatement[capacity];
size = 0;
}
public MemStatementList(MemStatementList other) {
this(other.size);
addAll(other);
}
/*---------*
* Methods *
*---------*/
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public MemStatement get(int index) {
if (index < 0 || index >= size) {
if (index < 0) {
throw new IndexOutOfBoundsException("index < 0");
}
else {
throw new IndexOutOfBoundsException("index >= size");
}
}
return statements[index];
}
public void add(MemStatement st) {
if (size == statements.length) {
// Grow array
growArray((size == 0) ? 1 : 2 * size);
}
statements[size] = st;
++size;
}
public void addAll(MemStatementList other) {
if (size + other.size >= statements.length) {
// Grow array
growArray(size + other.size);
}
System.arraycopy(other.statements, 0, statements, size, other.size);
size += other.size;
}
public void remove(int index) {
if (index < 0 || index >= size) {
if (index < 0) {
throw new IndexOutOfBoundsException("index < 0");
}
else {
throw new IndexOutOfBoundsException("index >= size");
}
}
if (index == size - 1) {
// Last statement in array
statements[index] = null;
--size;
}
else {
// Not last statement in array, move last
// statement over the one at [index]
--size;
statements[index] = statements[size];
statements[size] = null;
}
}
public void remove(MemStatement st) {
for (int i = 0; i < size; ++i) {
if (statements[i] == st) {
remove(i);
return;
}
}
}
public void clear() {
Arrays.fill(statements, 0, size, null);
size = 0;
}
private void growArray(int newSize) {
MemStatement[] newArray = new MemStatement[newSize];
System.arraycopy(statements, 0, newArray, 0, size);
statements = newArray;
}
}