Mercurial > hg > Members > shoshi > TreeCMSv2
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; + } + +}