diff src/treecms/collections/CopyOnWriteArrayList.java @ 25:c1e7ec6b3d44

commit
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Tue, 12 Jul 2011 14:39:35 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/collections/CopyOnWriteArrayList.java	Tue Jul 12 14:39:35 2011 +0900
@@ -0,0 +1,237 @@
+package treecms.collections;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.RandomAccess;
+import java.util.concurrent.locks.ReentrantLock;
+
+
+public class CopyOnWriteArrayList<E> implements List<E> , RandomAccess
+{
+	private volatile Object[] m_array;
+	private final ReentrantLock m_lock;
+	
+	public CopyOnWriteArrayList()
+	{
+		m_array = new Object[0];
+		m_lock = new ReentrantLock();
+	}
+	
+	public CopyOnWriteArrayList(List<E> _list)
+	{
+		this();
+		if(_list instanceof CopyOnWriteArrayList){
+			CopyOnWriteArrayList<E> list = (CopyOnWriteArrayList<E>)_list;
+			m_array = list.m_array;
+		}
+	}
+
+	@Override
+	public int size()
+	{
+		return m_array.length;
+	}
+
+	@Override
+	public boolean isEmpty()
+	{
+		return (size() == 0) ? true : false;
+	}
+
+	@Override
+	public boolean contains(Object _o)
+	{
+		Object[] array = m_array;
+		for(Object item : array){
+			if(item.equals(_o)){
+				return true;
+			}
+		}
+		return false;
+	}
+
+	@Override
+	public Iterator<E> iterator()
+	{
+		List<E> list = (List<E>)Arrays.asList(m_array);
+		return Collections.unmodifiableList(list).iterator();
+	}
+
+	@Override
+	public Object[] toArray()
+	{
+		return Arrays.copyOf(m_array,size());
+	}
+
+	@Override
+	public <T> T[] toArray(T[] _a)
+	{
+		final Object[] ret;
+		int size = size();
+		if(_a.length < size){
+			ret = Arrays.copyOf(m_array,size);
+		}else{
+			System.arraycopy(m_array,0,_a,0,size);
+			ret = _a;
+		}
+		
+		return (T[])ret;
+	}
+
+	@Override
+	public synchronized boolean add(E e)
+	{
+		int size = m_array.length;
+		Object[] newArray = new Object[size + 1];
+		System.arraycopy(m_array,0,newArray,0,size);
+		newArray[size] = e;
+		m_array = newArray;
+		return true;
+	}
+
+	@Override
+	public synchronized boolean remove(Object o)
+	{
+		int size = size();
+		Object[] array = new Object[size - 1];
+		
+		for(int i = 0;i < size;i ++){
+			Object item = m_array[i];
+			if(item.equals(o)){
+				for(i = i + 1;i < size;i ++){
+					array[i - 1] = m_array[i];
+				}
+				
+				m_array = array;
+				return true;
+			}
+			array[i] = item;
+		}
+		
+		return false;
+	}
+
+	@Override
+	public boolean containsAll(Collection<?> c)
+	{
+		boolean ret = true;
+		for(Object e1 : c){
+			ret = ret & contains(e1);
+		}
+		return ret;
+	}
+
+	@Override
+	public synchronized boolean addAll(Collection<? extends E> c)
+	{
+		Object[] array = new Object[size() + c.size()];
+		System.arraycopy(m_array,0,array,0,m_array.length);
+		
+		int i = m_array.length + 1;
+		for(Object e : c){
+			array[i] = e;
+			i++;
+		}
+		return true;
+	}
+
+	@Override
+	public synchronized boolean addAll(int index, Collection<? extends E> c)
+	{
+		Object[] array = new Object[size() + c.size()];
+		System.arraycopy(m_array,0,array,0,index);
+		
+		int i = index + 1;
+		for(Object e : c){
+			array[i] = e;
+			i ++;
+		}
+		
+		System.arraycopy(m_array,index + 1,array,i + 1,size() - index);
+		m_array = array;
+		return true;
+	}
+
+	@Override
+	public boolean removeAll(Collection<?> c)
+	{
+		Object[] array = new Object[size() - c.size()];
+		
+		return false;
+	}
+
+	@Override
+	public boolean retainAll(Collection<?> c)
+	{
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void clear() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public E get(int index) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public E set(int index, E element) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void add(int index, E element) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public E remove(int index) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public int indexOf(Object o) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public int lastIndexOf(Object o) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public ListIterator<E> listIterator()
+	{
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ListIterator<E> listIterator(int index)
+	{
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<E> subList(int fromIndex, int toIndex)
+	{
+		return null;
+	}
+
+}