XmlArrayList.java
/*
* Copyright (C) 2006 Joe Walnes.
* Copyright (C) 2007, 2008, 2014, 2015, 2020 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 06. July 2006 by Guilherme Silveira
*/
package com.thoughtworks.xstream.persistence;
import java.util.AbstractList;
/**
* A persistent list implementation backed on a XmlMap.
*
* @author Guilherme Silveira
*/
public class XmlArrayList<V> extends AbstractList<V> {
private final XmlMap<Integer, V> map;
public XmlArrayList(final PersistenceStrategy<Integer, V> persistenceStrategy) {
this.map = new XmlMap<>(persistenceStrategy);
}
@Override
public int size() {
return map.size();
}
@Override
public V set(final int index, final V element) {
rangeCheck(index);
final V value = get(index);
map.put(Integer.valueOf(index), element);
return value;
}
@Override
public void add(final int index, final V element) {
final int size = size();
if (index >= size + 1 || index < 0) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
final int to = index != size ? index - 1 : index;
for (int i = size; i > to; i--) {
map.put(Integer.valueOf(i + 1), map.get(Integer.valueOf(i)));
}
map.put(Integer.valueOf(index), element);
}
private void rangeCheck(final int index) {
final int size = size();
if (index >= size || index < 0) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
@Override
public V get(final int index) {
rangeCheck(index);
return map.get(Integer.valueOf(index));
}
@Override
public V remove(final int index) {
final int size = size();
rangeCheck(index);
final V value = map.get(Integer.valueOf(index));
for (int i = index; i < size - 1; i++) {
map.put(Integer.valueOf(i), map.get(Integer.valueOf(i + 1)));
}
map.remove(Integer.valueOf(size - 1));
return value;
}
}