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