1098 |
|
} |
1099 |
|
|
1100 |
|
/** A customized variant of Spliterators.IteratorSpliterator */ |
1101 |
< |
static final class LBDSpliterator<E> implements Spliterator<E> { |
1101 |
> |
private final class LBDSpliterator implements Spliterator<E> { |
1102 |
|
static final int MAX_BATCH = 1 << 25; // max batch array size; |
1103 |
– |
final LinkedBlockingDeque<E> queue; |
1103 |
|
Node<E> current; // current node; null until initialized |
1104 |
|
int batch; // batch size for splits |
1105 |
|
boolean exhausted; // true when no more nodes |
1106 |
|
long est; // size estimate |
1107 |
< |
LBDSpliterator(LinkedBlockingDeque<E> queue) { |
1108 |
< |
this.queue = queue; |
1110 |
< |
this.est = queue.size(); |
1111 |
< |
} |
1107 |
> |
|
1108 |
> |
LBDSpliterator() { est = size(); } |
1109 |
|
|
1110 |
|
public long estimateSize() { return est; } |
1111 |
|
|
1112 |
|
public Spliterator<E> trySplit() { |
1113 |
|
Node<E> h; |
1117 |
– |
final LinkedBlockingDeque<E> q = this.queue; |
1114 |
|
int b = batch; |
1115 |
|
int n = (b <= 0) ? 1 : (b >= MAX_BATCH) ? MAX_BATCH : b + 1; |
1116 |
|
if (!exhausted && |
1117 |
|
(((h = current) != null && h != h.next) |
1118 |
< |
|| (h = q.first) != null) |
1118 |
> |
|| (h = first) != null) |
1119 |
|
&& h.next != null) { |
1120 |
|
Object[] a = new Object[n]; |
1121 |
< |
final ReentrantLock lock = q.lock; |
1121 |
> |
final ReentrantLock lock = LinkedBlockingDeque.this.lock; |
1122 |
|
int i = 0; |
1123 |
|
Node<E> p = current; |
1124 |
|
lock.lock(); |
1125 |
|
try { |
1126 |
< |
if (((p != null && p != p.next) || (p = q.first) != null) |
1126 |
> |
if (((p != null && p != p.next) || (p = first) != null) |
1127 |
|
&& p.item != null) |
1128 |
|
for (; p != null && i < n; p = p.next) |
1129 |
|
a[i++] = p.item; |
1152 |
|
if (exhausted) |
1153 |
|
return; |
1154 |
|
exhausted = true; |
1155 |
< |
final LinkedBlockingDeque<E> q = this.queue; |
1160 |
< |
final ReentrantLock lock = q.lock; |
1155 |
> |
final ReentrantLock lock = LinkedBlockingDeque.this.lock; |
1156 |
|
Node<E> p = current; |
1157 |
|
current = null; |
1158 |
|
do { |
1159 |
|
E e = null; |
1160 |
|
lock.lock(); |
1161 |
|
try { |
1162 |
< |
if ((p != null && p != p.next) || (p = q.first) != null) { |
1162 |
> |
if ((p != null && p != p.next) || (p = first) != null) { |
1163 |
|
e = p.item; |
1164 |
|
p = p.next; |
1165 |
|
} |
1175 |
|
if (action == null) throw new NullPointerException(); |
1176 |
|
if (exhausted) |
1177 |
|
return false; |
1178 |
< |
final LinkedBlockingDeque<E> q = this.queue; |
1184 |
< |
final ReentrantLock lock = q.lock; |
1178 |
> |
final ReentrantLock lock = LinkedBlockingDeque.this.lock; |
1179 |
|
Node<E> p = current; |
1180 |
|
E e = null; |
1181 |
|
lock.lock(); |
1182 |
|
try { |
1183 |
< |
if ((p != null && p != p.next) || (p = q.first) != null) { |
1183 |
> |
if ((p != null && p != p.next) || (p = first) != null) { |
1184 |
|
e = p.item; |
1185 |
|
p = p.next; |
1186 |
|
} |
1218 |
|
* @since 1.8 |
1219 |
|
*/ |
1220 |
|
public Spliterator<E> spliterator() { |
1221 |
< |
return new LBDSpliterator<E>(this); |
1221 |
> |
return new LBDSpliterator(); |
1222 |
|
} |
1223 |
|
|
1224 |
|
/** |