Mercurial > hg > Members > shoshi > TreeCMSv2
comparison 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 |
comparison
equal
deleted
inserted
replaced
24:68021f7091e1 | 25:c1e7ec6b3d44 |
---|---|
1 package treecms.collections; | |
2 | |
3 import java.util.ArrayList; | |
4 import java.util.Arrays; | |
5 import java.util.Collection; | |
6 import java.util.Collections; | |
7 import java.util.Iterator; | |
8 import java.util.List; | |
9 import java.util.ListIterator; | |
10 import java.util.RandomAccess; | |
11 import java.util.concurrent.locks.ReentrantLock; | |
12 | |
13 | |
14 public class CopyOnWriteArrayList<E> implements List<E> , RandomAccess | |
15 { | |
16 private volatile Object[] m_array; | |
17 private final ReentrantLock m_lock; | |
18 | |
19 public CopyOnWriteArrayList() | |
20 { | |
21 m_array = new Object[0]; | |
22 m_lock = new ReentrantLock(); | |
23 } | |
24 | |
25 public CopyOnWriteArrayList(List<E> _list) | |
26 { | |
27 this(); | |
28 if(_list instanceof CopyOnWriteArrayList){ | |
29 CopyOnWriteArrayList<E> list = (CopyOnWriteArrayList<E>)_list; | |
30 m_array = list.m_array; | |
31 } | |
32 } | |
33 | |
34 @Override | |
35 public int size() | |
36 { | |
37 return m_array.length; | |
38 } | |
39 | |
40 @Override | |
41 public boolean isEmpty() | |
42 { | |
43 return (size() == 0) ? true : false; | |
44 } | |
45 | |
46 @Override | |
47 public boolean contains(Object _o) | |
48 { | |
49 Object[] array = m_array; | |
50 for(Object item : array){ | |
51 if(item.equals(_o)){ | |
52 return true; | |
53 } | |
54 } | |
55 return false; | |
56 } | |
57 | |
58 @Override | |
59 public Iterator<E> iterator() | |
60 { | |
61 List<E> list = (List<E>)Arrays.asList(m_array); | |
62 return Collections.unmodifiableList(list).iterator(); | |
63 } | |
64 | |
65 @Override | |
66 public Object[] toArray() | |
67 { | |
68 return Arrays.copyOf(m_array,size()); | |
69 } | |
70 | |
71 @Override | |
72 public <T> T[] toArray(T[] _a) | |
73 { | |
74 final Object[] ret; | |
75 int size = size(); | |
76 if(_a.length < size){ | |
77 ret = Arrays.copyOf(m_array,size); | |
78 }else{ | |
79 System.arraycopy(m_array,0,_a,0,size); | |
80 ret = _a; | |
81 } | |
82 | |
83 return (T[])ret; | |
84 } | |
85 | |
86 @Override | |
87 public synchronized boolean add(E e) | |
88 { | |
89 int size = m_array.length; | |
90 Object[] newArray = new Object[size + 1]; | |
91 System.arraycopy(m_array,0,newArray,0,size); | |
92 newArray[size] = e; | |
93 m_array = newArray; | |
94 return true; | |
95 } | |
96 | |
97 @Override | |
98 public synchronized boolean remove(Object o) | |
99 { | |
100 int size = size(); | |
101 Object[] array = new Object[size - 1]; | |
102 | |
103 for(int i = 0;i < size;i ++){ | |
104 Object item = m_array[i]; | |
105 if(item.equals(o)){ | |
106 for(i = i + 1;i < size;i ++){ | |
107 array[i - 1] = m_array[i]; | |
108 } | |
109 | |
110 m_array = array; | |
111 return true; | |
112 } | |
113 array[i] = item; | |
114 } | |
115 | |
116 return false; | |
117 } | |
118 | |
119 @Override | |
120 public boolean containsAll(Collection<?> c) | |
121 { | |
122 boolean ret = true; | |
123 for(Object e1 : c){ | |
124 ret = ret & contains(e1); | |
125 } | |
126 return ret; | |
127 } | |
128 | |
129 @Override | |
130 public synchronized boolean addAll(Collection<? extends E> c) | |
131 { | |
132 Object[] array = new Object[size() + c.size()]; | |
133 System.arraycopy(m_array,0,array,0,m_array.length); | |
134 | |
135 int i = m_array.length + 1; | |
136 for(Object e : c){ | |
137 array[i] = e; | |
138 i++; | |
139 } | |
140 return true; | |
141 } | |
142 | |
143 @Override | |
144 public synchronized boolean addAll(int index, Collection<? extends E> c) | |
145 { | |
146 Object[] array = new Object[size() + c.size()]; | |
147 System.arraycopy(m_array,0,array,0,index); | |
148 | |
149 int i = index + 1; | |
150 for(Object e : c){ | |
151 array[i] = e; | |
152 i ++; | |
153 } | |
154 | |
155 System.arraycopy(m_array,index + 1,array,i + 1,size() - index); | |
156 m_array = array; | |
157 return true; | |
158 } | |
159 | |
160 @Override | |
161 public boolean removeAll(Collection<?> c) | |
162 { | |
163 Object[] array = new Object[size() - c.size()]; | |
164 | |
165 return false; | |
166 } | |
167 | |
168 @Override | |
169 public boolean retainAll(Collection<?> c) | |
170 { | |
171 // TODO Auto-generated method stub | |
172 return false; | |
173 } | |
174 | |
175 @Override | |
176 public void clear() { | |
177 // TODO Auto-generated method stub | |
178 | |
179 } | |
180 | |
181 @Override | |
182 public E get(int index) { | |
183 // TODO Auto-generated method stub | |
184 return null; | |
185 } | |
186 | |
187 @Override | |
188 public E set(int index, E element) { | |
189 // TODO Auto-generated method stub | |
190 return null; | |
191 } | |
192 | |
193 @Override | |
194 public void add(int index, E element) { | |
195 // TODO Auto-generated method stub | |
196 | |
197 } | |
198 | |
199 @Override | |
200 public E remove(int index) { | |
201 // TODO Auto-generated method stub | |
202 return null; | |
203 } | |
204 | |
205 @Override | |
206 public int indexOf(Object o) { | |
207 // TODO Auto-generated method stub | |
208 return 0; | |
209 } | |
210 | |
211 @Override | |
212 public int lastIndexOf(Object o) { | |
213 // TODO Auto-generated method stub | |
214 return 0; | |
215 } | |
216 | |
217 @Override | |
218 public ListIterator<E> listIterator() | |
219 { | |
220 // TODO Auto-generated method stub | |
221 return null; | |
222 } | |
223 | |
224 @Override | |
225 public ListIterator<E> listIterator(int index) | |
226 { | |
227 // TODO Auto-generated method stub | |
228 return null; | |
229 } | |
230 | |
231 @Override | |
232 public List<E> subList(int fromIndex, int toIndex) | |
233 { | |
234 return null; | |
235 } | |
236 | |
237 } |