ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/extra166y/AbstractParallelAnyArray.java
Revision: 1.17
Committed: Wed Dec 31 19:18:52 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +3 -3 lines
Log Message:
whitespace

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 */
6
7 package extra166y;
8 import jsr166y.*;
9 import static extra166y.Ops.*;
10 import java.util.*;
11 import java.util.concurrent.atomic.*;
12 import java.lang.reflect.Array;
13
14 /**
15 * Abstract class serving as the basis of parallel
16 * array classes across types.
17 */
18 public abstract class AbstractParallelAnyArray {
19 /*
20 * This class and its subclasses (most of which are defined here
21 * as nested static classes) maintain the execution parameters for
22 * ParallelArray, ParallelDoubleArray, and ParallelLongArray
23 * tasks. Pap instances hold the non-operation-specific control
24 * and data accessors needed for a task as a whole (as opposed to
25 * subtasks), and also house some of the leaf methods that perform
26 * the actual array processing. The leaf methods are for the most
27 * part just plain array operations. They are boringly repetitive
28 * in order to flatten out and minimize inner-loop overhead, as
29 * well as to minimize call-chain depth. This makes it more likely
30 * that dynamic compilers can go the rest of the way, and hoist
31 * per-element method call dispatch, so we have a good chance to
32 * speed up processing via parallelism rather than lose due to
33 * dispatch and indirection overhead. The dispatching from Pap to
34 * FJ and back is otherwise Visitor-pattern-like, allowing the
35 * basic parallelism control for most FJ tasks to be centralized.
36 *
37 * Note the extensive use of raw types. Arrays and generics do not
38 * work together very well. It is more manageable to avoid them here,
39 * and let the public classes perform casts in and out to the
40 * processing here. Also note that the majority of code in concrete
41 * classes is just for managing the various flavors created using
42 * with* methods.
43 *
44 * Internal concrete classes are named using an
45 * abbreviation scheme to avoid mile-long class names:
46 * O, D, L for Object, Double, Long, for underlying Parallel array
47 * U - unfiltered
48 * F - filtered
49 * R - relation-filtered (aka index-filtered)
50 * OM, DM, LM - Mapped
51 * OC, DC, LC - combiner-mapped (aka index-mapped)
52 */
53
54 final ForkJoinPool ex;
55 final int origin;
56 int fence;
57 int threshold;
58
59 AbstractParallelAnyArray(ForkJoinPool ex, int origin, int fence) {
60 this.ex = ex;
61 this.origin = origin;
62 this.fence = fence;
63 }
64
65 // A few public methods exported across all subclasses
66
67 /**
68 * Returns the number of elements selected using bound or
69 * filter restrictions. Note that this method must evaluate
70 * all selectors to return its result.
71 * @return the number of elements
72 */
73 public int size() {
74 if (!hasFilter())
75 return fence - origin;
76 PAS.FJCountSelected f = new PAS.FJCountSelected
77 (this, origin, fence, null);
78 ex.invoke(f);
79 return f.count;
80 }
81
82 /**
83 * Returns the index of some element matching bound and filter
84 * constraints, or -1 if none.
85 * @return index of matching element, or -1 if none
86 */
87 public int anyIndex() {
88 if (!hasFilter())
89 return (origin < fence) ? origin : -1;
90 AtomicInteger result = new AtomicInteger(-1);
91 PAS.FJSelectAny f = new PAS.FJSelectAny
92 (this, origin, fence, null, result);
93 ex.invoke(f);
94 return result.get();
95 }
96
97 /**
98 * Returns true if there are no elements.
99 * @return true if there are no elements
100 */
101 public boolean isEmpty() {
102 return anyIndex() < 0;
103 }
104
105
106 /**
107 * Returns size threshold for splitting into subtask. By
108 * default, uses about 8 times as many tasks as threads
109 */
110 final int computeThreshold() {
111 int n = fence - origin;
112 int p = ex.getParallelism();
113 return threshold = (p > 1) ? (1 + n / (p << 3)) : n;
114 }
115
116 /**
117 * Returns lazily computed threshold.
118 */
119 final int getThreshold() {
120 int t = threshold;
121 if (t == 0)
122 t = computeThreshold();
123 return t;
124 }
125
126 /**
127 * Access methods for ref, double, long. Checking for
128 * null/false return is used as a sort of type test. These
129 * are used to avoid duplication in non-performance-critical
130 * aspects of control, as well as to provide a simple default
131 * mechanism for extensions.
132 */
133 Object[] ogetArray() { return null; }
134 double[] dgetArray() { return null; }
135 long[] lgetArray() { return null; }
136 abstract Object oget(int index);
137 abstract double dget(int index);
138 abstract long lget(int index);
139 boolean hasMap() { return false; }
140 boolean hasFilter() { return false; }
141 boolean isSelected(int index) { return true; }
142
143 /*
144 * Leaf methods for FJ tasks. Default versions use isSelected,
145 * oget, dget, etc. But most are overridden in most concrete
146 * classes to avoid per-element dispatching.
147 */
148
149 void leafApply(int lo, int hi, Procedure procedure) {
150 for (int i = lo; i < hi; ++i)
151 if (isSelected(i))
152 procedure.op(oget(i));
153 }
154
155 void leafApply(int lo, int hi, DoubleProcedure procedure) {
156 for (int i = lo; i < hi; ++i)
157 if (isSelected(i))
158 procedure.op(dget(i));
159 }
160
161 void leafApply(int lo, int hi, LongProcedure procedure) {
162 for (int i = lo; i < hi; ++i)
163 if (isSelected(i))
164 procedure.op(lget(i));
165 }
166
167 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
168 boolean gotFirst = false;
169 Object r = base;
170 for (int i = lo; i < hi; ++i) {
171 if (isSelected(i)) {
172 Object x = oget(i);
173 if (!gotFirst) {
174 gotFirst = true;
175 r = x;
176 }
177 else
178 r = reducer.op(r, x);
179 }
180 }
181 return r;
182 }
183
184 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
185 boolean gotFirst = false;
186 double r = base;
187 for (int i = lo; i < hi; ++i) {
188 if (isSelected(i)) {
189 double x = dget(i);
190 if (!gotFirst) {
191 gotFirst = true;
192 r = x;
193 }
194 else
195 r = reducer.op(r, x);
196 }
197 }
198 return r;
199 }
200
201 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
202 boolean gotFirst = false;
203 long r = base;
204 for (int i = lo; i < hi; ++i) {
205 if (isSelected(i)) {
206 long x = lget(i);
207 if (!gotFirst) {
208 gotFirst = true;
209 r = x;
210 }
211 else
212 r = reducer.op(r, x);
213 }
214 }
215 return r;
216 }
217
218 // copy elements, ignoring selector, but applying mapping
219 void leafTransfer(int lo, int hi, Object[] dest, int offset) {
220 for (int i = lo; i < hi; ++i)
221 dest[offset++] = oget(i);
222 }
223
224 void leafTransfer(int lo, int hi, double[] dest, int offset) {
225 for (int i = lo; i < hi; ++i)
226 dest[offset++] = dget(i);
227 }
228
229 void leafTransfer(int lo, int hi, long[] dest, int offset) {
230 for (int i = lo; i < hi; ++i)
231 dest[offset++] = lget(i);
232 }
233
234 // copy elements indexed in indices[loIdx..hiIdx], ignoring
235 // selector, but applying mapping
236 void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
237 Object[] dest, int offset) {
238 for (int i = loIdx; i < hiIdx; ++i)
239 dest[offset++] = oget(indices[i]);
240 }
241
242 void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
243 double[] dest, int offset) {
244 for (int i = loIdx; i < hiIdx; ++i)
245 dest[offset++] = dget(indices[i]);
246 }
247
248 void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
249 long[] dest, int offset) {
250 for (int i = loIdx; i < hiIdx; ++i)
251 dest[offset++] = lget(indices[i]);
252 }
253
254 // add indices of selected elements to index array; return #added
255 final int leafIndexSelected(int lo, int hi, boolean positive,
256 int[] indices) {
257 int k = 0;
258 for (int i = lo; i < hi; ++i) {
259 if (isSelected(i) == positive)
260 indices[lo + k++] = i;
261 }
262 return k;
263 }
264
265 // move selected elements to indices starting at offset,
266 // return final offset
267 abstract int leafMoveSelected(int lo, int hi, int offset,
268 boolean positive);
269
270 // move elements indexed by indices[loIdx...hiIdx] starting
271 // at given offset
272 abstract void leafMoveByIndex(int[] indices, int loIdx,
273 int hiIdx, int offset);
274
275 /**
276 * Shared support for select/map all -- probe filter, map, and
277 * type to start selection driver, or do parallel mapping, or
278 * just copy.
279 */
280 final Object[] allObjects(Class elementType) {
281 if (hasFilter()) {
282 if (elementType == null) {
283 if (!hasMap())
284 elementType = ogetArray().getClass().getComponentType();
285 else
286 elementType = Object.class;
287 }
288 PAS.FJOSelectAllDriver r = new PAS.FJOSelectAllDriver
289 (this, elementType);
290 ex.invoke(r);
291 return r.results;
292 }
293 else {
294 int n = fence - origin;
295 Object[] dest;
296 if (hasMap()) {
297 if (elementType == null)
298 dest = new Object[n];
299 else
300 dest = (Object[])Array.newInstance(elementType, n);
301 ex.invoke(new PAS.FJOMap(this, origin, fence,
302 null, dest, -origin));
303 }
304 else {
305 Object[] array = ogetArray();
306 if (elementType == null)
307 elementType = array.getClass().getComponentType();
308 dest = (Object[])Array.newInstance(elementType, n);
309 System.arraycopy(array, origin, dest, 0, n);
310 }
311 return dest;
312 }
313 }
314
315 final double[] allDoubles() {
316 if (hasFilter()) {
317 PAS.FJDSelectAllDriver r = new PAS.FJDSelectAllDriver(this);
318 ex.invoke(r);
319 return r.results;
320 }
321 else {
322 int n = fence - origin;
323 double[] dest = new double[n];
324 if (hasMap()) {
325 ex.invoke(new PAS.FJDMap(this, origin, fence,
326 null, dest, -origin));
327 }
328 else {
329 double[] array = dgetArray();
330 System.arraycopy(array, origin, dest, 0, n);
331 }
332 return dest;
333 }
334 }
335
336 final long[] allLongs() {
337 if (hasFilter()) {
338 PAS.FJLSelectAllDriver r = new PAS.FJLSelectAllDriver(this);
339 ex.invoke(r);
340 return r.results;
341 }
342 else {
343 int n = fence - origin;
344 long[] dest = new long[n];
345 if (hasMap()) {
346 ex.invoke(new PAS.FJLMap(this, origin, fence,
347 null, dest, -origin));
348 }
349 else {
350 long[] array = lgetArray();
351 System.arraycopy(array, origin, dest, 0, n);
352 }
353 return dest;
354 }
355 }
356
357 // Bounds check a range
358 void boundsCheck(int lo, int hi) {
359 if (lo > hi)
360 throw new IllegalArgumentException(origin + " > " + fence);
361 if (lo < 0)
362 throw new ArrayIndexOutOfBoundsException(origin);
363 if (hi - lo > this.fence - this.origin)
364 throw new ArrayIndexOutOfBoundsException(fence);
365 }
366
367 /*
368 * The following methods can be called only for classes
369 * supporting in-place replacements (currently, those classes
370 * without mappings). They are declared as no-ops here, and
371 * overridden only where applicable.
372 */
373
374 void leafTransform(int l, int h, Op op) {}
375 void leafIndexMap(int l, int h, IntToObject op) {}
376 void leafBinaryIndexMap(int l, int h, IntAndObjectToObject op) {}
377 void leafGenerate(int l, int h, Generator generator) {}
378 void leafFill(int l, int h, Object value) {}
379 void leafCombineInPlace(int lo, int hi, Object[] other,
380 int otherOffset, BinaryOp combiner) {}
381 void leafCombineInPlace(int lo, int hi, ParallelArrayWithMapping other,
382 int otherOffset, BinaryOp combiner) {}
383
384 void leafTransform(int l, int h, DoubleOp op) {}
385 void leafIndexMap(int l, int h, IntToDouble array) {}
386 void leafBinaryIndexMap(int l, int h, IntAndDoubleToDouble op) {}
387 void leafGenerate(int l, int h, DoubleGenerator generator) {}
388 void leafFill(int l, int h, double value) {}
389 void leafCombineInPlace(int lo, int hi, double[] other,
390 int otherOffset, BinaryDoubleOp combiner) {}
391 void leafCombineInPlace(int lo, int hi,
392 ParallelDoubleArrayWithDoubleMapping other,
393 int otherOffset, BinaryDoubleOp combiner) {}
394
395 void leafTransform(int l, int h, LongOp op) {}
396 void leafIndexMap(int l, int h, IntToLong array) {}
397 void leafBinaryIndexMap(int l, int h, IntAndLongToLong op) {}
398 void leafGenerate(int l, int h, LongGenerator generator) {}
399 void leafFill(int l, int h, long value) {}
400 void leafCombineInPlace(int lo, int hi, long[] other,
401 int otherOffset, BinaryLongOp combiner) {}
402 void leafCombineInPlace(int lo, int hi,
403 ParallelLongArrayWithLongMapping other,
404 int otherOffset, BinaryLongOp combiner) {}
405
406 // Base of object ref array classes
407 abstract static class OPap<T> extends AbstractParallelAnyArray {
408 T[] array;
409 OPap(ForkJoinPool ex, int origin, int fence, T[] array) {
410 super(ex, origin, fence);
411 this.array = array;
412 }
413
414 final Object[] ogetArray() { return this.array; }
415 double dget(int i) { return ((Number)oget(i)).doubleValue(); }
416 long lget(int i) { return ((Number)oget(i)).longValue(); }
417
418 final void leafMoveByIndex(int[] indices, int loIdx,
419 int hiIdx, int offset) {
420 final Object[] array = this.array;
421 for (int i = loIdx; i < hiIdx; ++i)
422 array[offset++] = array[indices[i]];
423 }
424
425 final int leafMoveSelected(int lo, int hi, int offset,
426 boolean positive) {
427 final Object[] array = this.array;
428 for (int i = lo; i < hi; ++i) {
429 if (isSelected(i) == positive)
430 array[offset++] = array[i];
431 }
432 return offset;
433 }
434 }
435
436 // Base of double array classes
437 abstract static class DPap extends AbstractParallelAnyArray {
438 double[] array;
439 DPap(ForkJoinPool ex, int origin, int fence, double[] array) {
440 super(ex, origin, fence);
441 this.array = array;
442 }
443
444 final double[] dgetArray() { return this.array; }
445 Object oget(int i) { return Double.valueOf(dget(i)); }
446 long lget(int i) { return (long)(dget(i)); }
447
448 final void leafMoveByIndex(int[] indices, int loIdx,
449 int hiIdx, int offset) {
450 final double[] array = this.array;
451 for (int i = loIdx; i < hiIdx; ++i)
452 array[offset++] = array[indices[i]];
453 }
454
455 final int leafMoveSelected(int lo, int hi, int offset,
456 boolean positive) {
457 final double[] array = this.array;
458 for (int i = lo; i < hi; ++i) {
459 if (isSelected(i) == positive)
460 array[offset++] = array[i];
461 }
462 return offset;
463 }
464 }
465
466 // Base of long array classes
467 abstract static class LPap extends AbstractParallelAnyArray {
468 long[] array;
469 LPap(ForkJoinPool ex, int origin, int fence, long[] array) {
470 super(ex, origin, fence);
471 this.array = array;
472 }
473
474 final long[] lgetArray() { return this.array; }
475 Object oget(int i) { return Long.valueOf(lget(i)); }
476 double dget(int i) { return (double)(lget(i)); }
477
478 final void leafMoveByIndex(int[] indices, int loIdx,
479 int hiIdx, int offset) {
480 final long[] array = this.array;
481 for (int i = loIdx; i < hiIdx; ++i)
482 array[offset++] = array[indices[i]];
483 }
484
485 final int leafMoveSelected(int lo, int hi, int offset,
486 boolean positive) {
487 final long[] array = this.array;
488 for (int i = lo; i < hi; ++i) {
489 if (isSelected(i) == positive)
490 array[offset++] = array[i];
491 }
492 return offset;
493 }
494 }
495
496 // Plain (unfiltered, unmapped) classes
497 static class OUPap<T> extends ParallelArrayWithBounds<T> {
498 OUPap(ForkJoinPool ex, int origin, int fence, T[] array) {
499 super(ex, origin, fence, array);
500 }
501
502 public ParallelArrayWithBounds<T> withBounds(int lo, int hi) {
503 boundsCheck(lo, hi);
504 return new OUPap<T>(ex, origin + lo, origin + hi, array);
505 }
506
507 public ParallelArrayWithFilter<T> withFilter
508 (Predicate<? super T> selector) {
509 return new OFPap<T>(ex, origin, fence, array, selector);
510 }
511
512 public ParallelArrayWithFilter<T> withIndexedFilter
513 (IntAndObjectPredicate<? super T> selector) {
514 return new ORPap<T>(ex, origin, fence, array, selector);
515 }
516
517 public <U> ParallelArrayWithMapping<T,U> withMapping
518 (Op<? super T, ? extends U> op) {
519 return new OUOMPap<T,U>(ex, origin, fence, array, op);
520 }
521
522 public ParallelArrayWithDoubleMapping<T> withMapping
523 (ObjectToDouble<? super T> op) {
524 return new OUDMPap<T>(ex, origin, fence, array, op);
525 }
526
527 public ParallelArrayWithLongMapping<T> withMapping
528 (ObjectToLong<? super T> op) {
529 return new OULMPap<T>(ex, origin, fence, array, op);
530 }
531
532 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
533 (IntAndObjectToObject<? super T, ? extends V> mapper) {
534 return new OUOCPap<T,V>(ex, origin, fence, array, mapper);
535 }
536
537 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
538 (IntAndObjectToDouble<? super T> mapper) {
539 return new OUDCPap<T>(ex, origin, fence, array, mapper);
540 }
541
542 public ParallelArrayWithLongMapping<T> withIndexedMapping
543 (IntAndObjectToLong<? super T> mapper) {
544 return new OULCPap<T>(ex, origin, fence, array, mapper);
545 }
546
547 public int indexOf(T target) {
548 AtomicInteger result = new AtomicInteger(-1);
549 PAS.FJOIndexOf f = new PAS.FJOIndexOf
550 (this, origin, fence, null, result, target);
551 ex.invoke(f);
552 return result.get();
553 }
554
555 public int binarySearch(T target) {
556 final Object[] a = this.array;
557 int lo = origin;
558 int hi = fence - 1;
559 while (lo <= hi) {
560 int mid = (lo + hi) >>> 1;
561 int c = ((Comparable)target).compareTo((Comparable)a[mid]);
562 if (c == 0)
563 return mid;
564 else if (c < 0)
565 hi = mid - 1;
566 else
567 lo = mid + 1;
568 }
569 return -1;
570 }
571
572 public int binarySearch(T target, Comparator<? super T> comparator) {
573 Comparator cmp = comparator;
574 final Object[] a = this.array;
575 int lo = origin;
576 int hi = fence - 1;
577 while (lo <= hi) {
578 int mid = (lo + hi) >>> 1;
579 int c = cmp.compare(target, a[mid]);
580 if (c == 0)
581 return mid;
582 else if (c < 0)
583 hi = mid - 1;
584 else
585 lo = mid + 1;
586 }
587 return -1;
588 }
589
590 public ParallelArrayWithBounds<T> cumulate(Reducer<T> reducer, T base) {
591 PAS.FJOCumulateOp op = new PAS.FJOCumulateOp(this, reducer, base);
592 PAS.FJOScan r = new PAS.FJOScan(null, op, origin, fence);
593 ex.invoke(r);
594 return this;
595 }
596
597 public T precumulate(Reducer<T> reducer, T base) {
598 PAS.FJOPrecumulateOp op = new PAS.FJOPrecumulateOp
599 (this, reducer, base);
600 PAS.FJOScan r = new PAS.FJOScan(null, op, origin, fence);
601 ex.invoke(r);
602 return (T)(r.out);
603 }
604
605 public ParallelArrayWithBounds<T> sort
606 (Comparator<? super T> cmp) {
607 final Object[] a = this.array;
608 Class tc = array.getClass().getComponentType();
609 T[] ws = (T[])Array.newInstance(tc, fence);
610 ex.invoke(new PAS.FJOSorter
611 (cmp, array, ws, origin,
612 fence - origin, getThreshold()));
613 return this;
614 }
615
616 public ParallelArrayWithBounds<T> sort() {
617 final Object[] a = this.array;
618 Class tc = array.getClass().getComponentType();
619 if (!Comparable.class.isAssignableFrom(tc)) {
620 sort(CommonOps.castedComparator());
621 }
622 else {
623 Comparable[] ca = (Comparable[])array;
624 Comparable[] ws = (Comparable[])Array.newInstance(tc, fence);
625 ex.invoke(new PAS.FJOCSorter
626 (ca, ws, origin,
627 fence - origin, getThreshold()));
628 }
629 return this;
630 }
631
632 final void leafApply(int lo, int hi, Procedure procedure) {
633 final Object[] a = this.array;
634 for (int i = lo; i < hi; ++i)
635 procedure.op(a[i]);
636 }
637
638 final Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
639 if (lo >= hi)
640 return base;
641 final Object[] a = this.array;
642 Object r = a[lo];
643 for (int i = lo+1; i < hi; ++i)
644 r = reducer.op(r, a[i]);
645 return r;
646 }
647
648 final void leafTransform(int l, int h, Op op) {
649 final Object[] a = this.array;
650 for (int i = l; i < h; ++i)
651 a[i] = op.op(a[i]);
652 }
653
654 final void leafIndexMap(int l, int h, IntToObject op) {
655 final Object[] a = this.array;
656 for (int i = l; i < h; ++i)
657 a[i] = op.op(i);
658 }
659
660 final void leafBinaryIndexMap(int l, int h, IntAndObjectToObject op) {
661 final Object[] a = this.array;
662 for (int i = l; i < h; ++i)
663 a[i] = op.op(i, a[i]);
664 }
665
666 final void leafGenerate(int l, int h, Generator generator) {
667 final Object[] a = this.array;
668 for (int i = l; i < h; ++i)
669 a[i] = generator.op();
670 }
671
672 final void leafFill(int l, int h, Object value) {
673 final Object[] a = this.array;
674 for (int i = l; i < h; ++i)
675 a[i] = value;
676 }
677
678 final void leafCombineInPlace(int l, int h, Object[] other,
679 int otherOffset, BinaryOp combiner) {
680 final Object[] a = this.array;
681 int k = l + otherOffset;
682 for (int i = l; i < h; ++i)
683 a[i] = combiner.op(a[i], other[k++]);
684 }
685
686 final void leafCombineInPlace(int l, int h,
687 ParallelArrayWithMapping other,
688 int otherOffset, BinaryOp combiner) {
689 final Object[] a = this.array;
690 int k = l + otherOffset;
691 if (other.hasFilter()) {
692 for (int i = l; i < h; ++i) {
693 if (other.isSelected(k))
694 a[i] = combiner.op(a[i], other.oget(k));
695 k++;
696 }
697 }
698 else if (other.hasMap()) {
699 for (int i = l; i < h; ++i)
700 a[i] = combiner.op(a[i], other.oget(k++));
701 }
702 else {
703 Object[] b = other.array;
704 for (int i = l; i < h; ++i)
705 a[i] = combiner.op(a[i], b[k++]);
706 }
707 }
708 }
709
710 static class DUPap extends ParallelDoubleArrayWithBounds {
711 DUPap(ForkJoinPool ex, int origin, int fence, double[] array) {
712 super(ex, origin, fence, array);
713 }
714
715 public ParallelDoubleArrayWithBounds withBounds(int lo, int hi) {
716 boundsCheck(lo, hi);
717 return new DUPap(ex, origin + lo, origin + hi, array);
718 }
719
720 public ParallelDoubleArrayWithFilter withFilter(DoublePredicate selector) {
721 return new DFPap(ex, origin, fence, array, selector);
722 }
723
724 public ParallelDoubleArrayWithFilter withIndexedFilter
725 (IntAndDoublePredicate selector) {
726 return new DRPap(ex, origin, fence, array, selector);
727 }
728
729 public <U> ParallelDoubleArrayWithMapping<U> withMapping
730 (DoubleToObject<? extends U> op) {
731 return new DUOMPap<U>(ex, origin, fence, array, op);
732 }
733
734 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
735 return new DUDMPap(ex, origin, fence, array, op);
736 }
737
738 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
739 return new DULMPap(ex, origin, fence, array, op);
740 }
741
742 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
743 (IntAndDoubleToObject<? extends V> mapper) {
744 return new DUOCPap<V>(ex, origin, fence, array, mapper);
745 }
746
747 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
748 (IntAndDoubleToDouble mapper) {
749 return new DUDCPap(ex, origin, fence, array, mapper);
750 }
751
752 public ParallelDoubleArrayWithLongMapping withIndexedMapping
753 (IntAndDoubleToLong mapper) {
754 return new DULCPap(ex, origin, fence, array, mapper);
755 }
756
757 public int indexOf(double target) {
758 AtomicInteger result = new AtomicInteger(-1);
759 PAS.FJDIndexOf f = new PAS.FJDIndexOf
760 (this, origin, fence, null, result, target);
761 ex.invoke(f);
762 return result.get();
763 }
764
765 public int binarySearch(double target) {
766 final double[] a = this.array;
767 int lo = origin;
768 int hi = fence - 1;
769 while (lo <= hi) {
770 int mid = (lo + hi) >>> 1;
771 double m = a[mid];
772 if (target == m)
773 return mid;
774 else if (target < m)
775 hi = mid - 1;
776 else
777 lo = mid + 1;
778 }
779 return -1;
780 }
781
782 public int binarySearch(double target, DoubleComparator comparator) {
783 final double[] a = this.array;
784 int lo = origin;
785 int hi = fence - 1;
786 while (lo <= hi) {
787 int mid = (lo + hi) >>> 1;
788 int c = comparator.compare(target, a[mid]);
789 if (c == 0)
790 return mid;
791 else if (c < 0)
792 hi = mid - 1;
793 else
794 lo = mid + 1;
795 }
796 return -1;
797 }
798
799 public ParallelDoubleArrayWithBounds cumulate(DoubleReducer reducer,
800 double base) {
801 PAS.FJDCumulateOp op = new PAS.FJDCumulateOp(this, reducer, base);
802 PAS.FJDScan r = new PAS.FJDScan(null, op, origin, fence);
803 ex.invoke(r);
804 return this;
805 }
806
807 public ParallelDoubleArrayWithBounds cumulateSum() {
808 PAS.FJDCumulatePlusOp op = new PAS.FJDCumulatePlusOp(this);
809 PAS.FJDScan r = new PAS.FJDScan(null, op, origin, fence);
810 ex.invoke(r);
811 return this;
812 }
813
814 public double precumulate(DoubleReducer reducer, double base) {
815 PAS.FJDPrecumulateOp op = new PAS.FJDPrecumulateOp(this, reducer, base);
816 PAS.FJDScan r = new PAS.FJDScan(null, op, origin, fence);
817 ex.invoke(r);
818 return r.out;
819 }
820
821 public double precumulateSum() {
822 PAS.FJDPrecumulatePlusOp op = new PAS.FJDPrecumulatePlusOp(this);
823 PAS.FJDScan r = new PAS.FJDScan(null, op, origin, fence);
824 ex.invoke(r);
825 return r.out;
826 }
827
828 public ParallelDoubleArrayWithBounds sort(DoubleComparator cmp) {
829 ex.invoke(new PAS.FJDSorter
830 (cmp, this.array, new double[fence],
831 origin, fence - origin, getThreshold()));
832 return this;
833 }
834
835 public ParallelDoubleArrayWithBounds sort() {
836 ex.invoke(new PAS.FJDCSorter
837 (this.array, new double[fence],
838 origin, fence - origin, getThreshold()));
839 return this;
840 }
841
842 final void leafApply(int lo, int hi, DoubleProcedure procedure) {
843 final double[] a = this.array;
844 for (int i = lo; i < hi; ++i)
845 procedure.op(a[i]);
846 }
847
848 final double leafReduce(int lo, int hi, DoubleReducer reducer,
849 double base) {
850 if (lo >= hi)
851 return base;
852 final double[] a = this.array;
853 double r = a[lo];
854 for (int i = lo+1; i < hi; ++i)
855 r = reducer.op(r, a[i]);
856 return r;
857 }
858
859 final void leafTransform(int l, int h, DoubleOp op) {
860 final double[] a = this.array;
861 for (int i = l; i < h; ++i)
862 a[i] = op.op(a[i]);
863 }
864
865 final void leafIndexMap(int l, int h, IntToDouble op) {
866 final double[] a = this.array;
867 for (int i = l; i < h; ++i)
868 a[i] = op.op(i);
869 }
870
871 final void leafBinaryIndexMap(int l, int h, IntAndDoubleToDouble op) {
872 final double[] a = this.array;
873 for (int i = l; i < h; ++i)
874 a[i] = op.op(i, a[i]);
875 }
876
877 final void leafGenerate(int l, int h, DoubleGenerator generator) {
878 final double[] a = this.array;
879 for (int i = l; i < h; ++i)
880 a[i] = generator.op();
881 }
882
883 final void leafFill(int l, int h, double value) {
884 final double[] a = this.array;
885 for (int i = l; i < h; ++i)
886 a[i] = value;
887 }
888
889 final void leafCombineInPlace
890 (int l, int h, double[] other,
891 int otherOffset, BinaryDoubleOp combiner) {
892 final double[] a = this.array;
893 int k = l + otherOffset;
894 for (int i = l; i < h; ++i)
895 a[i] = combiner.op(a[i], other[k++]);
896 }
897
898 final void leafCombineInPlace
899 (int l, int h,
900 ParallelDoubleArrayWithDoubleMapping other,
901 int otherOffset, BinaryDoubleOp combiner) {
902 final double[] a = this.array;
903 int k = l + otherOffset;
904 if (other.hasFilter()) {
905 for (int i = l; i < h; ++i) {
906 if (other.isSelected(k))
907 a[i] = combiner.op(a[i], other.dget(k));
908 k++;
909 }
910 }
911 else if (other.hasMap()) {
912 for (int i = l; i < h; ++i)
913 a[i] = combiner.op(a[i], other.dget(k++));
914 }
915 else {
916 double[] b = other.array;
917 for (int i = l; i < h; ++i)
918 a[i] = combiner.op(a[i], b[k++]);
919 }
920
921 }
922 }
923
924 static class LUPap extends ParallelLongArrayWithBounds {
925 LUPap(ForkJoinPool ex, int origin, int fence,
926 long[] array) {
927 super(ex, origin, fence, array);
928 }
929
930 public ParallelLongArrayWithBounds withBounds(int lo, int hi) {
931 boundsCheck(lo, hi);
932 return new LUPap(ex, origin + lo, origin + hi, array);
933 }
934
935 public ParallelLongArrayWithFilter withFilter(LongPredicate selector) {
936 return new LFPap(ex, origin, fence, array, selector);
937 }
938
939 public ParallelLongArrayWithFilter withIndexedFilter
940 (IntAndLongPredicate selector) {
941 return new LRPap(ex, origin, fence, array, selector);
942 }
943
944 public <U> ParallelLongArrayWithMapping<U> withMapping
945 (LongToObject<? extends U> op) {
946 return new LUOMPap<U>(ex, origin, fence, array, op);
947 }
948
949 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
950 return new LULMPap(ex, origin, fence, array, op);
951 }
952
953 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
954 return new LUDMPap(ex, origin, fence, array, op);
955 }
956
957 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
958 (IntAndLongToObject<? extends V> mapper) {
959 return new LUOCPap<V>(ex, origin, fence, array, mapper);
960 }
961
962 public ParallelLongArrayWithDoubleMapping withIndexedMapping
963 (IntAndLongToDouble mapper) {
964 return new LUDCPap(ex, origin, fence, array, mapper);
965 }
966
967 public ParallelLongArrayWithLongMapping withIndexedMapping
968 (IntAndLongToLong mapper) {
969 return new LULCPap(ex, origin, fence, array, mapper);
970 }
971
972 public int indexOf(long target) {
973 AtomicInteger result = new AtomicInteger(-1);
974 PAS.FJLIndexOf f = new PAS.FJLIndexOf
975 (this, origin, fence, null, result, target);
976 ex.invoke(f);
977 return result.get();
978 }
979
980 public int binarySearch(long target) {
981 final long[] a = this.array;
982 int lo = origin;
983 int hi = fence - 1;
984 while (lo <= hi) {
985 int mid = (lo + hi) >>> 1;
986 long m = a[mid];
987 if (target == m)
988 return mid;
989 else if (target < m)
990 hi = mid - 1;
991 else
992 lo = mid + 1;
993 }
994 return -1;
995 }
996
997 public int binarySearch(long target, LongComparator comparator) {
998 final long[] a = this.array;
999 int lo = origin;
1000 int hi = fence - 1;
1001 while (lo <= hi) {
1002 int mid = (lo + hi) >>> 1;
1003 int c = comparator.compare(target, a[mid]);
1004 if (c == 0)
1005 return mid;
1006 else if (c < 0)
1007 hi = mid - 1;
1008 else
1009 lo = mid + 1;
1010 }
1011 return -1;
1012 }
1013
1014 public ParallelLongArrayWithBounds cumulate(LongReducer reducer, long base) {
1015 PAS.FJLCumulateOp op = new PAS.FJLCumulateOp(this, reducer, base);
1016 PAS.FJLScan r = new PAS.FJLScan(null, op, origin, fence);
1017 ex.invoke(r);
1018 return this;
1019 }
1020
1021 public ParallelLongArrayWithBounds cumulateSum() {
1022 PAS.FJLCumulatePlusOp op = new PAS.FJLCumulatePlusOp(this);
1023 PAS.FJLScan r = new PAS.FJLScan(null, op, origin, fence);
1024 ex.invoke(r);
1025 return this;
1026 }
1027
1028 public long precumulate(LongReducer reducer, long base) {
1029 PAS.FJLPrecumulateOp op = new PAS.FJLPrecumulateOp
1030 (this, reducer, base);
1031 PAS.FJLScan r = new PAS.FJLScan(null, op, origin, fence);
1032 ex.invoke(r);
1033 return r.out;
1034 }
1035
1036 public long precumulateSum() {
1037 PAS.FJLPrecumulatePlusOp op = new PAS.FJLPrecumulatePlusOp(this);
1038 PAS.FJLScan r = new PAS.FJLScan(null, op, origin, fence);
1039 ex.invoke(r);
1040 return r.out;
1041 }
1042
1043 public ParallelLongArrayWithBounds sort(LongComparator cmp) {
1044 ex.invoke(new PAS.FJLSorter
1045 (cmp, this.array, new long[fence],
1046 origin, fence - origin, getThreshold()));
1047 return this;
1048 }
1049
1050 public ParallelLongArrayWithBounds sort() {
1051 ex.invoke(new PAS.FJLCSorter
1052 (this.array, new long[fence],
1053 origin, fence - origin, getThreshold()));
1054 return this;
1055 }
1056
1057 final void leafApply(int lo, int hi, LongProcedure procedure) {
1058 final long[] a = this.array;
1059 for (int i = lo; i < hi; ++i)
1060 procedure.op(a[i]);
1061 }
1062
1063 final long leafReduce(int lo, int hi, LongReducer reducer, long base) {
1064 if (lo >= hi)
1065 return base;
1066 final long[] a = this.array;
1067 long r = a[lo];
1068 for (int i = lo+1; i < hi; ++i)
1069 r = reducer.op(r, a[i]);
1070 return r;
1071 }
1072
1073 final void leafTransform(int l, int h, LongOp op) {
1074 final long[] a = this.array;
1075 for (int i = l; i < h; ++i)
1076 a[i] = op.op(a[i]);
1077 }
1078
1079 final void leafIndexMap(int l, int h, IntToLong op) {
1080 final long[] a = this.array;
1081 for (int i = l; i < h; ++i)
1082 a[i] = op.op(i);
1083 }
1084
1085 final void leafBinaryIndexMap(int l, int h, IntAndLongToLong op) {
1086 final long[] a = this.array;
1087 for (int i = l; i < h; ++i)
1088 a[i] = op.op(i, a[i]);
1089 }
1090
1091 final void leafGenerate(int l, int h, LongGenerator generator) {
1092 final long[] a = this.array;
1093 for (int i = l; i < h; ++i)
1094 a[i] = generator.op();
1095 }
1096
1097 final void leafFill(int l, int h, long value) {
1098 final long[] a = this.array;
1099 for (int i = l; i < h; ++i)
1100 a[i] = value;
1101 }
1102
1103 final void leafCombineInPlace
1104 (int l, int h, long[] other,
1105 int otherOffset, BinaryLongOp combiner) {
1106 final long[] a = this.array;
1107 int k = l + otherOffset;
1108 for (int i = l; i < h; ++i)
1109 a[i] = combiner.op(a[i], other[k++]);
1110 }
1111
1112 final void leafCombineInPlace
1113 (int l, int h,
1114 ParallelLongArrayWithLongMapping other,
1115 int otherOffset, BinaryLongOp combiner) {
1116 final long[] a = this.array;
1117 int k = l + otherOffset;
1118 if (other.hasFilter()) {
1119 for (int i = l; i < h; ++i) {
1120 if (other.isSelected(k))
1121 a[i] = combiner.op(a[i], other.lget(k));
1122 k++;
1123 }
1124 }
1125 else if (other.hasMap()) {
1126 for (int i = l; i < h; ++i)
1127 a[i] = combiner.op(a[i], other.lget(k++));
1128 }
1129 else {
1130 long[] b = other.array;
1131 for (int i = l; i < h; ++i)
1132 a[i] = combiner.op(a[i], b[k++]);
1133 }
1134 }
1135 }
1136
1137 static final class AndPredicate<T> implements Predicate<T> {
1138 final Predicate<? super T> first;
1139 final Predicate<? super T> second;
1140 AndPredicate(Predicate<? super T> first,
1141 Predicate<? super T> second) {
1142 this.first = first; this.second = second;
1143 }
1144 public final boolean op(T x) { return first.op(x) && second.op(x); }
1145 }
1146
1147 // Filtered (but unmapped) classes
1148 static final class OFPap<T> extends ParallelArrayWithFilter<T> {
1149 final Predicate<? super T> selector;
1150 OFPap(ForkJoinPool ex, int origin, int fence,
1151 T[] array,
1152 Predicate<? super T> selector) {
1153 super(ex, origin, fence, array);
1154 this.selector = selector;
1155 }
1156
1157 boolean hasFilter() { return true; }
1158 boolean isSelected(int i) { return selector.op(this.array[i]); }
1159
1160 public ParallelArrayWithFilter<T> withFilter
1161 (Predicate<? super T> selector) {
1162 return new OFPap<T>(ex, origin, fence, array,
1163 new AndPredicate(this.selector, selector));
1164 }
1165
1166 public ParallelArrayWithFilter<T> withIndexedFilter
1167 (IntAndObjectPredicate<? super T> selector) {
1168 return new ORPap<T>
1169 (ex, origin, fence, array,
1170 compoundIndexedSelector(this.selector, selector));
1171 }
1172
1173 public <U> ParallelArrayWithMapping<T,U> withMapping
1174 (Op<? super T, ? extends U> op) {
1175 return new OFOMPap<T,U>(ex, origin, fence, array, selector, op);
1176 }
1177
1178 public ParallelArrayWithDoubleMapping<T> withMapping
1179 (ObjectToDouble<? super T> op) {
1180 return new OFDMPap<T>(ex, origin, fence, array, selector, op);
1181 }
1182
1183 public ParallelArrayWithLongMapping<T> withMapping
1184 (ObjectToLong<? super T> op) {
1185 return new OFLMPap<T>(ex, origin, fence, array, selector, op);
1186 }
1187
1188 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
1189 (IntAndObjectToObject<? super T, ? extends V> mapper) {
1190 return new OFOCPap<T,V>(ex, origin, fence, array, selector, mapper);
1191 }
1192
1193 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
1194 (IntAndObjectToDouble<? super T> mapper) {
1195 return new OFDCPap<T>(ex, origin, fence, array, selector, mapper);
1196 }
1197
1198 public ParallelArrayWithLongMapping<T> withIndexedMapping
1199 (IntAndObjectToLong<? super T> mapper) {
1200 return new OFLCPap<T>(ex, origin, fence, array, selector, mapper);
1201 }
1202
1203 void leafApply(int lo, int hi, Procedure procedure) {
1204 final Predicate s = selector;
1205 final Object[] a = this.array;
1206 for (int i = lo; i < hi; ++i) {
1207 Object x = a[i];
1208 if (s.op(x))
1209 procedure.op(x);
1210 }
1211 }
1212
1213 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
1214 final Predicate s = selector;
1215 boolean gotFirst = false;
1216 Object r = base;
1217 final Object[] a = this.array;
1218 for (int i = lo; i < hi; ++i) {
1219 Object x = a[i];
1220 if (s.op(x)) {
1221 if (!gotFirst) {
1222 gotFirst = true;
1223 r = x;
1224 }
1225 else
1226 r = reducer.op(r, x);
1227 }
1228 }
1229 return r;
1230 }
1231
1232 final void leafTransform(int l, int h, Op op) {
1233 final Object[] a = this.array;
1234 final Predicate s = selector;
1235 for (int i = l; i < h; ++i) {
1236 Object x = a[i];
1237 if (s.op(x))
1238 a[i] = op.op(x);
1239 }
1240 }
1241
1242 final void leafIndexMap(int l, int h, IntToObject op) {
1243 final Object[] a = this.array;
1244 final Predicate s = selector;
1245 for (int i = l; i < h; ++i) {
1246 Object x = a[i];
1247 if (s.op(x))
1248 a[i] = op.op(i);
1249 }
1250 }
1251
1252 final void leafBinaryIndexMap(int l, int h, IntAndObjectToObject op) {
1253 final Object[] a = this.array;
1254 final Predicate s = selector;
1255 for (int i = l; i < h; ++i) {
1256 Object x = a[i];
1257 if (s.op(x))
1258 a[i] = op.op(i, x);
1259 }
1260 }
1261
1262 final void leafGenerate(int l, int h, Generator generator) {
1263 final Object[] a = this.array;
1264 final Predicate s = selector;
1265 for (int i = l; i < h; ++i) {
1266 if (s.op(a[i]))
1267 a[i] = generator.op();
1268 }
1269 }
1270
1271 final void leafFill(int l, int h, Object value) {
1272 final Object[] a = this.array;
1273 final Predicate s = selector;
1274 for (int i = l; i < h; ++i) {
1275 if (s.op(a[i]))
1276 a[i] = value;
1277 }
1278 }
1279
1280 final void leafCombineInPlace
1281 (int l, int h, Object[] other,
1282 int otherOffset, BinaryOp combiner) {
1283 final Object[] a = this.array;
1284 final Predicate s = selector;
1285 int k = l + otherOffset;
1286 for (int i = l; i < h; ++i) {
1287 Object x = a[i];
1288 if (s.op(x))
1289 a[i] = combiner.op(x, other[k]);
1290 k++;
1291 }
1292 }
1293
1294 final void leafCombineInPlace
1295 (int l, int h,
1296 ParallelArrayWithMapping other,
1297 int otherOffset, BinaryOp combiner) {
1298 final Object[] a = this.array;
1299 final Predicate s = selector;
1300 int k = l + otherOffset;
1301 if (other.hasFilter()) {
1302 for (int i = l; i < h; ++i) {
1303 Object x = a[i];
1304 if (s.op(x) && other.isSelected(k))
1305 a[i] = combiner.op(x, other.oget(k));
1306 k++;
1307 }
1308 }
1309 else if (other.hasMap()) {
1310 for (int i = l; i < h; ++i) {
1311 Object x = a[i];
1312 if (s.op(x))
1313 a[i] = combiner.op(x, other.oget(k));
1314 k++;
1315 }
1316 }
1317 else {
1318 Object[] b = other.array;
1319 for (int i = l; i < h; ++i) {
1320 Object x = a[i];
1321 if (s.op(x))
1322 a[i] = combiner.op(x, b[k]);
1323 k++;
1324 }
1325 }
1326 }
1327 }
1328
1329 static final class DFPap extends ParallelDoubleArrayWithFilter {
1330 final DoublePredicate selector;
1331 DFPap(ForkJoinPool ex, int origin, int fence,
1332 double[] array,
1333 DoublePredicate selector) {
1334 super(ex, origin, fence, array);
1335 this.selector = selector;
1336 }
1337
1338 boolean hasFilter() { return true; }
1339 boolean isSelected(int i) { return selector.op(this.array[i]); }
1340
1341 public ParallelDoubleArrayWithFilter withFilter(DoublePredicate selector) {
1342 return new DFPap(ex, origin, fence, array,
1343 CommonOps.andPredicate(this.selector, selector));
1344 }
1345
1346 public ParallelDoubleArrayWithFilter withIndexedFilter
1347 (IntAndDoublePredicate selector) {
1348 return new DRPap
1349 (ex, origin, fence, array,
1350 compoundIndexedSelector(this.selector, selector));
1351 }
1352
1353 public <U> ParallelDoubleArrayWithMapping<U> withMapping
1354 (DoubleToObject<? extends U> op) {
1355 return new DFOMPap<U>(ex, origin, fence, array, selector, op);
1356 }
1357
1358 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
1359 return new DFDMPap(ex, origin, fence, array, selector, op);
1360 }
1361
1362 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
1363 return new DFLMPap(ex, origin, fence, array, selector, op);
1364 }
1365
1366 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
1367 (IntAndDoubleToObject<? extends V> mapper) {
1368 return new DFOCPap<V>(ex, origin, fence, array, selector, mapper);
1369 }
1370
1371 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
1372 (IntAndDoubleToDouble mapper) {
1373 return new DFDCPap(ex, origin, fence, array, selector, mapper);
1374 }
1375
1376 public ParallelDoubleArrayWithLongMapping withIndexedMapping
1377 (IntAndDoubleToLong mapper) {
1378 return new DFLCPap(ex, origin, fence, array, selector, mapper);
1379 }
1380
1381 final void leafApply(int lo, int hi, DoubleProcedure procedure) {
1382 final DoublePredicate s = selector;
1383 final double[] a = this.array;
1384 for (int i = lo; i < hi; ++i) {
1385 double x = a[i];
1386 if (s.op(x))
1387 procedure.op(x);
1388 }
1389 }
1390
1391 final double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
1392 final DoublePredicate s = selector;
1393 boolean gotFirst = false;
1394 double r = base;
1395 final double[] a = this.array;
1396 for (int i = lo; i < hi; ++i) {
1397 double x = a[i];
1398 if (s.op(x)) {
1399 if (!gotFirst) {
1400 gotFirst = true;
1401 r = x;
1402 }
1403 else
1404 r = reducer.op(r, x);
1405 }
1406 }
1407 return r;
1408 }
1409
1410 final void leafTransform(int l, int h, DoubleOp op) {
1411 final double[] a = this.array;
1412 final DoublePredicate s = selector;
1413 for (int i = l; i < h; ++i) {
1414 double x = a[i];
1415 if (s.op(x))
1416 a[i] = op.op(x);
1417 }
1418 }
1419
1420 final void leafIndexMap(int l, int h, IntToDouble op) {
1421 final double[] a = this.array;
1422 final DoublePredicate s = selector;
1423 for (int i = l; i < h; ++i) {
1424 double x = a[i];
1425 if (s.op(x))
1426 a[i] = op.op(i);
1427 }
1428 }
1429
1430 final void leafBinaryIndexMap(int l, int h, IntAndDoubleToDouble op) {
1431 final double[] a = this.array;
1432 final DoublePredicate s = selector;
1433 for (int i = l; i < h; ++i) {
1434 double x = a[i];
1435 if (s.op(x))
1436 a[i] = op.op(i, x);
1437 }
1438 }
1439
1440 final void leafGenerate(int l, int h, DoubleGenerator generator) {
1441 final double[] a = this.array;
1442 final DoublePredicate s = selector;
1443 for (int i = l; i < h; ++i) {
1444 if (s.op(a[i]))
1445 a[i] = generator.op();
1446 }
1447 }
1448
1449 final void leafFill(int l, int h, double value) {
1450 final double[] a = this.array;
1451 final DoublePredicate s = selector;
1452 for (int i = l; i < h; ++i) {
1453 if (s.op(a[i]))
1454 a[i] = value;
1455 }
1456 }
1457
1458 final void leafCombineInPlace
1459 (int l, int h, double[] other,
1460 int otherOffset, BinaryDoubleOp combiner) {
1461 final double[] a = this.array;
1462 final DoublePredicate s = selector;
1463 int k = l + otherOffset;
1464 for (int i = l; i < h; ++i) {
1465 double x = a[i];
1466 if (s.op(x))
1467 a[i] = combiner.op(x, other[k]);
1468 k++;
1469 }
1470 }
1471
1472 final void leafCombineInPlace
1473 (int l, int h,
1474 ParallelDoubleArrayWithDoubleMapping other,
1475 int otherOffset, BinaryDoubleOp combiner) {
1476 final double[] a = this.array;
1477 final DoublePredicate s = selector;
1478 int k = l + otherOffset;
1479 if (other.hasFilter()) {
1480 for (int i = l; i < h; ++i) {
1481 double x = a[i];
1482 if (s.op(x) && other.isSelected(k))
1483 a[i] = combiner.op(x, other.dget(k));
1484 k++;
1485 }
1486 }
1487 else if (other.hasMap()) {
1488 for (int i = l; i < h; ++i) {
1489 double x = a[i];
1490 if (s.op(x))
1491 a[i] = combiner.op(x, other.dget(k));
1492 k++;
1493 }
1494 }
1495 else {
1496 double[] b = other.array;
1497 for (int i = l; i < h; ++i) {
1498 double x = a[i];
1499 if (s.op(x))
1500 a[i] = combiner.op(x, b[k]);
1501 k++;
1502 }
1503 }
1504 }
1505 }
1506
1507 static final class LFPap extends ParallelLongArrayWithFilter {
1508 final LongPredicate selector;
1509 LFPap(ForkJoinPool ex, int origin, int fence,
1510 long[] array,
1511 LongPredicate selector) {
1512 super(ex, origin, fence, array);
1513 this.selector = selector;
1514 }
1515
1516 boolean hasFilter() { return true; }
1517 boolean isSelected(int i) { return selector.op(this.array[i]); }
1518
1519 public ParallelLongArrayWithFilter withFilter(LongPredicate selector) {
1520 return new LFPap(ex, origin, fence, array,
1521 CommonOps.andPredicate(this.selector, selector));
1522 }
1523
1524 public ParallelLongArrayWithFilter withIndexedFilter
1525 (IntAndLongPredicate selector) {
1526 return new LRPap
1527 (ex, origin, fence, array,
1528 compoundIndexedSelector(this.selector, selector));
1529 }
1530
1531 public <U> ParallelLongArrayWithMapping<U> withMapping
1532 (LongToObject<? extends U> op) {
1533 return new LFOMPap<U>(ex, origin, fence, array, selector, op);
1534 }
1535
1536 public ParallelLongArrayWithLongMapping withMapping
1537 (LongOp op) {
1538 return new LFLMPap(ex, origin, fence, array, selector, op);
1539 }
1540
1541 public ParallelLongArrayWithDoubleMapping withMapping
1542 (LongToDouble op) {
1543 return new LFDMPap(ex, origin, fence, array, selector, op);
1544 }
1545
1546 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
1547 (IntAndLongToObject<? extends V> mapper) {
1548 return new LFOCPap<V>(ex, origin, fence, array, selector, mapper);
1549 }
1550
1551 public ParallelLongArrayWithDoubleMapping withIndexedMapping
1552 (IntAndLongToDouble mapper) {
1553 return new LFDCPap(ex, origin, fence, array, selector, mapper);
1554 }
1555
1556 public ParallelLongArrayWithLongMapping withIndexedMapping
1557 (IntAndLongToLong mapper) {
1558 return new LFLCPap(ex, origin, fence, array, selector, mapper);
1559 }
1560
1561 final void leafApply(int lo, int hi, LongProcedure procedure) {
1562 final LongPredicate s = selector;
1563 final long[] a = this.array;
1564 for (int i = lo; i < hi; ++i) {
1565 long x = a[i];
1566 if (s.op(x))
1567 procedure.op(x);
1568 }
1569 }
1570
1571 final long leafReduce(int lo, int hi, LongReducer reducer, long base) {
1572 final LongPredicate s = selector;
1573 boolean gotFirst = false;
1574 long r = base;
1575 final long[] a = this.array;
1576 for (int i = lo; i < hi; ++i) {
1577 long x = a[i];
1578 if (s.op(x)) {
1579 if (!gotFirst) {
1580 gotFirst = true;
1581 r = x;
1582 }
1583 else
1584 r = reducer.op(r, x);
1585 }
1586 }
1587 return r;
1588 }
1589
1590 final void leafTransform(int l, int h, LongOp op) {
1591 final long[] a = this.array;
1592 final LongPredicate s = selector;
1593 for (int i = l; i < h; ++i) {
1594 long x = a[i];
1595 if (s.op(x))
1596 a[i] = op.op(x);
1597 }
1598 }
1599
1600 final void leafIndexMap(int l, int h, IntToLong op) {
1601 final long[] a = this.array;
1602 final LongPredicate s = selector;
1603 for (int i = l; i < h; ++i) {
1604 long x = a[i];
1605 if (s.op(x))
1606 a[i] = op.op(i);
1607 }
1608 }
1609
1610 final void leafBinaryIndexMap(int l, int h, IntAndLongToLong op) {
1611 final long[] a = this.array;
1612 final LongPredicate s = selector;
1613 for (int i = l; i < h; ++i) {
1614 long x = a[i];
1615 if (s.op(x))
1616 a[i] = op.op(i, x);
1617 }
1618 }
1619
1620 final void leafGenerate(int l, int h, LongGenerator generator) {
1621 final long[] a = this.array;
1622 final LongPredicate s = selector;
1623 for (int i = l; i < h; ++i) {
1624 if (s.op(a[i]))
1625 a[i] = generator.op();
1626 }
1627 }
1628
1629 final void leafFill(int l, int h, long value) {
1630 final long[] a = this.array;
1631 final LongPredicate s = selector;
1632 for (int i = l; i < h; ++i) {
1633 if (s.op(a[i]))
1634 a[i] = value;
1635 }
1636 }
1637
1638 final void leafCombineInPlace
1639 (int l, int h, long[] other,
1640 int otherOffset, BinaryLongOp combiner) {
1641 final long[] a = this.array;
1642 final LongPredicate s = selector;
1643 int k = l + otherOffset;
1644 for (int i = l; i < h; ++i) {
1645 long x = a[i];
1646 if (s.op(x))
1647 a[i] = combiner.op(x, other[k]);
1648 k++;
1649 }
1650 }
1651
1652 final void leafCombineInPlace
1653 (int l, int h,
1654 ParallelLongArrayWithLongMapping other,
1655 int otherOffset, BinaryLongOp combiner) {
1656 final long[] a = this.array;
1657 final LongPredicate s = selector;
1658 int k = l + otherOffset;
1659 if (other.hasFilter()) {
1660 for (int i = l; i < h; ++i) {
1661 long x = a[i];
1662 if (s.op(x) && other.isSelected(k))
1663 a[i] = combiner.op(x, other.lget(k));
1664 k++;
1665 }
1666 }
1667 else if (other.hasMap()) {
1668 for (int i = l; i < h; ++i) {
1669 long x = a[i];
1670 if (s.op(x))
1671 a[i] = combiner.op(x, other.lget(k));
1672 k++;
1673 }
1674 }
1675 else {
1676 long[] b = other.array;
1677 for (int i = l; i < h; ++i) {
1678 long x = a[i];
1679 if (s.op(x))
1680 a[i] = combiner.op(x, b[k]);
1681 k++;
1682 }
1683 }
1684 }
1685 }
1686
1687 // Relationally Filtered (but unmapped) classes
1688 static final class ORPap<T> extends ParallelArrayWithFilter<T> {
1689 final IntAndObjectPredicate<? super T> selector;
1690 ORPap(ForkJoinPool ex, int origin, int fence,
1691 T[] array,
1692 IntAndObjectPredicate<? super T> selector) {
1693 super(ex, origin, fence, array);
1694 this.selector = selector;
1695 }
1696
1697 boolean hasFilter() { return true; }
1698 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
1699
1700 public ParallelArrayWithFilter<T> withFilter
1701 (Predicate<? super T> selector) {
1702 return new ORPap<T>
1703 (ex, origin, fence, array,
1704 compoundIndexedSelector(this.selector, selector));
1705 }
1706
1707 public ParallelArrayWithFilter<T> withIndexedFilter
1708 (IntAndObjectPredicate<? super T> selector) {
1709 return new ORPap<T>
1710 (ex, origin, fence, array,
1711 compoundIndexedSelector(this.selector, selector));
1712 }
1713
1714 public <U> ParallelArrayWithMapping<T,U> withMapping
1715 (Op<? super T, ? extends U> op) {
1716 return new OROMPap<T,U>(ex, origin, fence, array, selector, op);
1717 }
1718
1719 public ParallelArrayWithDoubleMapping<T> withMapping
1720 (ObjectToDouble<? super T> op) {
1721 return new ORDMPap<T>(ex, origin, fence, array, selector, op);
1722 }
1723
1724 public ParallelArrayWithLongMapping<T> withMapping
1725 (ObjectToLong<? super T> op) {
1726 return new ORLMPap<T>(ex, origin, fence, array, selector, op);
1727 }
1728
1729 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
1730 (IntAndObjectToObject<? super T, ? extends V> mapper) {
1731 return new OROCPap<T,V>(ex, origin, fence, array, selector, mapper);
1732 }
1733
1734 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
1735 (IntAndObjectToDouble<? super T> mapper) {
1736 return new ORDCPap<T>(ex, origin, fence, array, selector, mapper);
1737 }
1738
1739 public ParallelArrayWithLongMapping<T> withIndexedMapping
1740 (IntAndObjectToLong<? super T> mapper) {
1741 return new ORLCPap<T>(ex, origin, fence, array, selector, mapper);
1742 }
1743
1744 void leafApply(int lo, int hi, Procedure procedure) {
1745 final IntAndObjectPredicate s = selector;
1746 final Object[] a = this.array;
1747 for (int i = lo; i < hi; ++i) {
1748 Object x = a[i];
1749 if (s.op(i, x))
1750 procedure.op(x);
1751 }
1752 }
1753
1754 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
1755 final IntAndObjectPredicate s = selector;
1756 boolean gotFirst = false;
1757 Object r = base;
1758 final Object[] a = this.array;
1759 for (int i = lo; i < hi; ++i) {
1760 Object x = a[i];
1761 if (s.op(i, x)) {
1762 if (!gotFirst) {
1763 gotFirst = true;
1764 r = x;
1765 }
1766 else
1767 r = reducer.op(r, x);
1768 }
1769 }
1770 return r;
1771 }
1772
1773 final void leafTransform(int l, int h, Op op) {
1774 final Object[] a = this.array;
1775 final IntAndObjectPredicate s = selector;
1776 for (int i = l; i < h; ++i) {
1777 Object x = a[i];
1778 if (s.op(i, x))
1779 a[i] = op.op(x);
1780 }
1781 }
1782
1783 final void leafIndexMap(int l, int h, IntToObject op) {
1784 final Object[] a = this.array;
1785 final IntAndObjectPredicate s = selector;
1786 for (int i = l; i < h; ++i) {
1787 Object x = a[i];
1788 if (s.op(i, x))
1789 a[i] = op.op(i);
1790 }
1791 }
1792
1793 final void leafBinaryIndexMap(int l, int h, IntAndObjectToObject op) {
1794 final Object[] a = this.array;
1795 final IntAndObjectPredicate s = selector;
1796 for (int i = l; i < h; ++i) {
1797 Object x = a[i];
1798 if (s.op(i, x))
1799 a[i] = op.op(i, x);
1800 }
1801 }
1802
1803 final void leafGenerate(int l, int h, Generator generator) {
1804 final Object[] a = this.array;
1805 final IntAndObjectPredicate s = selector;
1806 for (int i = l; i < h; ++i) {
1807 if (s.op(i, a[i]))
1808 a[i] = generator.op();
1809 }
1810 }
1811
1812 final void leafFill(int l, int h, Object value) {
1813 final Object[] a = this.array;
1814 final IntAndObjectPredicate s = selector;
1815 for (int i = l; i < h; ++i) {
1816 if (s.op(i, a[i]))
1817 a[i] = value;
1818 }
1819 }
1820
1821 final void leafCombineInPlace
1822 (int l, int h, Object[] other,
1823 int otherOffset, BinaryOp combiner) {
1824 final Object[] a = this.array;
1825 final IntAndObjectPredicate s = selector;
1826 int k = l + otherOffset;
1827 for (int i = l; i < h; ++i) {
1828 Object x = a[i];
1829 if (s.op(i, x))
1830 a[i] = combiner.op(x, other[k]);
1831 k++;
1832 }
1833 }
1834
1835 final void leafCombineInPlace
1836 (int l, int h,
1837 ParallelArrayWithMapping other,
1838 int otherOffset, BinaryOp combiner) {
1839 final Object[] a = this.array;
1840 final IntAndObjectPredicate s = selector;
1841 int k = l + otherOffset;
1842 if (other.hasFilter()) {
1843 for (int i = l; i < h; ++i) {
1844 Object x = a[i];
1845 if (s.op(i, x) && other.isSelected(k))
1846 a[i] = combiner.op(x, other.oget(k));
1847 k++;
1848 }
1849 }
1850 else if (other.hasMap()) {
1851 for (int i = l; i < h; ++i) {
1852 Object x = a[i];
1853 if (s.op(i, x))
1854 a[i] = combiner.op(x, other.oget(k));
1855 k++;
1856 }
1857 }
1858 else {
1859 Object[] b = other.array;
1860 for (int i = l; i < h; ++i) {
1861 Object x = a[i];
1862 if (s.op(i, x))
1863 a[i] = combiner.op(x, b[k]);
1864 k++;
1865 }
1866 }
1867 }
1868 }
1869
1870 static final class DRPap extends ParallelDoubleArrayWithFilter {
1871 final IntAndDoublePredicate selector;
1872 DRPap(ForkJoinPool ex, int origin, int fence,
1873 double[] array,
1874 IntAndDoublePredicate selector) {
1875 super(ex, origin, fence, array);
1876 this.selector = selector;
1877 }
1878
1879 boolean hasFilter() { return true; }
1880 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
1881
1882 public ParallelDoubleArrayWithFilter withFilter
1883 (DoublePredicate selector) {
1884 return new DRPap
1885 (ex, origin, fence, array,
1886 compoundIndexedSelector(this.selector, selector));
1887 }
1888
1889 public ParallelDoubleArrayWithFilter withIndexedFilter
1890 (IntAndDoublePredicate selector) {
1891 return new DRPap
1892 (ex, origin, fence, array,
1893 compoundIndexedSelector(this.selector, selector));
1894 }
1895
1896 public <U> ParallelDoubleArrayWithMapping<U> withMapping
1897 (DoubleToObject<? extends U> op) {
1898 return new DROMPap<U>(ex, origin, fence, array, selector, op);
1899 }
1900
1901 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
1902 return new DRDMPap(ex, origin, fence, array, selector, op);
1903 }
1904
1905 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
1906 return new DRLMPap(ex, origin, fence, array, selector, op);
1907 }
1908
1909 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
1910 (IntAndDoubleToObject<? extends V> mapper) {
1911 return new DROCPap<V>(ex, origin, fence, array, selector, mapper);
1912 }
1913
1914 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
1915 (IntAndDoubleToDouble mapper) {
1916 return new DRDCPap(ex, origin, fence, array, selector, mapper);
1917 }
1918
1919 public ParallelDoubleArrayWithLongMapping withIndexedMapping
1920 (IntAndDoubleToLong mapper) {
1921 return new DRLCPap(ex, origin, fence, array, selector, mapper);
1922 }
1923
1924 final void leafApply(int lo, int hi, DoubleProcedure procedure) {
1925 final IntAndDoublePredicate s = selector;
1926 final double[] a = this.array;
1927 for (int i = lo; i < hi; ++i) {
1928 double x = a[i];
1929 if (s.op(i, x))
1930 procedure.op(x);
1931 }
1932 }
1933
1934 final double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
1935 final IntAndDoublePredicate s = selector;
1936 boolean gotFirst = false;
1937 double r = base;
1938 final double[] a = this.array;
1939 for (int i = lo; i < hi; ++i) {
1940 double x = a[i];
1941 if (s.op(i, x)) {
1942 if (!gotFirst) {
1943 gotFirst = true;
1944 r = x;
1945 }
1946 else
1947 r = reducer.op(r, x);
1948 }
1949 }
1950 return r;
1951 }
1952
1953 final void leafTransform(int l, int h, DoubleOp op) {
1954 final double[] a = this.array;
1955 final IntAndDoublePredicate s = selector;
1956 for (int i = l; i < h; ++i) {
1957 double x = a[i];
1958 if (s.op(i, x))
1959 a[i] = op.op(x);
1960 }
1961 }
1962
1963 final void leafIndexMap(int l, int h, IntToDouble op) {
1964 final double[] a = this.array;
1965 final IntAndDoublePredicate s = selector;
1966 for (int i = l; i < h; ++i) {
1967 double x = a[i];
1968 if (s.op(i, x))
1969 a[i] = op.op(i);
1970 }
1971 }
1972
1973 final void leafBinaryIndexMap(int l, int h, IntAndDoubleToDouble op) {
1974 final double[] a = this.array;
1975 final IntAndDoublePredicate s = selector;
1976 for (int i = l; i < h; ++i) {
1977 double x = a[i];
1978 if (s.op(i, x))
1979 a[i] = op.op(i, x);
1980 }
1981 }
1982
1983 final void leafGenerate(int l, int h, DoubleGenerator generator) {
1984 final double[] a = this.array;
1985 final IntAndDoublePredicate s = selector;
1986 for (int i = l; i < h; ++i) {
1987 if (s.op(i, a[i]))
1988 a[i] = generator.op();
1989 }
1990 }
1991
1992 final void leafFill(int l, int h, double value) {
1993 final double[] a = this.array;
1994 final IntAndDoublePredicate s = selector;
1995 for (int i = l; i < h; ++i) {
1996 if (s.op(i, a[i]))
1997 a[i] = value;
1998 }
1999 }
2000
2001 final void leafCombineInPlace
2002 (int l, int h, double[] other,
2003 int otherOffset, BinaryDoubleOp combiner) {
2004 final double[] a = this.array;
2005 final IntAndDoublePredicate s = selector;
2006 int k = l + otherOffset;
2007 for (int i = l; i < h; ++i) {
2008 double x = a[i];
2009 if (s.op(i, x))
2010 a[i] = combiner.op(x, other[k]);
2011 k++;
2012 }
2013 }
2014
2015 final void leafCombineInPlace
2016 (int l, int h,
2017 ParallelDoubleArrayWithDoubleMapping other,
2018 int otherOffset, BinaryDoubleOp combiner) {
2019 final double[] a = this.array;
2020 final IntAndDoublePredicate s = selector;
2021 int k = l + otherOffset;
2022 if (other.hasFilter()) {
2023 for (int i = l; i < h; ++i) {
2024 double x = a[i];
2025 if (s.op(i, x) && other.isSelected(k))
2026 a[i] = combiner.op(x, other.dget(k));
2027 k++;
2028 }
2029 }
2030 else if (other.hasMap()) {
2031 for (int i = l; i < h; ++i) {
2032 double x = a[i];
2033 if (s.op(i, x))
2034 a[i] = combiner.op(x, other.dget(k));
2035 k++;
2036 }
2037 }
2038 else {
2039 double[] b = other.array;
2040 for (int i = l; i < h; ++i) {
2041 double x = a[i];
2042 if (s.op(i, x))
2043 a[i] = combiner.op(x, b[k]);
2044 k++;
2045 }
2046 }
2047 }
2048 }
2049
2050 static final class LRPap extends ParallelLongArrayWithFilter {
2051 final IntAndLongPredicate selector;
2052 LRPap(ForkJoinPool ex, int origin, int fence,
2053 long[] array,
2054 IntAndLongPredicate selector) {
2055 super(ex, origin, fence, array);
2056 this.selector = selector;
2057 }
2058
2059 boolean hasFilter() { return true; }
2060 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
2061
2062 public ParallelLongArrayWithFilter withFilter(LongPredicate selector) {
2063 return new LRPap(ex, origin, fence, array,
2064 compoundIndexedSelector(this.selector, selector));
2065 }
2066
2067 public ParallelLongArrayWithFilter withIndexedFilter
2068 (IntAndLongPredicate selector) {
2069 return new LRPap
2070 (ex, origin, fence, array,
2071 compoundIndexedSelector(this.selector, selector));
2072 }
2073
2074 public <U> ParallelLongArrayWithMapping<U> withMapping
2075 (LongToObject<? extends U> op) {
2076 return new LROMPap<U>(ex, origin, fence, array, selector, op);
2077 }
2078
2079 public ParallelLongArrayWithLongMapping withMapping
2080 (LongOp op) {
2081 return new LRLMPap(ex, origin, fence, array, selector, op);
2082 }
2083
2084 public ParallelLongArrayWithDoubleMapping withMapping
2085 (LongToDouble op) {
2086 return new LRDMPap(ex, origin, fence, array, selector, op);
2087 }
2088
2089 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
2090 (IntAndLongToObject<? extends V> mapper) {
2091 return new LROCPap<V>(ex, origin, fence, array, selector, mapper);
2092 }
2093
2094 public ParallelLongArrayWithDoubleMapping withIndexedMapping
2095 (IntAndLongToDouble mapper) {
2096 return new LRDCPap(ex, origin, fence, array, selector, mapper);
2097 }
2098
2099 public ParallelLongArrayWithLongMapping withIndexedMapping
2100 (IntAndLongToLong mapper) {
2101 return new LRLCPap(ex, origin, fence, array, selector, mapper);
2102 }
2103
2104 final void leafApply(int lo, int hi, LongProcedure procedure) {
2105 final IntAndLongPredicate s = selector;
2106 final long[] a = this.array;
2107 for (int i = lo; i < hi; ++i) {
2108 long x = a[i];
2109 if (s.op(i, x))
2110 procedure.op(x);
2111 }
2112 }
2113
2114 final long leafReduce(int lo, int hi, LongReducer reducer, long base) {
2115 final IntAndLongPredicate s = selector;
2116 boolean gotFirst = false;
2117 long r = base;
2118 final long[] a = this.array;
2119 for (int i = lo; i < hi; ++i) {
2120 long x = a[i];
2121 if (s.op(i, x)) {
2122 if (!gotFirst) {
2123 gotFirst = true;
2124 r = x;
2125 }
2126 else
2127 r = reducer.op(r, x);
2128 }
2129 }
2130 return r;
2131 }
2132
2133 final void leafTransform(int l, int h, LongOp op) {
2134 final long[] a = this.array;
2135 final IntAndLongPredicate s = selector;
2136 for (int i = l; i < h; ++i) {
2137 long x = a[i];
2138 if (s.op(i, x))
2139 a[i] = op.op(x);
2140 }
2141 }
2142
2143 final void leafIndexMap(int l, int h, IntToLong op) {
2144 final long[] a = this.array;
2145 final IntAndLongPredicate s = selector;
2146 for (int i = l; i < h; ++i) {
2147 long x = a[i];
2148 if (s.op(i, x))
2149 a[i] = op.op(i);
2150 }
2151 }
2152
2153 final void leafBinaryIndexMap(int l, int h, IntAndLongToLong op) {
2154 final long[] a = this.array;
2155 final IntAndLongPredicate s = selector;
2156 for (int i = l; i < h; ++i) {
2157 long x = a[i];
2158 if (s.op(i, x))
2159 a[i] = op.op(i, x);
2160 }
2161 }
2162
2163 final void leafGenerate(int l, int h, LongGenerator generator) {
2164 final long[] a = this.array;
2165 final IntAndLongPredicate s = selector;
2166 for (int i = l; i < h; ++i) {
2167 if (s.op(i, a[i]))
2168 a[i] = generator.op();
2169 }
2170 }
2171
2172 final void leafFill(int l, int h, long value) {
2173 final long[] a = this.array;
2174 final IntAndLongPredicate s = selector;
2175 for (int i = l; i < h; ++i) {
2176 if (s.op(i, a[i]))
2177 a[i] = value;
2178 }
2179 }
2180
2181 final void leafCombineInPlace
2182 (int l, int h, long[] other,
2183 int otherOffset, BinaryLongOp combiner) {
2184 final long[] a = this.array;
2185 final IntAndLongPredicate s = selector;
2186 int k = l + otherOffset;
2187 for (int i = l; i < h; ++i) {
2188 long x = a[i];
2189 if (s.op(i, x))
2190 a[i] = combiner.op(x, other[k]);
2191 k++;
2192 }
2193 }
2194
2195 final void leafCombineInPlace
2196 (int l, int h,
2197 ParallelLongArrayWithLongMapping other,
2198 int otherOffset, BinaryLongOp combiner) {
2199 final long[] a = this.array;
2200 final IntAndLongPredicate s = selector;
2201 int k = l + otherOffset;
2202 if (other.hasFilter()) {
2203 for (int i = l; i < h; ++i) {
2204 long x = a[i];
2205 if (s.op(i, x) && other.isSelected(k))
2206 a[i] = combiner.op(x, other.lget(k));
2207 k++;
2208 }
2209 }
2210 else if (other.hasMap()) {
2211 for (int i = l; i < h; ++i) {
2212 long x = a[i];
2213 if (s.op(i, x))
2214 a[i] = combiner.op(x, other.lget(k));
2215 k++;
2216 }
2217 }
2218 else {
2219 long[] b = other.array;
2220 for (int i = l; i < h; ++i) {
2221 long x = a[i];
2222 if (s.op(i, x))
2223 a[i] = combiner.op(x, b[k]);
2224 k++;
2225 }
2226 }
2227 }
2228 }
2229
2230 // Object-mapped
2231
2232 abstract static class OOMPap<T,U> extends ParallelArrayWithMapping<T,U> {
2233 final Op<? super T, ? extends U> op;
2234 OOMPap(ForkJoinPool ex, int origin, int fence,
2235 T[] array,
2236 Op<? super T, ? extends U> op) {
2237 super(ex, origin, fence, array);
2238 this.op = op;
2239 }
2240
2241 final boolean hasMap() { return true; }
2242 final Object oget(int i) { return op.op(this.array[i]); }
2243 final double dget(int i) { return ((Number)oget(i)).doubleValue(); }
2244 final long lget(int i) { return ((Number)oget(i)).longValue(); }
2245
2246 final void leafTransfer(int lo, int hi, Object[] dest, int offset) {
2247 final Op f = op;
2248 final Object[] a = this.array;
2249 for (int i = lo; i < hi; ++i)
2250 dest[offset++] = f.op(a[i]);
2251 }
2252
2253 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
2254 Object[] dest, int offset) {
2255 final Object[] a = this.array;
2256 final Op f = op;
2257 for (int i = loIdx; i < hiIdx; ++i)
2258 dest[offset++] = f.op(a[indices[i]]);
2259 }
2260 }
2261
2262 abstract static class DOMPap<U> extends ParallelDoubleArrayWithMapping<U> {
2263 final DoubleToObject<? extends U> op;
2264 DOMPap(ForkJoinPool ex, int origin, int fence,
2265 double[] array, DoubleToObject<? extends U> op) {
2266 super(ex, origin, fence, array);
2267 this.op = op;
2268 }
2269
2270 final boolean hasMap() { return true; }
2271 final Object oget(int i) { return op.op(this.array[i]); }
2272 final double dget(int i) { return ((Number)oget(i)).doubleValue(); }
2273 final long lget(int i) { return ((Number)oget(i)).longValue(); }
2274
2275 final void leafTransfer(int lo, int hi, Object[] dest, int offset) {
2276 final double[] a = this.array;
2277 final DoubleToObject f = op;
2278 for (int i = lo; i < hi; ++i)
2279 dest[offset++] = f.op(a[i]);
2280 }
2281
2282 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
2283 Object[] dest, int offset) {
2284 final double[] a = this.array;
2285 final DoubleToObject f = op;
2286 for (int i = loIdx; i < hiIdx; ++i)
2287 dest[offset++] = f.op(a[indices[i]]);
2288 }
2289 }
2290
2291 abstract static class LOMPap<U> extends ParallelLongArrayWithMapping<U> {
2292 final LongToObject<? extends U> op;
2293 LOMPap(ForkJoinPool ex, int origin, int fence,
2294 long[] array, LongToObject<? extends U> op) {
2295 super(ex, origin, fence, array);
2296 this.op = op;
2297 }
2298
2299 final boolean hasMap() { return true; }
2300 final Object oget(int i) { return op.op(this.array[i]); }
2301 final double dget(int i) { return ((Number)oget(i)).doubleValue(); }
2302 final long lget(int i) { return ((Number)oget(i)).longValue(); }
2303
2304 final void leafTransfer(int lo, int hi, Object[] dest, int offset) {
2305 final long[] a = this.array;
2306 final LongToObject f = op;
2307 for (int i = lo; i < hi; ++i)
2308 dest[offset++] = f.op(a[i]);
2309 }
2310
2311 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
2312 Object[] dest, int offset) {
2313 final long[] a = this.array;
2314 final LongToObject f = op;
2315 for (int i = loIdx; i < hiIdx; ++i)
2316 dest[offset++] = f.op(a[indices[i]]);
2317 }
2318 }
2319
2320 // Object mapped, unfiltered
2321
2322 static final class OUOMPap<T,U> extends OOMPap<T,U> {
2323 OUOMPap(ForkJoinPool ex, int origin, int fence,
2324 T[] array, Op<? super T, ? extends U> op) {
2325 super(ex, origin, fence, array, op);
2326 }
2327
2328 public <V> ParallelArrayWithMapping<T,V> withMapping
2329 (Op<? super U, ? extends V> op) {
2330 return new OUOMPap<T,V>(ex, origin, fence, array,
2331 CommonOps.compoundOp(this.op, op));
2332 }
2333
2334 public ParallelArrayWithDoubleMapping<T> withMapping
2335 (ObjectToDouble<? super U> op) {
2336 return new OUDMPap<T>(ex, origin, fence, array,
2337 CommonOps.compoundOp(this.op, op));
2338 }
2339
2340 public ParallelArrayWithLongMapping<T> withMapping
2341 (ObjectToLong<? super U> op) {
2342 return new OULMPap<T>(ex, origin, fence, array,
2343 CommonOps.compoundOp(this.op, op));
2344 }
2345
2346 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
2347 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2348 return new OUOCPap<T,V>(ex, origin, fence, array,
2349 compoundIndexedOp(this.op, mapper));
2350 }
2351
2352 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
2353 (IntAndObjectToDouble<? super U> mapper) {
2354 return new OUDCPap<T>(ex, origin, fence, array,
2355 compoundIndexedOp(this.op, mapper));
2356 }
2357
2358 public ParallelArrayWithLongMapping<T> withIndexedMapping
2359 (IntAndObjectToLong<? super U> mapper) {
2360 return new OULCPap<T>(ex, origin, fence, array,
2361 compoundIndexedOp(this.op, mapper));
2362 }
2363
2364 void leafApply(int lo, int hi, Procedure procedure) {
2365 final Op f = op;
2366 final Object[] a = this.array;
2367 for (int i = lo; i < hi; ++i)
2368 procedure.op(f.op(a[i]));
2369 }
2370
2371 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2372 if (lo >= hi)
2373 return base;
2374 final Object[] a = this.array;
2375 final Op f = op;
2376 Object r = f.op(a[lo]);
2377 for (int i = lo+1; i < hi; ++i)
2378 r = reducer.op(r, f.op(a[i]));
2379 return r;
2380 }
2381
2382 }
2383
2384 static final class DUOMPap<U> extends DOMPap<U> {
2385 DUOMPap(ForkJoinPool ex, int origin, int fence,
2386 double[] array, DoubleToObject<? extends U> op) {
2387 super(ex, origin, fence, array, op);
2388 }
2389
2390 public <V> ParallelDoubleArrayWithMapping<V> withMapping
2391 (Op<? super U, ? extends V> op) {
2392 return new DUOMPap<V>(ex, origin, fence, array,
2393 CommonOps.compoundOp(this.op, op));
2394 }
2395
2396 public ParallelDoubleArrayWithDoubleMapping withMapping
2397 (ObjectToDouble<? super U> op) {
2398 return new DUDMPap(ex, origin, fence, array,
2399 CommonOps.compoundOp(this.op, op));
2400 }
2401
2402 public ParallelDoubleArrayWithLongMapping withMapping
2403 (ObjectToLong<? super U> op) {
2404 return new DULMPap(ex, origin, fence, array,
2405 CommonOps.compoundOp(this.op, op));
2406 }
2407
2408 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
2409 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2410 return new DUOCPap<V>(ex, origin, fence, array,
2411 compoundIndexedOp(this.op, mapper));
2412 }
2413
2414 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
2415 (IntAndObjectToDouble<? super U> mapper) {
2416 return new DUDCPap(ex, origin, fence, array,
2417 compoundIndexedOp(this.op, mapper));
2418 }
2419
2420 public ParallelDoubleArrayWithLongMapping withIndexedMapping
2421 (IntAndObjectToLong<? super U> mapper) {
2422 return new DULCPap(ex, origin, fence, array,
2423 compoundIndexedOp(this.op, mapper));
2424 }
2425
2426 void leafApply(int lo, int hi, Procedure procedure) {
2427 final double[] a = this.array;
2428 final DoubleToObject f = op;
2429 for (int i = lo; i < hi; ++i)
2430 procedure.op(f.op(a[i]));
2431 }
2432
2433 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2434 if (lo >= hi)
2435 return base;
2436 final double[] a = this.array;
2437 final DoubleToObject f = op;
2438 Object r = f.op(a[lo]);
2439 for (int i = lo+1; i < hi; ++i)
2440 r = reducer.op(r, f.op(a[i]));
2441 return r;
2442 }
2443
2444 }
2445
2446 static final class LUOMPap<U> extends LOMPap<U> {
2447 LUOMPap(ForkJoinPool ex, int origin, int fence,
2448 long[] array, LongToObject<? extends U> op) {
2449 super(ex, origin, fence, array, op);
2450 }
2451
2452 public <V> ParallelLongArrayWithMapping<V> withMapping
2453 (Op<? super U, ? extends V> op) {
2454 return new LUOMPap<V>(ex, origin, fence, array,
2455 CommonOps.compoundOp(this.op, op));
2456 }
2457
2458 public ParallelLongArrayWithLongMapping withMapping
2459 (ObjectToLong<? super U> op) {
2460 return new LULMPap(ex, origin, fence, array,
2461 CommonOps.compoundOp(this.op, op));
2462 }
2463
2464 public ParallelLongArrayWithDoubleMapping withMapping
2465 (ObjectToDouble<? super U> op) {
2466 return new LUDMPap(ex, origin, fence, array,
2467 CommonOps.compoundOp(this.op, op));
2468 }
2469
2470 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
2471 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2472 return new LUOCPap<V>(ex, origin, fence, array,
2473 compoundIndexedOp(this.op, mapper));
2474 }
2475
2476 public ParallelLongArrayWithDoubleMapping withIndexedMapping
2477 (IntAndObjectToDouble<? super U> mapper) {
2478 return new LUDCPap(ex, origin, fence, array,
2479 compoundIndexedOp(this.op, mapper));
2480 }
2481
2482 public ParallelLongArrayWithLongMapping withIndexedMapping
2483 (IntAndObjectToLong<? super U> mapper) {
2484 return new LULCPap(ex, origin, fence, array,
2485 compoundIndexedOp(this.op, mapper));
2486 }
2487
2488 void leafApply(int lo, int hi, Procedure procedure) {
2489 final long[] a = this.array;
2490 final LongToObject f = op;
2491 for (int i = lo; i < hi; ++i)
2492 procedure.op(f.op(a[i]));
2493 }
2494
2495 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2496 if (lo >= hi)
2497 return base;
2498 final long[] a = this.array;
2499 final LongToObject f = op;
2500 Object r = f.op(a[lo]);
2501 for (int i = lo+1; i < hi; ++i)
2502 r = reducer.op(r, f.op(a[i]));
2503 return r;
2504 }
2505
2506 }
2507
2508 // Object-mapped, filtered
2509 static final class OFOMPap<T,U> extends OOMPap<T,U> {
2510 final Predicate<? super T> selector;
2511
2512 OFOMPap(ForkJoinPool ex, int origin, int fence,
2513 T[] array, Predicate<? super T> selector,
2514 Op<? super T, ? extends U> op) {
2515 super(ex, origin, fence, array, op);
2516 this.selector = selector;
2517 }
2518
2519 boolean hasFilter() { return true; }
2520 boolean isSelected(int i) { return selector.op(this.array[i]); }
2521
2522 public <V> ParallelArrayWithMapping<T,V> withMapping
2523 (Op<? super U, ? extends V> op) {
2524 return new OFOMPap<T,V>
2525 (ex, origin, fence, array, selector,
2526 CommonOps.compoundOp(this.op, op));
2527 }
2528
2529 public ParallelArrayWithDoubleMapping<T> withMapping
2530 (ObjectToDouble<? super U> op) {
2531 return new OFDMPap<T>(ex, origin, fence, array, selector,
2532 CommonOps.compoundOp(this.op, op));
2533 }
2534
2535 public ParallelArrayWithLongMapping<T> withMapping
2536 (ObjectToLong<? super U> op) {
2537 return new OFLMPap<T>(ex, origin, fence, array, selector,
2538 CommonOps.compoundOp(this.op, op));
2539 }
2540
2541 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
2542 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2543 return new OFOCPap<T,V>(ex, origin, fence, array, selector,
2544 compoundIndexedOp(this.op, mapper));
2545 }
2546
2547 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
2548 (IntAndObjectToDouble<? super U> mapper) {
2549 return new OFDCPap<T>(ex, origin, fence, array, selector,
2550 compoundIndexedOp(this.op, mapper));
2551 }
2552
2553 public ParallelArrayWithLongMapping<T> withIndexedMapping
2554 (IntAndObjectToLong<? super U> mapper) {
2555 return new OFLCPap<T>(ex, origin, fence, array, selector,
2556 compoundIndexedOp(this.op, mapper));
2557 }
2558
2559 void leafApply(int lo, int hi, Procedure procedure) {
2560 final Predicate s = selector;
2561 final Object[] a = this.array;
2562 final Op f = op;
2563 for (int i = lo; i < hi; ++i) {
2564 Object x = a[i];
2565 if (s.op(x))
2566 procedure.op(f.op(x));
2567 }
2568 }
2569 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2570 final Predicate s = selector;
2571 final Object[] a = this.array;
2572 final Op f = op;
2573 boolean gotFirst = false;
2574 Object r = base;
2575 for (int i = lo; i < hi; ++i) {
2576 Object x = a[i];
2577 if (s.op(x)) {
2578 Object y = f.op(x);
2579 if (!gotFirst) {
2580 gotFirst = true;
2581 r = y;
2582 }
2583 else
2584 r = reducer.op(r, y);
2585 }
2586 }
2587 return r;
2588 }
2589
2590 }
2591
2592 static final class DFOMPap<U> extends DOMPap<U> {
2593 final DoublePredicate selector;
2594 DFOMPap(ForkJoinPool ex, int origin, int fence,
2595 double[] array, DoublePredicate selector,
2596 DoubleToObject<? extends U> op) {
2597 super(ex, origin, fence, array, op);
2598 this.selector = selector;
2599 }
2600
2601 boolean hasFilter() { return true; }
2602 boolean isSelected(int i) { return selector.op(this.array[i]); }
2603
2604 public ParallelArray<U> all(Class<? super U> elementType) {
2605 PAS.FJOSelectAllDriver r = new PAS.FJOSelectAllDriver
2606 (this, elementType);
2607 ex.invoke(r);
2608 return new ParallelArray<U>(ex, (U[])(r.results));
2609 }
2610
2611 public <V> ParallelDoubleArrayWithMapping<V> withMapping
2612 (Op<? super U, ? extends V> op) {
2613 return new DFOMPap<V>(ex, origin, fence, array, selector,
2614 CommonOps.compoundOp(this.op, op));
2615 }
2616
2617 public ParallelDoubleArrayWithDoubleMapping withMapping
2618 (ObjectToDouble<? super U> op) {
2619 return new DFDMPap(ex, origin, fence, array, selector,
2620 CommonOps.compoundOp(this.op, op));
2621 }
2622
2623 public ParallelDoubleArrayWithLongMapping withMapping
2624 (ObjectToLong<? super U> op) {
2625 return new DFLMPap(ex, origin, fence, array, selector,
2626 CommonOps.compoundOp(this.op, op));
2627 }
2628
2629 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
2630 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2631 return new DFOCPap<V>(ex, origin, fence, array, selector,
2632 compoundIndexedOp(this.op, mapper));
2633 }
2634
2635 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
2636 (IntAndObjectToDouble<? super U> mapper) {
2637 return new DFDCPap(ex, origin, fence, array, selector,
2638 compoundIndexedOp(this.op, mapper));
2639 }
2640
2641 public ParallelDoubleArrayWithLongMapping withIndexedMapping
2642 (IntAndObjectToLong<? super U> mapper) {
2643 return new DFLCPap(ex, origin, fence, array, selector,
2644 compoundIndexedOp(this.op, mapper));
2645 }
2646
2647 void leafApply(int lo, int hi, Procedure procedure) {
2648 final DoublePredicate s = selector;
2649 final DoubleToObject f = op;
2650 final double[] a = this.array;
2651 for (int i = lo; i < hi; ++i) {
2652 double x = a[i];
2653 if (s.op(x))
2654 procedure.op(f.op(x));
2655 }
2656 }
2657
2658 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2659 boolean gotFirst = false;
2660 Object r = base;
2661 final DoublePredicate s = selector;
2662 final DoubleToObject f = op;
2663 final double[] a = this.array;
2664 for (int i = lo; i < hi; ++i) {
2665 double x = a[i];
2666 if (s.op(x)) {
2667 Object y = f.op(x);
2668 if (!gotFirst) {
2669 gotFirst = true;
2670 r = y;
2671 }
2672 else
2673 r = reducer.op(r, y);
2674 }
2675 }
2676 return r;
2677 }
2678
2679 }
2680
2681 static final class LFOMPap<U> extends LOMPap<U> {
2682 final LongPredicate selector;
2683 LFOMPap(ForkJoinPool ex, int origin, int fence,
2684 long[] array, LongPredicate selector,
2685 LongToObject<? extends U> op) {
2686 super(ex, origin, fence, array, op);
2687 this.selector = selector;
2688 }
2689
2690 boolean hasFilter() { return true; }
2691 boolean isSelected(int i) { return selector.op(this.array[i]); }
2692
2693 public <V> ParallelLongArrayWithMapping<V> withMapping
2694 (Op<? super U, ? extends V> op) {
2695 return new LFOMPap<V>(ex, origin, fence, array, selector,
2696 CommonOps.compoundOp(this.op, op));
2697 }
2698
2699 public ParallelLongArrayWithLongMapping withMapping
2700 (ObjectToLong<? super U> op) {
2701 return new LFLMPap(ex, origin, fence, array, selector,
2702 CommonOps.compoundOp(this.op, op));
2703 }
2704
2705 public ParallelLongArrayWithDoubleMapping withMapping
2706 (ObjectToDouble<? super U> op) {
2707 return new LFDMPap(ex, origin, fence, array, selector,
2708 CommonOps.compoundOp(this.op, op));
2709 }
2710
2711 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
2712 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2713 return new LFOCPap<V>(ex, origin, fence, array, selector,
2714 compoundIndexedOp(this.op, mapper));
2715 }
2716
2717 public ParallelLongArrayWithDoubleMapping withIndexedMapping
2718 (IntAndObjectToDouble<? super U> mapper) {
2719 return new LFDCPap(ex, origin, fence, array, selector,
2720 compoundIndexedOp(this.op, mapper));
2721 }
2722
2723 public ParallelLongArrayWithLongMapping withIndexedMapping
2724 (IntAndObjectToLong<? super U> mapper) {
2725 return new LFLCPap(ex, origin, fence, array, selector,
2726 compoundIndexedOp(this.op, mapper));
2727 }
2728
2729 void leafApply(int lo, int hi, Procedure procedure) {
2730 final LongPredicate s = selector;
2731 final LongToObject f = op;
2732 final long[] a = this.array;
2733 for (int i = lo; i < hi; ++i) {
2734 long x = a[i];
2735 if (s.op(x))
2736 procedure.op(f.op(x));
2737 }
2738 }
2739
2740 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2741 final LongPredicate s = selector;
2742 final LongToObject f = op;
2743 boolean gotFirst = false;
2744 Object r = base;
2745 final long[] a = this.array;
2746 for (int i = lo; i < hi; ++i) {
2747 long x = a[i];
2748 if (s.op(x)) {
2749 Object y = f.op(x);
2750 if (!gotFirst) {
2751 gotFirst = true;
2752 r = y;
2753 }
2754 else
2755 r = reducer.op(r, y);
2756 }
2757 }
2758 return r;
2759 }
2760
2761 }
2762
2763 // Object-mapped, relational
2764 static final class OROMPap<T,U> extends OOMPap<T,U> {
2765 final IntAndObjectPredicate<? super T> selector;
2766
2767 OROMPap(ForkJoinPool ex, int origin, int fence,
2768 T[] array, IntAndObjectPredicate<? super T> selector,
2769 Op<? super T, ? extends U> op) {
2770 super(ex, origin, fence, array, op);
2771 this.selector = selector;
2772 }
2773
2774 boolean hasFilter() { return true; }
2775 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
2776
2777 public <V> ParallelArrayWithMapping<T,V> withMapping
2778 (Op<? super U, ? extends V> op) {
2779 return new OROMPap<T,V>
2780 (ex, origin, fence, array, selector,
2781 CommonOps.compoundOp(this.op, op));
2782 }
2783
2784 public ParallelArrayWithDoubleMapping<T> withMapping(ObjectToDouble<? super U> op) {
2785 return new ORDMPap<T>(ex, origin, fence, array, selector,
2786 CommonOps.compoundOp(this.op, op));
2787 }
2788
2789 public ParallelArrayWithLongMapping<T> withMapping(ObjectToLong<? super U> op) {
2790 return new ORLMPap<T>(ex, origin, fence, array, selector,
2791 CommonOps.compoundOp(this.op, op));
2792 }
2793
2794 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
2795 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2796 return new OROCPap<T,V>(ex, origin, fence, array, selector,
2797 compoundIndexedOp(this.op, mapper));
2798 }
2799
2800 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
2801 (IntAndObjectToDouble<? super U> mapper) {
2802 return new ORDCPap<T>(ex, origin, fence, array, selector,
2803 compoundIndexedOp(this.op, mapper));
2804 }
2805
2806 public ParallelArrayWithLongMapping<T> withIndexedMapping
2807 (IntAndObjectToLong<? super U> mapper) {
2808 return new ORLCPap<T>(ex, origin, fence, array, selector,
2809 compoundIndexedOp(this.op, mapper));
2810 }
2811
2812 void leafApply(int lo, int hi, Procedure procedure) {
2813 final IntAndObjectPredicate s = selector;
2814 final Object[] a = this.array;
2815 final Op f = op;
2816 for (int i = lo; i < hi; ++i) {
2817 Object x = a[i];
2818 if (s.op(i, x))
2819 procedure.op(f.op(x));
2820 }
2821 }
2822 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2823 final IntAndObjectPredicate s = selector;
2824 final Object[] a = this.array;
2825 final Op f = op;
2826 boolean gotFirst = false;
2827 Object r = base;
2828 for (int i = lo; i < hi; ++i) {
2829 Object x = a[i];
2830 if (s.op(i, x)) {
2831 Object y = f.op(x);
2832 if (!gotFirst) {
2833 gotFirst = true;
2834 r = y;
2835 }
2836 else
2837 r = reducer.op(r, y);
2838 }
2839 }
2840 return r;
2841 }
2842
2843 }
2844
2845 static final class DROMPap<U> extends DOMPap<U> {
2846 final IntAndDoublePredicate selector;
2847 DROMPap(ForkJoinPool ex, int origin, int fence,
2848 double[] array, IntAndDoublePredicate selector,
2849 DoubleToObject<? extends U> op) {
2850 super(ex, origin, fence, array, op);
2851 this.selector = selector;
2852 }
2853
2854 boolean hasFilter() { return true; }
2855 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
2856
2857 public ParallelArray<U> all(Class<? super U> elementType) {
2858 PAS.FJOSelectAllDriver r = new PAS.FJOSelectAllDriver
2859 (this, elementType);
2860 ex.invoke(r);
2861 return new ParallelArray<U>(ex, (U[])(r.results));
2862 }
2863
2864 public <V> ParallelDoubleArrayWithMapping<V> withMapping
2865 (Op<? super U, ? extends V> op) {
2866 return new DROMPap<V>(ex, origin, fence, array, selector,
2867 CommonOps.compoundOp(this.op, op));
2868 }
2869
2870 public ParallelDoubleArrayWithDoubleMapping withMapping
2871 (ObjectToDouble<? super U> op) {
2872 return new DRDMPap(ex, origin, fence, array, selector,
2873 CommonOps.compoundOp(this.op, op));
2874 }
2875
2876 public ParallelDoubleArrayWithLongMapping withMapping
2877 (ObjectToLong<? super U> op) {
2878 return new DRLMPap(ex, origin, fence, array, selector,
2879 CommonOps.compoundOp(this.op, op));
2880 }
2881
2882 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
2883 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2884 return new DROCPap<V>(ex, origin, fence, array, selector,
2885 compoundIndexedOp(this.op, mapper));
2886 }
2887
2888 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
2889 (IntAndObjectToDouble<? super U> mapper) {
2890 return new DRDCPap(ex, origin, fence, array, selector,
2891 compoundIndexedOp(this.op, mapper));
2892 }
2893
2894 public ParallelDoubleArrayWithLongMapping withIndexedMapping
2895 (IntAndObjectToLong<? super U> mapper) {
2896 return new DRLCPap(ex, origin, fence, array, selector,
2897 compoundIndexedOp(this.op, mapper));
2898 }
2899
2900 void leafApply(int lo, int hi, Procedure procedure) {
2901 final IntAndDoublePredicate s = selector;
2902 final DoubleToObject f = op;
2903 final double[] a = this.array;
2904 for (int i = lo; i < hi; ++i) {
2905 double x = a[i];
2906 if (s.op(i, x))
2907 procedure.op(f.op(x));
2908 }
2909 }
2910
2911 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2912 boolean gotFirst = false;
2913 Object r = base;
2914 final IntAndDoublePredicate s = selector;
2915 final DoubleToObject f = op;
2916 final double[] a = this.array;
2917 for (int i = lo; i < hi; ++i) {
2918 double x = a[i];
2919 if (s.op(i, x)) {
2920 Object y = f.op(x);
2921 if (!gotFirst) {
2922 gotFirst = true;
2923 r = y;
2924 }
2925 else
2926 r = reducer.op(r, y);
2927 }
2928 }
2929 return r;
2930 }
2931
2932 }
2933
2934 static final class LROMPap<U> extends LOMPap<U> {
2935 final IntAndLongPredicate selector;
2936 LROMPap(ForkJoinPool ex, int origin, int fence,
2937 long[] array, IntAndLongPredicate selector,
2938 LongToObject<? extends U> op) {
2939 super(ex, origin, fence, array, op);
2940 this.selector = selector;
2941 }
2942
2943 boolean hasFilter() { return true; }
2944 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
2945
2946 public <V> ParallelLongArrayWithMapping<V> withMapping
2947 (Op<? super U, ? extends V> op) {
2948 return new LROMPap<V>(ex, origin, fence, array, selector,
2949 CommonOps.compoundOp(this.op, op));
2950 }
2951
2952 public ParallelLongArrayWithLongMapping withMapping
2953 (ObjectToLong<? super U> op) {
2954 return new LRLMPap(ex, origin, fence, array, selector,
2955 CommonOps.compoundOp(this.op, op));
2956 }
2957
2958 public ParallelLongArrayWithDoubleMapping withMapping
2959 (ObjectToDouble<? super U> op) {
2960 return new LRDMPap(ex, origin, fence, array, selector,
2961 CommonOps.compoundOp(this.op, op));
2962 }
2963
2964 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
2965 (IntAndObjectToObject<? super U, ? extends V> mapper) {
2966 return new LROCPap<V>(ex, origin, fence, array, selector,
2967 compoundIndexedOp(this.op, mapper));
2968 }
2969
2970 public ParallelLongArrayWithDoubleMapping withIndexedMapping
2971 (IntAndObjectToDouble<? super U> mapper) {
2972 return new LRDCPap(ex, origin, fence, array, selector,
2973 compoundIndexedOp(this.op, mapper));
2974 }
2975
2976 public ParallelLongArrayWithLongMapping withIndexedMapping
2977 (IntAndObjectToLong<? super U> mapper) {
2978 return new LRLCPap(ex, origin, fence, array, selector,
2979 compoundIndexedOp(this.op, mapper));
2980 }
2981
2982 void leafApply(int lo, int hi, Procedure procedure) {
2983 final IntAndLongPredicate s = selector;
2984 final LongToObject f = op;
2985 final long[] a = this.array;
2986 for (int i = lo; i < hi; ++i) {
2987 long x = a[i];
2988 if (s.op(i, x))
2989 procedure.op(f.op(x));
2990 }
2991 }
2992
2993 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
2994 final IntAndLongPredicate s = selector;
2995 final LongToObject f = op;
2996 boolean gotFirst = false;
2997 Object r = base;
2998 final long[] a = this.array;
2999 for (int i = lo; i < hi; ++i) {
3000 long x = a[i];
3001 if (s.op(i, x)) {
3002 Object y = f.op(x);
3003 if (!gotFirst) {
3004 gotFirst = true;
3005 r = y;
3006 }
3007 else
3008 r = reducer.op(r, y);
3009 }
3010 }
3011 return r;
3012 }
3013 }
3014
3015 // Object-combined
3016
3017 abstract static class OOCPap<T,U> extends ParallelArrayWithMapping<T,U> {
3018 final IntAndObjectToObject<? super T, ? extends U> op;
3019 OOCPap(ForkJoinPool ex, int origin, int fence,
3020 T[] array,
3021 IntAndObjectToObject<? super T, ? extends U> op) {
3022 super(ex, origin, fence, array);
3023 this.op = op;
3024 }
3025
3026 final boolean hasMap() { return true; }
3027 final Object oget(int i) { return op.op(i, this.array[i]); }
3028 final double dget(int i) { return ((Number)oget(i)).doubleValue(); }
3029 final long lget(int i) { return ((Number)oget(i)).longValue(); }
3030
3031 final void leafTransfer(int lo, int hi, Object[] dest, int offset) {
3032 final IntAndObjectToObject f = op;
3033 final Object[] a = this.array;
3034 for (int i = lo; i < hi; ++i)
3035 dest[offset++] = f.op(i, a[i]);
3036 }
3037
3038 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
3039 Object[] dest, int offset) {
3040 final Object[] a = this.array;
3041 final IntAndObjectToObject f = op;
3042 for (int i = loIdx; i < hiIdx; ++i) {
3043 int idx = indices[i];
3044 dest[offset++] = f.op(idx, a[idx]);
3045 }
3046 }
3047 }
3048
3049 abstract static class DOCPap<U> extends ParallelDoubleArrayWithMapping<U> {
3050 final IntAndDoubleToObject<? extends U> op;
3051 DOCPap(ForkJoinPool ex, int origin, int fence,
3052 double[] array, IntAndDoubleToObject<? extends U> op) {
3053 super(ex, origin, fence, array);
3054 this.op = op;
3055 }
3056
3057 final boolean hasMap() { return true; }
3058 final Object oget(int i) { return op.op(i, this.array[i]); }
3059 final double dget(int i) { return ((Number)oget(i)).doubleValue(); }
3060 final long lget(int i) { return ((Number)oget(i)).longValue(); }
3061
3062 final void leafTransfer(int lo, int hi, Object[] dest, int offset) {
3063 final IntAndDoubleToObject f = op;
3064 final double[] a = this.array;
3065 for (int i = lo; i < hi; ++i)
3066 dest[offset++] = f.op(i, a[i]);
3067 }
3068
3069 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
3070 Object[] dest, int offset) {
3071 final double[] a = this.array;
3072 final IntAndDoubleToObject f = op;
3073 for (int i = loIdx; i < hiIdx; ++i) {
3074 int idx = indices[i];
3075 dest[offset++] = f.op(idx, a[idx]);
3076 }
3077 }
3078 }
3079
3080 abstract static class LOCPap<U> extends ParallelLongArrayWithMapping<U> {
3081 final IntAndLongToObject<? extends U> op;
3082 LOCPap(ForkJoinPool ex, int origin, int fence,
3083 long[] array, IntAndLongToObject<? extends U> op) {
3084 super(ex, origin, fence, array);
3085 this.op = op;
3086 }
3087
3088 final boolean hasMap() { return true; }
3089 final Object oget(int i) { return op.op(i, this.array[i]); }
3090 final double dget(int i) { return ((Number)oget(i)).doubleValue(); }
3091 final long lget(int i) { return ((Number)oget(i)).longValue(); }
3092
3093 final void leafTransfer(int lo, int hi, Object[] dest, int offset) {
3094 final IntAndLongToObject f = op;
3095 final long[] a = this.array;
3096 for (int i = lo; i < hi; ++i)
3097 dest[offset++] = f.op(i, a[i]);
3098 }
3099
3100 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
3101 Object[] dest, int offset) {
3102 final long[] a = this.array;
3103 final IntAndLongToObject f = op;
3104 for (int i = loIdx; i < hiIdx; ++i) {
3105 int idx = indices[i];
3106 dest[offset++] = f.op(idx, a[idx]);
3107 }
3108 }
3109 }
3110
3111 // Object-combined, unfiltered
3112
3113 static final class OUOCPap<T,U> extends OOCPap<T,U> {
3114 OUOCPap(ForkJoinPool ex, int origin, int fence,
3115 T[] array, IntAndObjectToObject<? super T, ? extends U> op) {
3116 super(ex, origin, fence, array, op);
3117 }
3118
3119 public <V> ParallelArrayWithMapping<T,V> withMapping
3120 (Op<? super U, ? extends V> op) {
3121 return new OUOCPap<T,V>(ex, origin, fence, array,
3122 compoundIndexedOp(this.op, op));
3123 }
3124
3125 public ParallelArrayWithDoubleMapping<T> withMapping
3126 (ObjectToDouble<? super U> op) {
3127 return new OUDCPap<T>(ex, origin, fence, array,
3128 compoundIndexedOp(this.op, op));
3129 }
3130
3131 public ParallelArrayWithLongMapping<T> withMapping
3132 (ObjectToLong<? super U> op) {
3133 return new OULCPap<T>(ex, origin, fence, array,
3134 compoundIndexedOp(this.op, op));
3135 }
3136
3137 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
3138 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3139 return new OUOCPap<T,V>(ex, origin, fence, array,
3140 compoundIndexedOp(this.op, mapper));
3141 }
3142
3143 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
3144 (IntAndObjectToDouble<? super U> mapper) {
3145 return new OUDCPap<T>(ex, origin, fence, array,
3146 compoundIndexedOp(this.op, mapper));
3147 }
3148
3149 public ParallelArrayWithLongMapping<T> withIndexedMapping
3150 (IntAndObjectToLong<? super U> mapper) {
3151 return new OULCPap<T>(ex, origin, fence, array,
3152 compoundIndexedOp(this.op, mapper));
3153 }
3154
3155 void leafApply(int lo, int hi, Procedure procedure) {
3156 final IntAndObjectToObject f = op;
3157 final Object[] a = this.array;
3158 for (int i = lo; i < hi; ++i)
3159 procedure.op(f.op(i, a[i]));
3160 }
3161
3162 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3163 if (lo >= hi)
3164 return base;
3165 final Object[] a = this.array;
3166 final IntAndObjectToObject f = op;
3167 Object r = f.op(lo, a[lo]);
3168 for (int i = lo+1; i < hi; ++i)
3169 r = reducer.op(r, f.op(i, a[i]));
3170 return r;
3171 }
3172
3173 }
3174
3175 static final class DUOCPap<U> extends DOCPap<U> {
3176 DUOCPap(ForkJoinPool ex, int origin, int fence,
3177 double[] array, IntAndDoubleToObject<? extends U> op) {
3178 super(ex, origin, fence, array, op);
3179 }
3180
3181 public <V> ParallelDoubleArrayWithMapping< V> withMapping
3182 (Op<? super U, ? extends V> op) {
3183 return new DUOCPap<V>(ex, origin, fence, array,
3184 compoundIndexedOp(this.op, op));
3185 }
3186
3187 public ParallelDoubleArrayWithDoubleMapping withMapping
3188 (ObjectToDouble<? super U> op) {
3189 return new DUDCPap(ex, origin, fence, array,
3190 compoundIndexedOp(this.op, op));
3191 }
3192
3193 public ParallelDoubleArrayWithLongMapping withMapping
3194 (ObjectToLong<? super U> op) {
3195 return new DULCPap(ex, origin, fence, array,
3196 compoundIndexedOp(this.op, op));
3197 }
3198
3199 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
3200 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3201 return new DUOCPap<V>(ex, origin, fence, array,
3202 compoundIndexedOp(this.op, mapper));
3203 }
3204
3205 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
3206 (IntAndObjectToDouble<? super U> mapper) {
3207 return new DUDCPap(ex, origin, fence, array,
3208 compoundIndexedOp(this.op, mapper));
3209 }
3210
3211 public ParallelDoubleArrayWithLongMapping withIndexedMapping
3212 (IntAndObjectToLong<? super U> mapper) {
3213 return new DULCPap(ex, origin, fence, array,
3214 compoundIndexedOp(this.op, mapper));
3215 }
3216
3217 void leafApply(int lo, int hi, Procedure procedure) {
3218 final IntAndDoubleToObject f = op;
3219 final double[] a = this.array;
3220 for (int i = lo; i < hi; ++i)
3221 procedure.op(f.op(i, a[i]));
3222 }
3223
3224 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3225 if (lo >= hi)
3226 return base;
3227 final double[] a = this.array;
3228 final IntAndDoubleToObject f = op;
3229 Object r = f.op(lo, a[lo]);
3230 for (int i = lo+1; i < hi; ++i)
3231 r = reducer.op(r, f.op(i, a[i]));
3232 return r;
3233 }
3234
3235 }
3236
3237 static final class LUOCPap<U> extends LOCPap<U> {
3238 LUOCPap(ForkJoinPool ex, int origin, int fence,
3239 long[] array, IntAndLongToObject<? extends U> op) {
3240 super(ex, origin, fence, array, op);
3241 }
3242
3243 public <V> ParallelLongArrayWithMapping< V> withMapping
3244 (Op<? super U, ? extends V> op) {
3245 return new LUOCPap<V>(ex, origin, fence, array,
3246 compoundIndexedOp(this.op, op));
3247 }
3248
3249 public ParallelLongArrayWithDoubleMapping withMapping
3250 (ObjectToDouble<? super U> op) {
3251 return new LUDCPap(ex, origin, fence, array,
3252 compoundIndexedOp(this.op, op));
3253 }
3254
3255 public ParallelLongArrayWithLongMapping withMapping
3256 (ObjectToLong<? super U> op) {
3257 return new LULCPap(ex, origin, fence, array,
3258 compoundIndexedOp(this.op, op));
3259 }
3260
3261 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
3262 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3263 return new LUOCPap<V>(ex, origin, fence, array,
3264 compoundIndexedOp(this.op, mapper));
3265 }
3266
3267 public ParallelLongArrayWithDoubleMapping withIndexedMapping
3268 (IntAndObjectToDouble<? super U> mapper) {
3269 return new LUDCPap(ex, origin, fence, array,
3270 compoundIndexedOp(this.op, mapper));
3271 }
3272
3273 public ParallelLongArrayWithLongMapping withIndexedMapping
3274 (IntAndObjectToLong<? super U> mapper) {
3275 return new LULCPap(ex, origin, fence, array,
3276 compoundIndexedOp(this.op, mapper));
3277 }
3278
3279 void leafApply(int lo, int hi, Procedure procedure) {
3280 final IntAndLongToObject f = op;
3281 final long[] a = this.array;
3282 for (int i = lo; i < hi; ++i)
3283 procedure.op(f.op(i, a[i]));
3284 }
3285
3286 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3287 if (lo >= hi)
3288 return base;
3289 final long[] a = this.array;
3290 final IntAndLongToObject f = op;
3291 Object r = f.op(lo, a[lo]);
3292 for (int i = lo+1; i < hi; ++i)
3293 r = reducer.op(r, f.op(i, a[i]));
3294 return r;
3295 }
3296
3297 }
3298
3299 // object-combined filtered
3300
3301 static final class OFOCPap<T,U> extends OOCPap<T,U> {
3302 final Predicate<? super T> selector;
3303 OFOCPap(ForkJoinPool ex, int origin, int fence,
3304 T[] array, Predicate<? super T> selector,
3305 IntAndObjectToObject<? super T, ? extends U> op) {
3306 super(ex, origin, fence, array, op);
3307 this.selector = selector;
3308 }
3309
3310 boolean hasFilter() { return true; }
3311 boolean isSelected(int i) { return selector.op(this.array[i]); }
3312
3313 public <V> ParallelArrayWithMapping<T,V> withMapping
3314 (Op<? super U, ? extends V> op) {
3315 return new OFOCPap<T,V>(ex, origin, fence, array, selector,
3316 compoundIndexedOp(this.op, op));
3317 }
3318
3319 public ParallelArrayWithDoubleMapping<T> withMapping
3320 (ObjectToDouble<? super U> op) {
3321 return new OFDCPap<T>(ex, origin, fence, array, selector,
3322 compoundIndexedOp(this.op, op));
3323 }
3324
3325 public ParallelArrayWithLongMapping<T> withMapping
3326 (ObjectToLong<? super U> op) {
3327 return new OFLCPap<T>(ex, origin, fence, array, selector,
3328 compoundIndexedOp(this.op, op));
3329 }
3330
3331 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
3332 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3333 return new OFOCPap<T,V>(ex, origin, fence, array, selector,
3334 compoundIndexedOp(this.op, mapper));
3335 }
3336
3337 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
3338 (IntAndObjectToDouble<? super U> mapper) {
3339 return new OFDCPap<T>(ex, origin, fence, array, selector,
3340 compoundIndexedOp(this.op, mapper));
3341 }
3342
3343 public ParallelArrayWithLongMapping<T> withIndexedMapping
3344 (IntAndObjectToLong<? super U> mapper) {
3345 return new OFLCPap<T>
3346 (ex, origin, fence, array, selector,
3347 compoundIndexedOp
3348 (this.op, mapper));
3349 }
3350
3351 void leafApply(int lo, int hi, Procedure procedure) {
3352 final Predicate s = selector;
3353 final Object[] a = this.array;
3354 final IntAndObjectToObject f = op;
3355 for (int i = lo; i < hi; ++i) {
3356 Object x = a[i];
3357 if (s.op(x))
3358 procedure.op(f.op(i, x));
3359 }
3360 }
3361 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3362 final Predicate s = selector;
3363 final Object[] a = this.array;
3364 final IntAndObjectToObject f = op;
3365 boolean gotFirst = false;
3366 Object r = base;
3367 for (int i = lo; i < hi; ++i) {
3368 Object x = a[i];
3369 if (s.op(x)) {
3370 Object y = f.op(i, x);
3371 if (!gotFirst) {
3372 gotFirst = true;
3373 r = y;
3374 }
3375 else
3376 r = reducer.op(r, y);
3377 }
3378 }
3379 return r;
3380 }
3381 }
3382
3383 static final class DFOCPap<U> extends DOCPap<U> {
3384 final DoublePredicate selector;
3385 DFOCPap(ForkJoinPool ex, int origin, int fence,
3386 double[] array, DoublePredicate selector,
3387 IntAndDoubleToObject<? extends U> op) {
3388 super(ex, origin, fence, array, op);
3389 this.selector = selector;
3390 }
3391
3392 boolean hasFilter() { return true; }
3393 boolean isSelected(int i) { return selector.op(this.array[i]); }
3394
3395 public <V> ParallelDoubleArrayWithMapping< V> withMapping
3396 (Op<? super U, ? extends V> op) {
3397 return new DFOCPap<V>(ex, origin, fence, array, selector,
3398 compoundIndexedOp(this.op, op));
3399 }
3400
3401 public ParallelDoubleArrayWithDoubleMapping withMapping
3402 (ObjectToDouble<? super U> op) {
3403 return new DFDCPap(ex, origin, fence, array, selector,
3404 compoundIndexedOp(this.op, op));
3405 }
3406
3407 public ParallelDoubleArrayWithLongMapping withMapping
3408 (ObjectToLong<? super U> op) {
3409 return new DFLCPap(ex, origin, fence, array, selector,
3410 compoundIndexedOp(this.op, op));
3411 }
3412
3413 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
3414 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3415 return new DFOCPap<V>(ex, origin, fence, array, selector,
3416 compoundIndexedOp(this.op, mapper));
3417 }
3418
3419 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
3420 (IntAndObjectToDouble<? super U> mapper) {
3421 return new DFDCPap(ex, origin, fence, array, selector,
3422 compoundIndexedOp(this.op, mapper));
3423 }
3424
3425 public ParallelDoubleArrayWithLongMapping withIndexedMapping
3426 (IntAndObjectToLong<? super U> mapper) {
3427 return new DFLCPap(ex, origin, fence, array, selector,
3428 compoundIndexedOp(this.op, mapper));
3429 }
3430
3431 void leafApply(int lo, int hi, Procedure procedure) {
3432 final DoublePredicate s = selector;
3433 final double[] a = this.array;
3434 final IntAndDoubleToObject f = op;
3435 for (int i = lo; i < hi; ++i) {
3436 double x = a[i];
3437 if (s.op(x))
3438 procedure.op(f.op(i, x));
3439 }
3440 }
3441 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3442 final DoublePredicate s = selector;
3443 final double[] a = this.array;
3444 final IntAndDoubleToObject f = op;
3445 boolean gotFirst = false;
3446 Object r = base;
3447 for (int i = lo; i < hi; ++i) {
3448 double x = a[i];
3449 if (s.op(x)) {
3450 Object y = f.op(i, x);
3451 if (!gotFirst) {
3452 gotFirst = true;
3453 r = y;
3454 }
3455 else
3456 r = reducer.op(r, y);
3457 }
3458 }
3459 return r;
3460 }
3461 }
3462
3463 static final class LFOCPap<U> extends LOCPap<U> {
3464 final LongPredicate selector;
3465 LFOCPap(ForkJoinPool ex, int origin, int fence,
3466 long[] array, LongPredicate selector,
3467 IntAndLongToObject<? extends U> op) {
3468 super(ex, origin, fence, array, op);
3469 this.selector = selector;
3470 }
3471
3472 boolean hasFilter() { return true; }
3473 boolean isSelected(int i) { return selector.op(this.array[i]); }
3474
3475 public <V> ParallelLongArrayWithMapping< V> withMapping
3476 (Op<? super U, ? extends V> op) {
3477 return new LFOCPap<V>(ex, origin, fence, array, selector,
3478 compoundIndexedOp(this.op, op));
3479 }
3480
3481 public ParallelLongArrayWithDoubleMapping withMapping
3482 (ObjectToDouble<? super U> op) {
3483 return new LFDCPap(ex, origin, fence, array, selector,
3484 compoundIndexedOp(this.op, op));
3485 }
3486
3487 public ParallelLongArrayWithLongMapping withMapping
3488 (ObjectToLong<? super U> op) {
3489 return new LFLCPap(ex, origin, fence, array, selector,
3490 compoundIndexedOp(this.op, op));
3491 }
3492
3493 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
3494 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3495 return new LFOCPap<V>(ex, origin, fence, array, selector,
3496 compoundIndexedOp(this.op, mapper));
3497 }
3498
3499 public ParallelLongArrayWithDoubleMapping withIndexedMapping
3500 (IntAndObjectToDouble<? super U> mapper) {
3501 return new LFDCPap(ex, origin, fence, array, selector,
3502 compoundIndexedOp(this.op, mapper));
3503 }
3504
3505 public ParallelLongArrayWithLongMapping withIndexedMapping
3506 (IntAndObjectToLong<? super U> mapper) {
3507 return new LFLCPap(ex, origin, fence, array, selector,
3508 compoundIndexedOp(this.op, mapper));
3509 }
3510
3511 void leafApply(int lo, int hi, Procedure procedure) {
3512 final LongPredicate s = selector;
3513 final long[] a = this.array;
3514 final IntAndLongToObject f = op;
3515 for (int i = lo; i < hi; ++i) {
3516 long x = a[i];
3517 if (s.op(x))
3518 procedure.op(f.op(i, x));
3519 }
3520 }
3521 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3522 final LongPredicate s = selector;
3523 final long[] a = this.array;
3524 final IntAndLongToObject f = op;
3525 boolean gotFirst = false;
3526 Object r = base;
3527 for (int i = lo; i < hi; ++i) {
3528 long x = a[i];
3529 if (s.op(x)) {
3530 Object y = f.op(i, x);
3531 if (!gotFirst) {
3532 gotFirst = true;
3533 r = y;
3534 }
3535 else
3536 r = reducer.op(r, y);
3537 }
3538 }
3539 return r;
3540 }
3541 }
3542
3543 // Object-combined, relational
3544 static final class OROCPap<T,U> extends OOCPap<T,U> {
3545 final IntAndObjectPredicate<? super T> selector;
3546 OROCPap(ForkJoinPool ex, int origin, int fence,
3547 T[] array, IntAndObjectPredicate<? super T> selector,
3548 IntAndObjectToObject<? super T, ? extends U> op) {
3549 super(ex, origin, fence, array, op);
3550 this.selector = selector;
3551 }
3552
3553 boolean hasFilter() { return true; }
3554 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
3555
3556 public <V> ParallelArrayWithMapping<T,V> withMapping
3557 (Op<? super U, ? extends V> op) {
3558 return new OROCPap<T,V>(ex, origin, fence, array, selector,
3559 compoundIndexedOp(this.op, op));
3560 }
3561
3562 public ParallelArrayWithDoubleMapping<T> withMapping
3563 (ObjectToDouble<? super U> op) {
3564 return new ORDCPap<T>(ex, origin, fence, array, selector,
3565 compoundIndexedOp(this.op, op));
3566 }
3567
3568 public ParallelArrayWithLongMapping<T> withMapping
3569 (ObjectToLong<? super U> op) {
3570 return new ORLCPap<T>(ex, origin, fence, array, selector,
3571 compoundIndexedOp(this.op, op));
3572 }
3573
3574 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
3575 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3576 return new OROCPap<T,V>(ex, origin, fence, array, selector,
3577 compoundIndexedOp(this.op, mapper));
3578 }
3579
3580 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
3581 (IntAndObjectToDouble<? super U> mapper) {
3582 return new ORDCPap<T>(ex, origin, fence, array, selector,
3583 compoundIndexedOp(this.op, mapper));
3584 }
3585
3586 public ParallelArrayWithLongMapping<T> withIndexedMapping
3587 (IntAndObjectToLong<? super U> mapper) {
3588 return new ORLCPap<T>
3589 (ex, origin, fence, array, selector,
3590 compoundIndexedOp
3591 (this.op, mapper));
3592 }
3593
3594 void leafApply(int lo, int hi, Procedure procedure) {
3595 final IntAndObjectPredicate s = selector;
3596 final Object[] a = this.array;
3597 final IntAndObjectToObject f = op;
3598 for (int i = lo; i < hi; ++i) {
3599 Object x = a[i];
3600 if (s.op(i, x))
3601 procedure.op(f.op(i, x));
3602 }
3603 }
3604 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3605 final IntAndObjectPredicate s = selector;
3606 final Object[] a = this.array;
3607 final IntAndObjectToObject f = op;
3608 boolean gotFirst = false;
3609 Object r = base;
3610 for (int i = lo; i < hi; ++i) {
3611 Object x = a[i];
3612 if (s.op(i, x)) {
3613 Object y = f.op(i, x);
3614 if (!gotFirst) {
3615 gotFirst = true;
3616 r = y;
3617 }
3618 else
3619 r = reducer.op(r, y);
3620 }
3621 }
3622 return r;
3623 }
3624 }
3625
3626 static final class DROCPap<U> extends DOCPap<U> {
3627 final IntAndDoublePredicate selector;
3628 DROCPap(ForkJoinPool ex, int origin, int fence,
3629 double[] array, IntAndDoublePredicate selector,
3630 IntAndDoubleToObject<? extends U> op) {
3631 super(ex, origin, fence, array, op);
3632 this.selector = selector;
3633 }
3634
3635 boolean hasFilter() { return true; }
3636 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
3637
3638 public <V> ParallelDoubleArrayWithMapping< V> withMapping
3639 (Op<? super U, ? extends V> op) {
3640 return new DROCPap<V>(ex, origin, fence, array, selector,
3641 compoundIndexedOp(this.op, op));
3642 }
3643
3644 public ParallelDoubleArrayWithDoubleMapping withMapping
3645 (ObjectToDouble<? super U> op) {
3646 return new DRDCPap(ex, origin, fence, array, selector,
3647 compoundIndexedOp(this.op, op));
3648 }
3649
3650 public ParallelDoubleArrayWithLongMapping withMapping
3651 (ObjectToLong<? super U> op) {
3652 return new DRLCPap(ex, origin, fence, array, selector,
3653 compoundIndexedOp(this.op, op));
3654 }
3655
3656 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
3657 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3658 return new DROCPap<V>(ex, origin, fence, array, selector,
3659 compoundIndexedOp(this.op, mapper));
3660 }
3661
3662 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
3663 (IntAndObjectToDouble<? super U> mapper) {
3664 return new DRDCPap(ex, origin, fence, array, selector,
3665 compoundIndexedOp(this.op, mapper));
3666 }
3667
3668 public ParallelDoubleArrayWithLongMapping withIndexedMapping
3669 (IntAndObjectToLong<? super U> mapper) {
3670 return new DRLCPap(ex, origin, fence, array, selector,
3671 compoundIndexedOp(this.op, mapper));
3672 }
3673
3674 void leafApply(int lo, int hi, Procedure procedure) {
3675 final IntAndDoublePredicate s = selector;
3676 final double[] a = this.array;
3677 final IntAndDoubleToObject f = op;
3678 for (int i = lo; i < hi; ++i) {
3679 double x = a[i];
3680 if (s.op(i, x))
3681 procedure.op(f.op(i, x));
3682 }
3683 }
3684 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3685 final IntAndDoublePredicate s = selector;
3686 final double[] a = this.array;
3687 final IntAndDoubleToObject f = op;
3688 boolean gotFirst = false;
3689 Object r = base;
3690 for (int i = lo; i < hi; ++i) {
3691 double x = a[i];
3692 if (s.op(i, x)) {
3693 Object y = f.op(i, x);
3694 if (!gotFirst) {
3695 gotFirst = true;
3696 r = y;
3697 }
3698 else
3699 r = reducer.op(r, y);
3700 }
3701 }
3702 return r;
3703 }
3704 }
3705
3706 static final class LROCPap<U> extends LOCPap<U> {
3707 final IntAndLongPredicate selector;
3708 LROCPap(ForkJoinPool ex, int origin, int fence,
3709 long[] array, IntAndLongPredicate selector,
3710 IntAndLongToObject<? extends U> op) {
3711 super(ex, origin, fence, array, op);
3712 this.selector = selector;
3713 }
3714
3715 boolean hasFilter() { return true; }
3716 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
3717
3718 public <V> ParallelLongArrayWithMapping< V> withMapping
3719 (Op<? super U, ? extends V> op) {
3720 return new LROCPap<V>(ex, origin, fence, array, selector,
3721 compoundIndexedOp(this.op, op));
3722 }
3723
3724 public ParallelLongArrayWithDoubleMapping withMapping
3725 (ObjectToDouble<? super U> op) {
3726 return new LRDCPap(ex, origin, fence, array, selector,
3727 compoundIndexedOp(this.op, op));
3728 }
3729
3730 public ParallelLongArrayWithLongMapping withMapping
3731 (ObjectToLong<? super U> op) {
3732 return new LRLCPap(ex, origin, fence, array, selector,
3733 compoundIndexedOp(this.op, op));
3734 }
3735
3736 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
3737 (IntAndObjectToObject<? super U, ? extends V> mapper) {
3738 return new LROCPap<V>(ex, origin, fence, array, selector,
3739 compoundIndexedOp(this.op, mapper));
3740 }
3741
3742 public ParallelLongArrayWithDoubleMapping withIndexedMapping
3743 (IntAndObjectToDouble<? super U> mapper) {
3744 return new LRDCPap(ex, origin, fence, array, selector,
3745 compoundIndexedOp(this.op, mapper));
3746 }
3747
3748 public ParallelLongArrayWithLongMapping withIndexedMapping
3749 (IntAndObjectToLong<? super U> mapper) {
3750 return new LRLCPap(ex, origin, fence, array, selector,
3751 compoundIndexedOp(this.op, mapper));
3752 }
3753
3754 void leafApply(int lo, int hi, Procedure procedure) {
3755 final IntAndLongPredicate s = selector;
3756 final long[] a = this.array;
3757 final IntAndLongToObject f = op;
3758 for (int i = lo; i < hi; ++i) {
3759 long x = a[i];
3760 if (s.op(i, x))
3761 procedure.op(f.op(i, x));
3762 }
3763 }
3764 Object leafReduce(int lo, int hi, Reducer reducer, Object base) {
3765 final IntAndLongPredicate s = selector;
3766 final long[] a = this.array;
3767 final IntAndLongToObject f = op;
3768 boolean gotFirst = false;
3769 Object r = base;
3770 for (int i = lo; i < hi; ++i) {
3771 long x = a[i];
3772 if (s.op(i, x)) {
3773 Object y = f.op(i, x);
3774 if (!gotFirst) {
3775 gotFirst = true;
3776 r = y;
3777 }
3778 else
3779 r = reducer.op(r, y);
3780 }
3781 }
3782 return r;
3783 }
3784 }
3785
3786 // Double-mapped
3787
3788 abstract static class ODMPap<T> extends ParallelArrayWithDoubleMapping<T> {
3789 final ObjectToDouble<? super T> op;
3790 ODMPap(ForkJoinPool ex, int origin, int fence,
3791 T[] array, ObjectToDouble<? super T> op) {
3792 super(ex, origin, fence, array);
3793 this.op = op;
3794 }
3795
3796 final boolean hasMap() { return true; }
3797 final double dget(int i) { return op.op(this.array[i]); }
3798 final Object oget(int i) { return Double.valueOf(dget(i)); }
3799 final long lget(int i) { return (long)(dget(i)); }
3800
3801 final void leafTransfer(int lo, int hi, double[] dest, int offset) {
3802 final ObjectToDouble f = op;
3803 final Object[] a = this.array;
3804 for (int i = lo; i < hi; ++i)
3805 dest[offset++] = f.op(a[i]);
3806 }
3807
3808 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
3809 double[] dest, int offset) {
3810 final Object[] a = this.array;
3811 final ObjectToDouble f = op;
3812 for (int i = loIdx; i < hiIdx; ++i)
3813 dest[offset++] = f.op(a[indices[i]]);
3814 }
3815
3816 }
3817
3818 abstract static class DDMPap extends ParallelDoubleArrayWithDoubleMapping {
3819 final DoubleOp op;
3820 DDMPap
3821 (ForkJoinPool ex, int origin, int fence,
3822 double[] array, DoubleOp op) {
3823 super(ex, origin, fence, array);
3824 this.op = op;
3825 }
3826
3827 final boolean hasMap() { return true; }
3828 final double dget(int i) { return op.op(this.array[i]); }
3829 final Object oget(int i) { return Double.valueOf(dget(i)); }
3830 final long lget(int i) { return (long)(dget(i)); }
3831
3832 final void leafTransfer(int lo, int hi, double[] dest, int offset) {
3833 final double[] a = this.array;
3834 final DoubleOp f = op;
3835 for (int i = lo; i < hi; ++i)
3836 dest[offset++] = f.op(a[i]);
3837 }
3838
3839 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
3840 double[] dest, int offset) {
3841 final double[] a = this.array;
3842 final DoubleOp f = op;
3843 for (int i = loIdx; i < hiIdx; ++i)
3844 dest[offset++] = f.op(a[indices[i]]);
3845 }
3846 }
3847
3848 abstract static class LDMPap extends ParallelLongArrayWithDoubleMapping {
3849 final LongToDouble op;
3850 LDMPap(ForkJoinPool ex, int origin, int fence,
3851 long[] array, LongToDouble op) {
3852 super(ex, origin, fence, array);
3853 this.op = op;
3854 }
3855
3856 final boolean hasMap() { return true; }
3857 final double dget(int i) { return op.op(this.array[i]); }
3858 final Object oget(int i) { return Double.valueOf(dget(i)); }
3859 final long lget(int i) { return (long)(dget(i)); }
3860
3861 final void leafTransfer(int lo, int hi, double[] dest, int offset) {
3862 final long[] a = this.array;
3863 final LongToDouble f = op;
3864 for (int i = lo; i < hi; ++i)
3865 dest[offset++] = f.op(a[i]);
3866 }
3867
3868 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
3869 double[] dest, int offset) {
3870 final long[] a = this.array;
3871 final LongToDouble f = op;
3872 for (int i = loIdx; i < hiIdx; ++i)
3873 dest[offset++] = f.op(a[indices[i]]);
3874 }
3875
3876 }
3877
3878 // double-mapped, unfiltered
3879
3880 static final class OUDMPap<T> extends ODMPap<T> {
3881 OUDMPap(ForkJoinPool ex, int origin, int fence,
3882 T[] array, ObjectToDouble<? super T> op) {
3883 super(ex, origin, fence, array, op);
3884 }
3885
3886 public ParallelArrayWithDoubleMapping<T> withMapping(DoubleOp op) {
3887 return new OUDMPap<T>(ex, origin, fence, array,
3888 CommonOps.compoundOp(this.op, op));
3889 }
3890
3891 public ParallelArrayWithLongMapping<T> withMapping(DoubleToLong op) {
3892 return new OULMPap<T>(ex, origin, fence, array,
3893 CommonOps.compoundOp(this.op, op));
3894 }
3895
3896 public <U> ParallelArrayWithMapping<T,U> withMapping
3897 (DoubleToObject<? extends U> op) {
3898 return new OUOMPap<T,U>(ex, origin, fence, array,
3899 CommonOps.compoundOp(this.op, op));
3900 }
3901
3902 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
3903 (IntAndDoubleToObject<? extends V> mapper) {
3904 return new OUOCPap<T,V>(ex, origin, fence, array,
3905 compoundIndexedOp(this.op, mapper));
3906 }
3907
3908 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
3909 (IntAndDoubleToDouble mapper) {
3910 return new OUDCPap<T>(ex, origin, fence, array,
3911 compoundIndexedOp(this.op, mapper));
3912 }
3913
3914 public ParallelArrayWithLongMapping<T> withIndexedMapping
3915 (IntAndDoubleToLong mapper) {
3916 return new OULCPap<T>(ex, origin, fence, array,
3917 compoundIndexedOp(this.op, mapper));
3918 }
3919
3920 void leafApply(int lo, int hi, DoubleProcedure procedure) {
3921 final ObjectToDouble f = op;
3922 final Object[] a = this.array;
3923 for (int i = lo; i < hi; ++i)
3924 procedure.op(f.op(a[i]));
3925 }
3926
3927 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
3928 if (lo >= hi)
3929 return base;
3930 final Object[] a = this.array;
3931 final ObjectToDouble f = op;
3932 double r = f.op(a[lo]);
3933 for (int i = lo+1; i < hi; ++i)
3934 r = reducer.op(r, f.op(a[i]));
3935 return r;
3936 }
3937
3938 }
3939
3940 static final class DUDMPap extends DDMPap {
3941 DUDMPap(ForkJoinPool ex, int origin, int fence,
3942 double[] array, DoubleOp op) {
3943 super(ex, origin, fence, array, op);
3944 }
3945
3946 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
3947 return new DUDMPap(ex, origin, fence, array,
3948 CommonOps.compoundOp(this.op, op));
3949 }
3950
3951 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
3952 return new DULMPap(ex, origin, fence, array,
3953 CommonOps.compoundOp(this.op, op));
3954 }
3955
3956 public <U> ParallelDoubleArrayWithMapping<U> withMapping
3957 (DoubleToObject<? extends U> op) {
3958 return new DUOMPap<U>(ex, origin, fence, array,
3959 CommonOps.compoundOp(this.op, op));
3960 }
3961
3962 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
3963 (IntAndDoubleToObject<? extends V> mapper) {
3964 return new DUOCPap<V>(ex, origin, fence, array,
3965 compoundIndexedOp(this.op, mapper));
3966 }
3967
3968 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
3969 (IntAndDoubleToDouble mapper) {
3970 return new DUDCPap(ex, origin, fence, array,
3971 compoundIndexedOp(this.op, mapper));
3972 }
3973
3974 public ParallelDoubleArrayWithLongMapping withIndexedMapping
3975 (IntAndDoubleToLong mapper) {
3976 return new DULCPap(ex, origin, fence, array,
3977 compoundIndexedOp(this.op, mapper));
3978 }
3979
3980 void leafApply(int lo, int hi, DoubleProcedure procedure) {
3981 final double[] a = this.array;
3982 final DoubleOp f = op;
3983 for (int i = lo; i < hi; ++i)
3984 procedure.op(f.op(a[i]));
3985 }
3986
3987 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
3988 if (lo >= hi)
3989 return base;
3990 final double[] a = this.array;
3991 final DoubleOp f = op;
3992 double r = f.op(a[lo]);
3993 for (int i = lo+1; i < hi; ++i)
3994 r = reducer.op(r, f.op(a[i]));
3995 return r;
3996 }
3997
3998 }
3999
4000 static final class LUDMPap extends LDMPap {
4001 LUDMPap(ForkJoinPool ex, int origin, int fence,
4002 long[] array, LongToDouble op) {
4003 super(ex, origin, fence, array, op);
4004 }
4005
4006 public ParallelLongArrayWithLongMapping withMapping(DoubleToLong op) {
4007 return new LULMPap(ex, origin, fence, array,
4008 CommonOps.compoundOp(this.op, op));
4009 }
4010
4011 public ParallelLongArrayWithDoubleMapping withMapping(DoubleOp op) {
4012 return new LUDMPap(ex, origin, fence, array,
4013 CommonOps.compoundOp(this.op, op));
4014 }
4015
4016 public <U> ParallelLongArrayWithMapping<U> withMapping
4017 (DoubleToObject<? extends U> op) {
4018 return new LUOMPap<U>(ex, origin, fence, array,
4019 CommonOps.compoundOp(this.op, op));
4020 }
4021
4022 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
4023 (IntAndDoubleToObject<? extends V> mapper) {
4024 return new LUOCPap<V>(ex, origin, fence, array,
4025 compoundIndexedOp(this.op, mapper));
4026 }
4027
4028 public ParallelLongArrayWithDoubleMapping withIndexedMapping
4029 (IntAndDoubleToDouble mapper) {
4030 return new LUDCPap(ex, origin, fence, array,
4031 compoundIndexedOp(this.op, mapper));
4032 }
4033
4034 public ParallelLongArrayWithLongMapping withIndexedMapping
4035 (IntAndDoubleToLong mapper) {
4036 return new LULCPap(ex, origin, fence, array,
4037 compoundIndexedOp(this.op, mapper));
4038 }
4039
4040 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4041 final LongToDouble f = op;
4042 final long[] a = this.array;
4043 for (int i = lo; i < hi; ++i)
4044 procedure.op(f.op(a[i]));
4045 }
4046
4047 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4048 if (lo >= hi)
4049 return base;
4050 final long[] a = this.array;
4051 final LongToDouble f = op;
4052 double r = f.op(a[lo]);
4053 for (int i = lo+1; i < hi; ++i)
4054 r = reducer.op(r, f.op(a[i]));
4055 return r;
4056 }
4057
4058 }
4059
4060 // double-mapped, filtered
4061
4062 static final class OFDMPap<T> extends ODMPap<T> {
4063 final Predicate<? super T> selector;
4064 OFDMPap(ForkJoinPool ex, int origin, int fence,
4065 T[] array, Predicate<? super T> selector,
4066 ObjectToDouble<? super T> op) {
4067 super(ex, origin, fence, array, op);
4068 this.selector = selector;
4069 }
4070
4071 boolean hasFilter() { return true; }
4072 boolean isSelected(int i) { return selector.op(this.array[i]); }
4073
4074 public ParallelArrayWithDoubleMapping<T> withMapping(DoubleOp op) {
4075 return new OFDMPap<T>(ex, origin, fence, array, selector,
4076 CommonOps.compoundOp(this.op, op));
4077 }
4078
4079 public ParallelArrayWithLongMapping<T> withMapping(DoubleToLong op) {
4080 return new OFLMPap<T>(ex, origin, fence, array, selector,
4081 CommonOps.compoundOp(this.op, op));
4082 }
4083
4084 public <U> ParallelArrayWithMapping<T,U> withMapping
4085 (DoubleToObject<? extends U> op) {
4086 return new OFOMPap<T,U>(ex, origin, fence, array, selector,
4087 CommonOps.compoundOp(this.op, op));
4088 }
4089
4090 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
4091 (IntAndDoubleToObject<? extends V> mapper) {
4092 return new OFOCPap<T,V>(ex, origin, fence, array, selector,
4093 compoundIndexedOp(this.op, mapper));
4094 }
4095
4096 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
4097 (IntAndDoubleToDouble mapper) {
4098 return new OFDCPap<T>(ex, origin, fence, array, selector,
4099 compoundIndexedOp(this.op, mapper));
4100 }
4101
4102 public ParallelArrayWithLongMapping<T> withIndexedMapping
4103 (IntAndDoubleToLong mapper) {
4104 return new OFLCPap<T>(ex, origin, fence, array, selector,
4105 compoundIndexedOp(this.op, mapper));
4106 }
4107
4108 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4109 final Predicate s = selector;
4110 final Object[] a = this.array;
4111 final ObjectToDouble f = op;
4112 for (int i = lo; i < hi; ++i) {
4113 Object x = a[i];
4114 if (s.op(x))
4115 procedure.op(f.op(x));
4116 }
4117 }
4118
4119 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4120 final Predicate s = selector;
4121 final ObjectToDouble f = op;
4122 boolean gotFirst = false;
4123 double r = base;
4124 final Object[] a = this.array;
4125 for (int i = lo; i < hi; ++i) {
4126 Object t = a[i];
4127 if (s.op(t)) {
4128 double y = f.op(t);
4129 if (!gotFirst) {
4130 gotFirst = true;
4131 r = y;
4132 }
4133 else
4134 r = reducer.op(r, y);
4135 }
4136 }
4137 return r;
4138 }
4139 }
4140
4141 static final class DFDMPap extends DDMPap {
4142 final DoublePredicate selector;
4143 DFDMPap(ForkJoinPool ex, int origin, int fence,
4144 double[] array, DoublePredicate selector, DoubleOp op) {
4145 super(ex, origin, fence, array, op);
4146 this.selector = selector;
4147 }
4148
4149 boolean hasFilter() { return true; }
4150 boolean isSelected(int i) { return selector.op(this.array[i]); }
4151
4152 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
4153 return new DFDMPap(ex, origin, fence, array, selector,
4154 CommonOps.compoundOp(this.op, op));
4155 }
4156
4157 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
4158 return new DFLMPap(ex, origin, fence, array, selector,
4159 CommonOps.compoundOp(this.op, op));
4160 }
4161
4162 public <U> ParallelDoubleArrayWithMapping<U> withMapping
4163 (DoubleToObject<? extends U> op) {
4164 return new DFOMPap<U>(ex, origin, fence, array, selector,
4165 CommonOps.compoundOp(this.op, op));
4166 }
4167
4168 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
4169 (IntAndDoubleToObject<? extends V> mapper) {
4170 return new DFOCPap<V>(ex, origin, fence, array, selector,
4171 compoundIndexedOp(this.op, mapper));
4172 }
4173
4174 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
4175 (IntAndDoubleToDouble mapper) {
4176 return new DFDCPap(ex, origin, fence, array, selector,
4177 compoundIndexedOp(this.op, mapper));
4178 }
4179
4180 public ParallelDoubleArrayWithLongMapping withIndexedMapping
4181 (IntAndDoubleToLong mapper) {
4182 return new DFLCPap(ex, origin, fence, array, selector,
4183 compoundIndexedOp(this.op, mapper));
4184 }
4185
4186 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4187 final DoublePredicate s = selector;
4188 final DoubleOp f = op;
4189 final double[] a = this.array;
4190 for (int i = lo; i < hi; ++i) {
4191 double x = a[i];
4192 if (s.op(x))
4193 procedure.op(f.op(x));
4194 }
4195 }
4196
4197 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4198 final DoublePredicate s = selector;
4199 boolean gotFirst = false;
4200 double r = base;
4201 final double[] a = this.array;
4202 final DoubleOp f = op;
4203 for (int i = lo; i < hi; ++i) {
4204 double t = a[i];
4205 if (s.op(t)) {
4206 double y = f.op(t);
4207 if (!gotFirst) {
4208 gotFirst = true;
4209 r = y;
4210 }
4211 else
4212 r = reducer.op(r, y);
4213 }
4214 }
4215 return r;
4216 }
4217 }
4218
4219 static final class LFDMPap extends LDMPap {
4220 final LongPredicate selector;
4221 LFDMPap(ForkJoinPool ex, int origin, int fence,
4222 long[] array, LongPredicate selector, LongToDouble op) {
4223 super(ex, origin, fence, array, op);
4224 this.selector = selector;
4225 }
4226
4227 boolean hasFilter() { return true; }
4228 boolean isSelected(int i) { return selector.op(this.array[i]); }
4229
4230 public ParallelLongArrayWithLongMapping withMapping(DoubleToLong op) {
4231 return new LFLMPap(ex, origin, fence, array, selector,
4232 CommonOps.compoundOp(this.op, op));
4233 }
4234
4235 public ParallelLongArrayWithDoubleMapping withMapping(DoubleOp op) {
4236 return new LFDMPap(ex, origin, fence, array, selector,
4237 CommonOps.compoundOp(this.op, op));
4238 }
4239
4240 public <U> ParallelLongArrayWithMapping<U> withMapping
4241 (DoubleToObject<? extends U> op) {
4242 return new LFOMPap<U>(ex, origin, fence, array, selector,
4243 CommonOps.compoundOp(this.op, op));
4244 }
4245
4246 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
4247 (IntAndDoubleToObject<? extends V> mapper) {
4248 return new LFOCPap<V>(ex, origin, fence, array, selector,
4249 compoundIndexedOp(this.op, mapper));
4250 }
4251
4252 public ParallelLongArrayWithDoubleMapping withIndexedMapping
4253 (IntAndDoubleToDouble mapper) {
4254 return new LFDCPap(ex, origin, fence, array, selector,
4255 compoundIndexedOp(this.op, mapper));
4256 }
4257
4258 public ParallelLongArrayWithLongMapping withIndexedMapping
4259 (IntAndDoubleToLong mapper) {
4260 return new LFLCPap(ex, origin, fence, array, selector,
4261 compoundIndexedOp(this.op, mapper));
4262 }
4263
4264 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4265 final LongPredicate s = selector;
4266 final long[] a = this.array;
4267 final LongToDouble f = op;
4268 for (int i = lo; i < hi; ++i) {
4269 long x = a[i];
4270 if (s.op(x))
4271 procedure.op(f.op(x));
4272 }
4273 }
4274
4275 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4276 final LongPredicate s = selector;
4277 final LongToDouble f = op;
4278 boolean gotFirst = false;
4279 double r = base;
4280 final long[] a = this.array;
4281 for (int i = lo; i < hi; ++i) {
4282 long t = a[i];
4283 if (s.op(t)) {
4284 double y = f.op(t);
4285 if (!gotFirst) {
4286 gotFirst = true;
4287 r = y;
4288 }
4289 else
4290 r = reducer.op(r, y);
4291 }
4292 }
4293 return r;
4294 }
4295 }
4296
4297 // double-mapped, relational
4298 static final class ORDMPap<T> extends ODMPap<T> {
4299 final IntAndObjectPredicate<? super T> selector;
4300 ORDMPap(ForkJoinPool ex, int origin, int fence,
4301 T[] array, IntAndObjectPredicate<? super T> selector,
4302 ObjectToDouble<? super T> op) {
4303 super(ex, origin, fence, array, op);
4304 this.selector = selector;
4305 }
4306
4307 boolean hasFilter() { return true; }
4308 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
4309
4310 public ParallelArrayWithDoubleMapping<T> withMapping(DoubleOp op) {
4311 return new ORDMPap<T>(ex, origin, fence, array, selector,
4312 CommonOps.compoundOp(this.op, op));
4313 }
4314
4315 public ParallelArrayWithLongMapping<T> withMapping(DoubleToLong op) {
4316 return new ORLMPap<T>(ex, origin, fence, array, selector,
4317 CommonOps.compoundOp(this.op, op));
4318 }
4319
4320 public <U> ParallelArrayWithMapping<T,U> withMapping
4321 (DoubleToObject<? extends U> op) {
4322 return new OROMPap<T,U>(ex, origin, fence, array, selector,
4323 CommonOps.compoundOp(this.op, op));
4324 }
4325
4326 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
4327 (IntAndDoubleToObject<? extends V> mapper) {
4328 return new OROCPap<T,V>(ex, origin, fence, array, selector,
4329 compoundIndexedOp(this.op, mapper));
4330 }
4331
4332 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
4333 (IntAndDoubleToDouble mapper) {
4334 return new ORDCPap<T>(ex, origin, fence, array, selector,
4335 compoundIndexedOp(this.op, mapper));
4336 }
4337
4338 public ParallelArrayWithLongMapping<T> withIndexedMapping
4339 (IntAndDoubleToLong mapper) {
4340 return new ORLCPap<T>(ex, origin, fence, array, selector,
4341 compoundIndexedOp(this.op, mapper));
4342 }
4343
4344 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4345 final IntAndObjectPredicate s = selector;
4346 final Object[] a = this.array;
4347 final ObjectToDouble f = op;
4348 for (int i = lo; i < hi; ++i) {
4349 Object x = a[i];
4350 if (s.op(i, x))
4351 procedure.op(f.op(x));
4352 }
4353 }
4354
4355 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4356 final IntAndObjectPredicate s = selector;
4357 final ObjectToDouble f = op;
4358 boolean gotFirst = false;
4359 double r = base;
4360 final Object[] a = this.array;
4361 for (int i = lo; i < hi; ++i) {
4362 Object t = a[i];
4363 if (s.op(i, t)) {
4364 double y = f.op(t);
4365 if (!gotFirst) {
4366 gotFirst = true;
4367 r = y;
4368 }
4369 else
4370 r = reducer.op(r, y);
4371 }
4372 }
4373 return r;
4374 }
4375 }
4376
4377 static final class DRDMPap extends DDMPap {
4378 final IntAndDoublePredicate selector;
4379 DRDMPap(ForkJoinPool ex, int origin, int fence,
4380 double[] array, IntAndDoublePredicate selector, DoubleOp op) {
4381 super(ex, origin, fence, array, op);
4382 this.selector = selector;
4383 }
4384
4385 boolean hasFilter() { return true; }
4386 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
4387
4388 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
4389 return new DRDMPap(ex, origin, fence, array, selector,
4390 CommonOps.compoundOp(this.op, op));
4391 }
4392
4393 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
4394 return new DRLMPap(ex, origin, fence, array, selector,
4395 CommonOps.compoundOp(this.op, op));
4396 }
4397
4398 public <U> ParallelDoubleArrayWithMapping<U> withMapping
4399 (DoubleToObject<? extends U> op) {
4400 return new DROMPap<U>(ex, origin, fence, array, selector,
4401 CommonOps.compoundOp(this.op, op));
4402 }
4403
4404 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
4405 (IntAndDoubleToObject<? extends V> mapper) {
4406 return new DROCPap<V>(ex, origin, fence, array, selector,
4407 compoundIndexedOp(this.op, mapper));
4408 }
4409
4410 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
4411 (IntAndDoubleToDouble mapper) {
4412 return new DRDCPap(ex, origin, fence, array, selector,
4413 compoundIndexedOp(this.op, mapper));
4414 }
4415
4416 public ParallelDoubleArrayWithLongMapping withIndexedMapping
4417 (IntAndDoubleToLong mapper) {
4418 return new DRLCPap(ex, origin, fence, array, selector,
4419 compoundIndexedOp(this.op, mapper));
4420 }
4421
4422 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4423 final IntAndDoublePredicate s = selector;
4424 final DoubleOp f = op;
4425 final double[] a = this.array;
4426 for (int i = lo; i < hi; ++i) {
4427 double x = a[i];
4428 if (s.op(i, x))
4429 procedure.op(f.op(x));
4430 }
4431 }
4432
4433 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4434 final IntAndDoublePredicate s = selector;
4435 boolean gotFirst = false;
4436 double r = base;
4437 final double[] a = this.array;
4438 final DoubleOp f = op;
4439 for (int i = lo; i < hi; ++i) {
4440 double t = a[i];
4441 if (s.op(i, t)) {
4442 double y = f.op(t);
4443 if (!gotFirst) {
4444 gotFirst = true;
4445 r = y;
4446 }
4447 else
4448 r = reducer.op(r, y);
4449 }
4450 }
4451 return r;
4452 }
4453 }
4454
4455 static final class LRDMPap extends LDMPap {
4456 final IntAndLongPredicate selector;
4457 LRDMPap(ForkJoinPool ex, int origin, int fence,
4458 long[] array, IntAndLongPredicate selector, LongToDouble op) {
4459 super(ex, origin, fence, array, op);
4460 this.selector = selector;
4461 }
4462
4463 boolean hasFilter() { return true; }
4464 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
4465
4466 public ParallelLongArrayWithLongMapping withMapping(DoubleToLong op) {
4467 return new LRLMPap(ex, origin, fence, array, selector,
4468 CommonOps.compoundOp(this.op, op));
4469 }
4470
4471 public ParallelLongArrayWithDoubleMapping withMapping(DoubleOp op) {
4472 return new LRDMPap(ex, origin, fence, array, selector,
4473 CommonOps.compoundOp(this.op, op));
4474 }
4475
4476 public <U> ParallelLongArrayWithMapping<U> withMapping
4477 (DoubleToObject<? extends U> op) {
4478 return new LROMPap<U>(ex, origin, fence, array, selector,
4479 CommonOps.compoundOp(this.op, op));
4480 }
4481
4482 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
4483 (IntAndDoubleToObject<? extends V> mapper) {
4484 return new LROCPap<V>(ex, origin, fence, array, selector,
4485 compoundIndexedOp(this.op, mapper));
4486 }
4487
4488 public ParallelLongArrayWithDoubleMapping withIndexedMapping
4489 (IntAndDoubleToDouble mapper) {
4490 return new LRDCPap(ex, origin, fence, array, selector,
4491 compoundIndexedOp(this.op, mapper));
4492 }
4493
4494 public ParallelLongArrayWithLongMapping withIndexedMapping
4495 (IntAndDoubleToLong mapper) {
4496 return new LRLCPap(ex, origin, fence, array, selector,
4497 compoundIndexedOp(this.op, mapper));
4498 }
4499
4500 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4501 final IntAndLongPredicate s = selector;
4502 final long[] a = this.array;
4503 final LongToDouble f = op;
4504 for (int i = lo; i < hi; ++i) {
4505 long x = a[i];
4506 if (s.op(i, x))
4507 procedure.op(f.op(x));
4508 }
4509 }
4510
4511 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4512 final IntAndLongPredicate s = selector;
4513 final LongToDouble f = op;
4514 boolean gotFirst = false;
4515 double r = base;
4516 final long[] a = this.array;
4517 for (int i = lo; i < hi; ++i) {
4518 long t = a[i];
4519 if (s.op(i, t)) {
4520 double y = f.op(t);
4521 if (!gotFirst) {
4522 gotFirst = true;
4523 r = y;
4524 }
4525 else
4526 r = reducer.op(r, y);
4527 }
4528 }
4529 return r;
4530 }
4531 }
4532
4533 // double-combined
4534 abstract static class ODCPap<T> extends ParallelArrayWithDoubleMapping<T> {
4535 final IntAndObjectToDouble<? super T> op;
4536 ODCPap(ForkJoinPool ex, int origin, int fence,
4537 T[] array, IntAndObjectToDouble<? super T> op) {
4538 super(ex, origin, fence, array);
4539 this.op = op;
4540 }
4541
4542 final boolean hasMap() { return true; }
4543 final double dget(int i) { return op.op(i, this.array[i]); }
4544 final Object oget(int i) { return Double.valueOf(dget(i)); }
4545 final long lget(int i) { return (long)(dget(i)); }
4546
4547 final void leafTransfer(int lo, int hi, double[] dest, int offset) {
4548 final IntAndObjectToDouble f = op;
4549 final Object[] a = this.array;
4550 for (int i = lo; i < hi; ++i)
4551 dest[offset++] = f.op(i, a[i]);
4552 }
4553
4554 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
4555 double[] dest, int offset) {
4556 final Object[] a = this.array;
4557 final IntAndObjectToDouble f = op;
4558 for (int i = loIdx; i < hiIdx; ++i) {
4559 int idx = indices[i];
4560 dest[offset++] = f.op(idx, a[idx]);
4561 }
4562 }
4563
4564 }
4565
4566 abstract static class DDCPap extends ParallelDoubleArrayWithDoubleMapping {
4567 final IntAndDoubleToDouble op;
4568 DDCPap(ForkJoinPool ex, int origin, int fence,
4569 double[] array, IntAndDoubleToDouble op) {
4570 super(ex, origin, fence, array);
4571 this.op = op;
4572 }
4573
4574 final boolean hasMap() { return true; }
4575 final double dget(int i) { return op.op(i, this.array[i]); }
4576 final Object oget(int i) { return Double.valueOf(dget(i)); }
4577 final long lget(int i) { return (long)(dget(i)); }
4578
4579 final void leafTransfer(int lo, int hi, double[] dest, int offset) {
4580 final IntAndDoubleToDouble f = op;
4581 final double[] a = this.array;
4582 for (int i = lo; i < hi; ++i)
4583 dest[offset++] = f.op(i, a[i]);
4584 }
4585
4586 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
4587 double[] dest, int offset) {
4588 final double[] a = this.array;
4589 final IntAndDoubleToDouble f = op;
4590 for (int i = loIdx; i < hiIdx; ++i) {
4591 int idx = indices[i];
4592 dest[offset++] = f.op(idx, a[idx]);
4593 }
4594 }
4595 }
4596
4597 abstract static class LDCPap extends ParallelLongArrayWithDoubleMapping {
4598 final IntAndLongToDouble op;
4599 LDCPap(ForkJoinPool ex, int origin, int fence,
4600 long[] array, IntAndLongToDouble op) {
4601 super(ex, origin, fence, array);
4602 this.op = op;
4603 }
4604
4605 final boolean hasMap() { return true; }
4606 final double dget(int i) { return op.op(i, this.array[i]); }
4607 final Object oget(int i) { return Double.valueOf(dget(i)); }
4608 final long lget(int i) { return (long)(dget(i)); }
4609
4610 final void leafTransfer(int lo, int hi, double[] dest, int offset) {
4611 final IntAndLongToDouble f = op;
4612 final long[] a = this.array;
4613 for (int i = lo; i < hi; ++i)
4614 dest[offset++] = f.op(i, a[i]);
4615 }
4616
4617 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
4618 double[] dest, int offset) {
4619 final long[] a = this.array;
4620 final IntAndLongToDouble f = op;
4621 for (int i = loIdx; i < hiIdx; ++i) {
4622 int idx = indices[i];
4623 dest[offset++] = f.op(idx, a[idx]);
4624 }
4625 }
4626 }
4627
4628 // double-combined, unfiltered
4629 static final class OUDCPap<T> extends ODCPap<T> {
4630 OUDCPap(ForkJoinPool ex, int origin, int fence,
4631 T[] array, IntAndObjectToDouble<? super T> op) {
4632 super(ex, origin, fence, array, op);
4633 }
4634
4635 public ParallelArrayWithDoubleMapping<T> withMapping(DoubleOp op) {
4636 return new OUDCPap<T>(ex, origin, fence, array,
4637 compoundIndexedOp(this.op, op));
4638 }
4639
4640 public ParallelArrayWithLongMapping<T> withMapping(DoubleToLong op) {
4641 return new OULCPap<T>(ex, origin, fence, array,
4642 compoundIndexedOp(this.op, op));
4643 }
4644
4645 public <U> ParallelArrayWithMapping<T,U> withMapping
4646 (DoubleToObject<? extends U> op) {
4647 return new OUOCPap<T,U>(ex, origin, fence, array,
4648 compoundIndexedOp(this.op, op));
4649 }
4650
4651 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
4652 (IntAndDoubleToObject<? extends V> mapper) {
4653 return new OUOCPap<T,V>(ex, origin, fence, array,
4654 compoundIndexedOp(this.op, mapper));
4655 }
4656
4657 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
4658 (IntAndDoubleToDouble mapper) {
4659 return new OUDCPap<T>(ex, origin, fence, array,
4660 compoundIndexedOp(this.op, mapper));
4661 }
4662
4663 public ParallelArrayWithLongMapping<T> withIndexedMapping
4664 (IntAndDoubleToLong mapper) {
4665 return new OULCPap<T>(ex, origin, fence, array,
4666 compoundIndexedOp(this.op, mapper));
4667 }
4668
4669 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4670 final IntAndObjectToDouble f = op;
4671 final Object[] a = this.array;
4672 for (int i = lo; i < hi; ++i)
4673 procedure.op(f.op(i, a[i]));
4674 }
4675
4676 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4677 if (lo >= hi)
4678 return base;
4679 final Object[] a = this.array;
4680 final IntAndObjectToDouble f = op;
4681 double r = f.op(lo, a[lo]);
4682 for (int i = lo+1; i < hi; ++i)
4683 r = reducer.op(r, f.op(i, a[i]));
4684 return r;
4685 }
4686
4687 }
4688
4689 static final class DUDCPap extends DDCPap {
4690 DUDCPap(ForkJoinPool ex, int origin, int fence,
4691 double[] array, IntAndDoubleToDouble op) {
4692 super(ex, origin, fence, array, op);
4693 }
4694
4695 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
4696 return new DUDCPap(ex, origin, fence, array,
4697 compoundIndexedOp(this.op, op));
4698 }
4699
4700 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
4701 return new DULCPap(ex, origin, fence, array,
4702 compoundIndexedOp(this.op, op));
4703 }
4704
4705 public <U> ParallelDoubleArrayWithMapping< U> withMapping
4706 (DoubleToObject<? extends U> op) {
4707 return new DUOCPap<U>(ex, origin, fence, array,
4708 compoundIndexedOp(this.op, op));
4709 }
4710
4711 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
4712 (IntAndDoubleToObject<? extends V> mapper) {
4713 return new DUOCPap<V>(ex, origin, fence, array,
4714 compoundIndexedOp(this.op, mapper));
4715 }
4716
4717 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
4718 (IntAndDoubleToDouble mapper) {
4719 return new DUDCPap(ex, origin, fence, array,
4720 compoundIndexedOp(this.op, mapper));
4721 }
4722
4723 public ParallelDoubleArrayWithLongMapping withIndexedMapping
4724 (IntAndDoubleToLong mapper) {
4725 return new DULCPap(ex, origin, fence, array,
4726 compoundIndexedOp(this.op, mapper));
4727 }
4728
4729 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4730 final IntAndDoubleToDouble f = op;
4731 final double[] a = this.array;
4732 for (int i = lo; i < hi; ++i)
4733 procedure.op(f.op(i, a[i]));
4734 }
4735
4736 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4737 if (lo >= hi)
4738 return base;
4739 final double[] a = this.array;
4740 final IntAndDoubleToDouble f = op;
4741 double r = f.op(lo, a[lo]);
4742 for (int i = lo+1; i < hi; ++i)
4743 r = reducer.op(r, f.op(i, a[i]));
4744 return r;
4745 }
4746 }
4747
4748 static final class LUDCPap extends LDCPap {
4749 LUDCPap(ForkJoinPool ex, int origin, int fence,
4750 long[] array, IntAndLongToDouble op) {
4751 super(ex, origin, fence, array, op);
4752 }
4753
4754 public ParallelLongArrayWithDoubleMapping withMapping(DoubleOp op) {
4755 return new LUDCPap(ex, origin, fence, array,
4756 compoundIndexedOp(this.op, op));
4757 }
4758
4759 public ParallelLongArrayWithLongMapping withMapping(DoubleToLong op) {
4760 return new LULCPap(ex, origin, fence, array,
4761 compoundIndexedOp(this.op, op));
4762 }
4763
4764 public <U> ParallelLongArrayWithMapping< U> withMapping
4765 (DoubleToObject<? extends U> op) {
4766 return new LUOCPap<U>(ex, origin, fence, array,
4767 compoundIndexedOp(this.op, op));
4768 }
4769
4770 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
4771 (IntAndDoubleToObject<? extends V> mapper) {
4772 return new LUOCPap<V>(ex, origin, fence, array,
4773 compoundIndexedOp(this.op, mapper));
4774 }
4775
4776 public ParallelLongArrayWithDoubleMapping withIndexedMapping
4777 (IntAndDoubleToDouble mapper) {
4778 return new LUDCPap(ex, origin, fence, array,
4779 compoundIndexedOp(this.op, mapper));
4780 }
4781
4782 public ParallelLongArrayWithLongMapping withIndexedMapping
4783 (IntAndDoubleToLong mapper) {
4784 return new LULCPap(ex, origin, fence, array,
4785 compoundIndexedOp(this.op, mapper));
4786 }
4787
4788 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4789 final IntAndLongToDouble f = op;
4790 final long[] a = this.array;
4791 for (int i = lo; i < hi; ++i)
4792 procedure.op(f.op(i, a[i]));
4793 }
4794
4795 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4796 if (lo >= hi)
4797 return base;
4798 final long[] a = this.array;
4799 final IntAndLongToDouble f = op;
4800 double r = f.op(lo, a[lo]);
4801 for (int i = lo+1; i < hi; ++i)
4802 r = reducer.op(r, f.op(i, a[i]));
4803 return r;
4804 }
4805
4806 }
4807
4808 // double-combined, filtered
4809 static final class OFDCPap<T> extends ODCPap<T> {
4810 final Predicate<? super T> selector;
4811 OFDCPap(ForkJoinPool ex, int origin, int fence,
4812 T[] array, Predicate<? super T> selector,
4813 IntAndObjectToDouble<? super T> op) {
4814 super(ex, origin, fence, array, op);
4815 this.selector = selector;
4816 }
4817
4818 boolean hasFilter() { return true; }
4819 boolean isSelected(int i) { return selector.op(this.array[i]); }
4820
4821 public ParallelArrayWithDoubleMapping<T> withMapping(DoubleOp op) {
4822 return new OFDCPap<T>
4823 (ex, origin, fence, array, selector,
4824 compoundIndexedOp(this.op, op));
4825 }
4826
4827 public ParallelArrayWithLongMapping<T> withMapping(DoubleToLong op) {
4828 return new OFLCPap<T>(ex, origin, fence, array, selector,
4829 compoundIndexedOp(this.op, op));
4830 }
4831
4832 public <U> ParallelArrayWithMapping<T,U> withMapping
4833 (DoubleToObject<? extends U> op) {
4834 return new OFOCPap<T,U>(ex, origin, fence, array, selector,
4835 compoundIndexedOp(this.op, op));
4836 }
4837
4838 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
4839 (IntAndDoubleToObject<? extends V> mapper) {
4840 return new OFOCPap<T,V>(ex, origin, fence, array, selector,
4841 compoundIndexedOp(this.op, mapper));
4842 }
4843
4844 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
4845 (IntAndDoubleToDouble mapper) {
4846 return new OFDCPap<T>(ex, origin, fence, array, selector,
4847 compoundIndexedOp(this.op, mapper));
4848 }
4849
4850 public ParallelArrayWithLongMapping<T> withIndexedMapping
4851 (IntAndDoubleToLong mapper) {
4852 return new OFLCPap<T>(ex, origin, fence, array, selector,
4853 compoundIndexedOp(this.op, mapper));
4854 }
4855
4856 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4857 final Predicate s = selector;
4858 final Object[] a = this.array;
4859 final IntAndObjectToDouble f = op;
4860 for (int i = lo; i < hi; ++i) {
4861 Object x = a[i];
4862 if (s.op(x))
4863 procedure.op(f.op(i, x));
4864 }
4865 }
4866
4867 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4868 final Predicate s = selector;
4869 final IntAndObjectToDouble f = op;
4870 boolean gotFirst = false;
4871 double r = base;
4872 final Object[] a = this.array;
4873 for (int i = lo; i < hi; ++i) {
4874 Object t = a[i];
4875 if (s.op(t)) {
4876 double y = f.op(i, t);
4877 if (!gotFirst) {
4878 gotFirst = true;
4879 r = y;
4880 }
4881 else
4882 r = reducer.op(r, y);
4883 }
4884 }
4885 return r;
4886 }
4887 }
4888
4889 static final class DFDCPap extends DDCPap {
4890 final DoublePredicate selector;
4891 DFDCPap(ForkJoinPool ex, int origin, int fence,
4892 double[] array, DoublePredicate selector,
4893 IntAndDoubleToDouble op) {
4894 super(ex, origin, fence, array, op);
4895 this.selector = selector;
4896 }
4897
4898 boolean hasFilter() { return true; }
4899 boolean isSelected(int i) { return selector.op(this.array[i]); }
4900
4901 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
4902 return new DFDCPap(ex, origin, fence, array, selector,
4903 compoundIndexedOp(this.op, op));
4904 }
4905
4906 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
4907 return new DFLCPap(ex, origin, fence, array, selector,
4908 compoundIndexedOp(this.op, op));
4909 }
4910
4911 public <U> ParallelDoubleArrayWithMapping< U> withMapping
4912 (DoubleToObject<? extends U> op) {
4913 return new DFOCPap<U>(ex, origin, fence, array, selector,
4914 compoundIndexedOp(this.op, op));
4915 }
4916
4917 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
4918 (IntAndDoubleToObject<? extends V> mapper) {
4919 return new DFOCPap<V>(ex, origin, fence, array, selector,
4920 compoundIndexedOp(this.op, mapper));
4921 }
4922
4923 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
4924 (IntAndDoubleToDouble mapper) {
4925 return new DFDCPap(ex, origin, fence, array, selector,
4926 compoundIndexedOp(this.op, mapper));
4927 }
4928
4929 public ParallelDoubleArrayWithLongMapping withIndexedMapping
4930 (IntAndDoubleToLong mapper) {
4931 return new DFLCPap(ex, origin, fence, array, selector,
4932 compoundIndexedOp(this.op, mapper));
4933 }
4934
4935 void leafApply(int lo, int hi, DoubleProcedure procedure) {
4936 final DoublePredicate s = selector;
4937 final double[] a = this.array;
4938 final IntAndDoubleToDouble f = op;
4939 for (int i = lo; i < hi; ++i) {
4940 double x = a[i];
4941 if (s.op(x))
4942 procedure.op(f.op(i, x));
4943 }
4944 }
4945
4946 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
4947 final DoublePredicate s = selector;
4948 final IntAndDoubleToDouble f = op;
4949 boolean gotFirst = false;
4950 double r = base;
4951 final double[] a = this.array;
4952 for (int i = lo; i < hi; ++i) {
4953 double t = a[i];
4954 if (s.op(t)) {
4955 double y = f.op(i, t);
4956 if (!gotFirst) {
4957 gotFirst = true;
4958 r = y;
4959 }
4960 else
4961 r = reducer.op(r, y);
4962 }
4963 }
4964 return r;
4965 }
4966 }
4967
4968 static final class LFDCPap extends LDCPap {
4969 final LongPredicate selector;
4970 LFDCPap(ForkJoinPool ex, int origin, int fence,
4971 long[] array, LongPredicate selector, IntAndLongToDouble op) {
4972 super(ex, origin, fence, array, op);
4973 this.selector = selector;
4974 }
4975
4976 boolean hasFilter() { return true; }
4977 boolean isSelected(int i) { return selector.op(this.array[i]); }
4978
4979 public ParallelLongArrayWithDoubleMapping withMapping(DoubleOp op) {
4980 return new LFDCPap(ex, origin, fence, array, selector,
4981 compoundIndexedOp(this.op, op));
4982 }
4983
4984 public ParallelLongArrayWithLongMapping withMapping(DoubleToLong op) {
4985 return new LFLCPap(ex, origin, fence, array, selector,
4986 compoundIndexedOp(this.op, op));
4987 }
4988
4989 public <U> ParallelLongArrayWithMapping< U> withMapping
4990 (DoubleToObject<? extends U> op) {
4991 return new LFOCPap<U>(ex, origin, fence, array, selector,
4992 compoundIndexedOp(this.op, op));
4993 }
4994
4995 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
4996 (IntAndDoubleToObject<? extends V> mapper) {
4997 return new LFOCPap<V>(ex, origin, fence, array, selector,
4998 compoundIndexedOp(this.op, mapper));
4999 }
5000
5001 public ParallelLongArrayWithDoubleMapping withIndexedMapping
5002 (IntAndDoubleToDouble mapper) {
5003 return new LFDCPap(ex, origin, fence, array, selector,
5004 compoundIndexedOp(this.op, mapper));
5005 }
5006
5007 public ParallelLongArrayWithLongMapping withIndexedMapping
5008 (IntAndDoubleToLong mapper) {
5009 return new LFLCPap(ex, origin, fence, array, selector,
5010 compoundIndexedOp(this.op, mapper));
5011 }
5012
5013 void leafApply(int lo, int hi, DoubleProcedure procedure) {
5014 final LongPredicate s = selector;
5015 final long[] a = this.array;
5016 final IntAndLongToDouble f = op;
5017 for (int i = lo; i < hi; ++i) {
5018 long x = a[i];
5019 if (s.op(x))
5020 procedure.op(f.op(i, x));
5021 }
5022 }
5023
5024 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
5025 final LongPredicate s = selector;
5026 final IntAndLongToDouble f = op;
5027 boolean gotFirst = false;
5028 double r = base;
5029 final long[] a = this.array;
5030 for (int i = lo; i < hi; ++i) {
5031 long t = a[i];
5032 if (s.op(t)) {
5033 double y = f.op(i, t);
5034 if (!gotFirst) {
5035 gotFirst = true;
5036 r = y;
5037 }
5038 else
5039 r = reducer.op(r, y);
5040 }
5041 }
5042 return r;
5043 }
5044 }
5045
5046 // double-combined, relational
5047 static final class ORDCPap<T> extends ODCPap<T> {
5048 final IntAndObjectPredicate<? super T> selector;
5049 ORDCPap(ForkJoinPool ex, int origin, int fence,
5050 T[] array, IntAndObjectPredicate<? super T> selector,
5051 IntAndObjectToDouble<? super T> op) {
5052 super(ex, origin, fence, array, op);
5053 this.selector = selector;
5054 }
5055
5056 boolean hasFilter() { return true; }
5057 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
5058
5059 public ParallelArrayWithDoubleMapping<T> withMapping(DoubleOp op) {
5060 return new ORDCPap<T>
5061 (ex, origin, fence, array, selector,
5062 compoundIndexedOp(this.op, op));
5063 }
5064
5065 public ParallelArrayWithLongMapping<T> withMapping(DoubleToLong op) {
5066 return new ORLCPap<T>(ex, origin, fence, array, selector,
5067 compoundIndexedOp(this.op, op));
5068 }
5069
5070 public <U> ParallelArrayWithMapping<T,U> withMapping
5071 (DoubleToObject<? extends U> op) {
5072 return new OROCPap<T,U>(ex, origin, fence, array, selector,
5073 compoundIndexedOp(this.op, op));
5074 }
5075
5076 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
5077 (IntAndDoubleToObject<? extends V> mapper) {
5078 return new OROCPap<T,V>(ex, origin, fence, array, selector,
5079 compoundIndexedOp(this.op, mapper));
5080 }
5081
5082 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
5083 (IntAndDoubleToDouble mapper) {
5084 return new ORDCPap<T>(ex, origin, fence, array, selector,
5085 compoundIndexedOp(this.op, mapper));
5086 }
5087
5088 public ParallelArrayWithLongMapping<T> withIndexedMapping
5089 (IntAndDoubleToLong mapper) {
5090 return new ORLCPap<T>(ex, origin, fence, array, selector,
5091 compoundIndexedOp(this.op, mapper));
5092 }
5093
5094 void leafApply(int lo, int hi, DoubleProcedure procedure) {
5095 final IntAndObjectPredicate s = selector;
5096 final Object[] a = this.array;
5097 final IntAndObjectToDouble f = op;
5098 for (int i = lo; i < hi; ++i) {
5099 Object x = a[i];
5100 if (s.op(i, x))
5101 procedure.op(f.op(i, x));
5102 }
5103 }
5104
5105 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
5106 final IntAndObjectPredicate s = selector;
5107 final IntAndObjectToDouble f = op;
5108 boolean gotFirst = false;
5109 double r = base;
5110 final Object[] a = this.array;
5111 for (int i = lo; i < hi; ++i) {
5112 Object t = a[i];
5113 if (s.op(i, t)) {
5114 double y = f.op(i, t);
5115 if (!gotFirst) {
5116 gotFirst = true;
5117 r = y;
5118 }
5119 else
5120 r = reducer.op(r, y);
5121 }
5122 }
5123 return r;
5124 }
5125 }
5126
5127 static final class DRDCPap extends DDCPap {
5128 final IntAndDoublePredicate selector;
5129 DRDCPap(ForkJoinPool ex, int origin, int fence,
5130 double[] array, IntAndDoublePredicate selector,
5131 IntAndDoubleToDouble op) {
5132 super(ex, origin, fence, array, op);
5133 this.selector = selector;
5134 }
5135
5136 boolean hasFilter() { return true; }
5137 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
5138
5139 public ParallelDoubleArrayWithDoubleMapping withMapping(DoubleOp op) {
5140 return new DRDCPap(ex, origin, fence, array, selector,
5141 compoundIndexedOp(this.op, op));
5142 }
5143
5144 public ParallelDoubleArrayWithLongMapping withMapping(DoubleToLong op) {
5145 return new DRLCPap(ex, origin, fence, array, selector,
5146 compoundIndexedOp(this.op, op));
5147 }
5148
5149 public <U> ParallelDoubleArrayWithMapping< U> withMapping
5150 (DoubleToObject<? extends U> op) {
5151 return new DROCPap<U>(ex, origin, fence, array, selector,
5152 compoundIndexedOp(this.op, op));
5153 }
5154
5155 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
5156 (IntAndDoubleToObject<? extends V> mapper) {
5157 return new DROCPap<V>(ex, origin, fence, array, selector,
5158 compoundIndexedOp(this.op, mapper));
5159 }
5160
5161 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
5162 (IntAndDoubleToDouble mapper) {
5163 return new DRDCPap(ex, origin, fence, array, selector,
5164 compoundIndexedOp(this.op, mapper));
5165 }
5166
5167 public ParallelDoubleArrayWithLongMapping withIndexedMapping
5168 (IntAndDoubleToLong mapper) {
5169 return new DRLCPap(ex, origin, fence, array, selector,
5170 compoundIndexedOp(this.op, mapper));
5171 }
5172
5173 void leafApply(int lo, int hi, DoubleProcedure procedure) {
5174 final IntAndDoublePredicate s = selector;
5175 final double[] a = this.array;
5176 final IntAndDoubleToDouble f = op;
5177 for (int i = lo; i < hi; ++i) {
5178 double x = a[i];
5179 if (s.op(i, x))
5180 procedure.op(f.op(i, x));
5181 }
5182 }
5183
5184 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
5185 final IntAndDoublePredicate s = selector;
5186 final IntAndDoubleToDouble f = op;
5187 boolean gotFirst = false;
5188 double r = base;
5189 final double[] a = this.array;
5190 for (int i = lo; i < hi; ++i) {
5191 double t = a[i];
5192 if (s.op(i, t)) {
5193 double y = f.op(i, t);
5194 if (!gotFirst) {
5195 gotFirst = true;
5196 r = y;
5197 }
5198 else
5199 r = reducer.op(r, y);
5200 }
5201 }
5202 return r;
5203 }
5204 }
5205
5206 static final class LRDCPap extends LDCPap {
5207 final IntAndLongPredicate selector;
5208 LRDCPap(ForkJoinPool ex, int origin, int fence,
5209 long[] array, IntAndLongPredicate selector, IntAndLongToDouble op) {
5210 super(ex, origin, fence, array, op);
5211 this.selector = selector;
5212 }
5213
5214 boolean hasFilter() { return true; }
5215 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
5216
5217 public ParallelLongArrayWithDoubleMapping withMapping(DoubleOp op) {
5218 return new LRDCPap(ex, origin, fence, array, selector,
5219 compoundIndexedOp(this.op, op));
5220 }
5221
5222 public ParallelLongArrayWithLongMapping withMapping(DoubleToLong op) {
5223 return new LRLCPap(ex, origin, fence, array, selector,
5224 compoundIndexedOp(this.op, op));
5225 }
5226
5227 public <U> ParallelLongArrayWithMapping< U> withMapping
5228 (DoubleToObject<? extends U> op) {
5229 return new LROCPap<U>(ex, origin, fence, array, selector,
5230 compoundIndexedOp(this.op, op));
5231 }
5232
5233 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
5234 (IntAndDoubleToObject<? extends V> mapper) {
5235 return new LROCPap<V>(ex, origin, fence, array, selector,
5236 compoundIndexedOp(this.op, mapper));
5237 }
5238
5239 public ParallelLongArrayWithDoubleMapping withIndexedMapping
5240 (IntAndDoubleToDouble mapper) {
5241 return new LRDCPap(ex, origin, fence, array, selector,
5242 compoundIndexedOp(this.op, mapper));
5243 }
5244
5245 public ParallelLongArrayWithLongMapping withIndexedMapping
5246 (IntAndDoubleToLong mapper) {
5247 return new LRLCPap(ex, origin, fence, array, selector,
5248 compoundIndexedOp(this.op, mapper));
5249 }
5250
5251 void leafApply(int lo, int hi, DoubleProcedure procedure) {
5252 final IntAndLongPredicate s = selector;
5253 final long[] a = this.array;
5254 final IntAndLongToDouble f = op;
5255 for (int i = lo; i < hi; ++i) {
5256 long x = a[i];
5257 if (s.op(i, x))
5258 procedure.op(f.op(i, x));
5259 }
5260 }
5261
5262 double leafReduce(int lo, int hi, DoubleReducer reducer, double base) {
5263 final IntAndLongPredicate s = selector;
5264 final IntAndLongToDouble f = op;
5265 boolean gotFirst = false;
5266 double r = base;
5267 final long[] a = this.array;
5268 for (int i = lo; i < hi; ++i) {
5269 long t = a[i];
5270 if (s.op(i, t)) {
5271 double y = f.op(i, t);
5272 if (!gotFirst) {
5273 gotFirst = true;
5274 r = y;
5275 }
5276 else
5277 r = reducer.op(r, y);
5278 }
5279 }
5280 return r;
5281 }
5282 }
5283
5284 // long-combined
5285 abstract static class OLMPap<T> extends ParallelArrayWithLongMapping<T> {
5286 final ObjectToLong<? super T> op;
5287 OLMPap(ForkJoinPool ex, int origin, int fence,
5288 T[] array, final ObjectToLong<? super T> op) {
5289 super(ex, origin, fence, array);
5290 this.op = op;
5291 }
5292
5293 final boolean hasMap() { return true; }
5294 final long lget(int i) { return op.op(this.array[i]); }
5295 final Object oget(int i) { return Long.valueOf(lget(i)); }
5296 final double dget(int i) { return (double)(lget(i)); }
5297
5298 final void leafTransfer(int lo, int hi, long[] dest, int offset) {
5299 final ObjectToLong f = op;
5300 final Object[] a = this.array;
5301 for (int i = lo; i < hi; ++i)
5302 dest[offset++] = f.op(a[i]);
5303 }
5304
5305 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
5306 long[] dest, int offset) {
5307 final Object[] a = this.array;
5308 final ObjectToLong f = op;
5309 for (int i = loIdx; i < hiIdx; ++i)
5310 dest[offset++] = f.op(a[indices[i]]);
5311 }
5312 }
5313
5314 abstract static class DLMPap extends ParallelDoubleArrayWithLongMapping {
5315 final DoubleToLong op;
5316 DLMPap(ForkJoinPool ex, int origin, int fence,
5317 double[] array, DoubleToLong op) {
5318 super(ex, origin, fence, array);
5319 this.op = op;
5320 }
5321
5322 final boolean hasMap() { return true; }
5323 final long lget(int i) { return op.op(this.array[i]); }
5324 final Object oget(int i) { return Long.valueOf(lget(i)); }
5325 final double dget(int i) { return (double)(lget(i)); }
5326
5327 final void leafTransfer(int lo, int hi, long[] dest, int offset) {
5328 final double[] a = this.array;
5329 final DoubleToLong f = op;
5330 for (int i = lo; i < hi; ++i)
5331 dest[offset++] = f.op(a[i]);
5332 }
5333
5334 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
5335 long[] dest, int offset) {
5336 final double[] a = this.array;
5337 final DoubleToLong f = op;
5338 for (int i = loIdx; i < hiIdx; ++i)
5339 dest[offset++] = f.op(a[indices[i]]);
5340 }
5341
5342 }
5343
5344 abstract static class LLMPap extends ParallelLongArrayWithLongMapping {
5345 final LongOp op;
5346 LLMPap(ForkJoinPool ex, int origin, int fence,
5347 long[] array, LongOp op) {
5348 super(ex, origin, fence, array);
5349 this.op = op;
5350 }
5351
5352 final boolean hasMap() { return true; }
5353 final long lget(int i) { return op.op(this.array[i]); }
5354 final Object oget(int i) { return Long.valueOf(lget(i)); }
5355 final double dget(int i) { return (double)(lget(i)); }
5356
5357 final void leafTransfer(int lo, int hi, long[] dest, int offset) {
5358 final long[] a = this.array;
5359 final LongOp f = op;
5360 for (int i = lo; i < hi; ++i)
5361 dest[offset++] = f.op(a[i]);
5362 }
5363
5364 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
5365 long[] dest, int offset) {
5366 final long[] a = this.array;
5367 final LongOp f = op;
5368 for (int i = loIdx; i < hiIdx; ++i)
5369 dest[offset++] = f.op(a[indices[i]]);
5370 }
5371
5372 }
5373
5374 // long-combined, unfiltered
5375 static final class OULMPap<T> extends OLMPap<T> {
5376 OULMPap(ForkJoinPool ex, int origin, int fence,
5377 T[] array, ObjectToLong<? super T> op) {
5378 super(ex, origin, fence, array, op);
5379 }
5380
5381 public ParallelArrayWithDoubleMapping<T> withMapping(LongToDouble op) {
5382 return new OUDMPap<T>(ex, origin, fence, array,
5383 CommonOps.compoundOp(this.op, op));
5384 }
5385
5386 public ParallelArrayWithLongMapping<T> withMapping(LongOp op) {
5387 return new OULMPap<T>(ex, origin, fence, array,
5388 CommonOps.compoundOp(this.op, op));
5389 }
5390
5391 public <U> ParallelArrayWithMapping<T,U> withMapping
5392 (LongToObject<? extends U> op) {
5393 return new OUOMPap<T,U>(ex, origin, fence, array,
5394 CommonOps.compoundOp(this.op, op));
5395 }
5396
5397 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
5398 (IntAndLongToObject<? extends V> mapper) {
5399 return new OUOCPap<T,V>(ex, origin, fence, array,
5400 compoundIndexedOp(this.op, mapper));
5401 }
5402
5403 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
5404 (IntAndLongToDouble mapper) {
5405 return new OUDCPap<T>(ex, origin, fence, array,
5406 compoundIndexedOp(this.op, mapper));
5407 }
5408
5409 public ParallelArrayWithLongMapping<T> withIndexedMapping
5410 (IntAndLongToLong mapper) {
5411 return new OULCPap<T>(ex, origin, fence, array,
5412 compoundIndexedOp(this.op, mapper));
5413 }
5414
5415 void leafApply(int lo, int hi, LongProcedure procedure) {
5416 final Object[] a = this.array;
5417 final ObjectToLong f = op;
5418 for (int i = lo; i < hi; ++i)
5419 procedure.op(f.op(a[i]));
5420 }
5421
5422 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5423 if (lo >= hi)
5424 return base;
5425 final Object[] a = this.array;
5426 final ObjectToLong f = op;
5427 long r = f.op(a[lo]);
5428 for (int i = lo+1; i < hi; ++i)
5429 r = reducer.op(r, f.op(a[i]));
5430 return r;
5431 }
5432 }
5433
5434 static final class DULMPap extends DLMPap {
5435 DULMPap(ForkJoinPool ex, int origin, int fence,
5436 double[] array, DoubleToLong op) {
5437 super(ex, origin, fence, array, op);
5438 }
5439
5440 public ParallelDoubleArrayWithDoubleMapping withMapping
5441 (LongToDouble op) {
5442 return new DUDMPap(ex, origin, fence, array,
5443 CommonOps.compoundOp(this.op, op));
5444 }
5445
5446 public ParallelDoubleArrayWithLongMapping withMapping
5447 (LongOp op) {
5448 return new DULMPap(ex, origin, fence, array,
5449 CommonOps.compoundOp(this.op, op));
5450 }
5451
5452 public <U> ParallelDoubleArrayWithMapping<U> withMapping
5453 (LongToObject<? extends U> op) {
5454 return new DUOMPap<U>(ex, origin, fence, array,
5455 CommonOps.compoundOp(this.op, op));
5456 }
5457
5458 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
5459 (IntAndLongToObject<? extends V> mapper) {
5460 return new DUOCPap<V>(ex, origin, fence, array,
5461 compoundIndexedOp(this.op, mapper));
5462 }
5463
5464 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
5465 (IntAndLongToDouble mapper) {
5466 return new DUDCPap(ex, origin, fence, array,
5467 compoundIndexedOp(this.op, mapper));
5468 }
5469
5470 public ParallelDoubleArrayWithLongMapping withIndexedMapping
5471 (IntAndLongToLong mapper) {
5472 return new DULCPap(ex, origin, fence, array,
5473 compoundIndexedOp(this.op, mapper));
5474 }
5475
5476 void leafApply(int lo, int hi, LongProcedure procedure) {
5477 final double[] a = this.array;
5478 final DoubleToLong f = op;
5479 for (int i = lo; i < hi; ++i)
5480 procedure.op(f.op(a[i]));
5481 }
5482
5483 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5484 if (lo >= hi)
5485 return base;
5486 final double[] a = this.array;
5487 final DoubleToLong f = op;
5488 long r = f.op(a[lo]);
5489 for (int i = lo+1; i < hi; ++i)
5490 r = reducer.op(r, f.op(a[i]));
5491 return r;
5492 }
5493
5494 }
5495
5496 static final class LULMPap extends LLMPap {
5497 LULMPap(ForkJoinPool ex, int origin, int fence,
5498 long[] array, LongOp op) {
5499 super(ex, origin, fence, array, op);
5500 }
5501
5502 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
5503 return new LULMPap(ex, origin, fence, array,
5504 CommonOps.compoundOp(this.op, op));
5505 }
5506
5507 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
5508 return new LUDMPap(ex, origin, fence, array,
5509 CommonOps.compoundOp(this.op, op));
5510 }
5511
5512 public <U> ParallelLongArrayWithMapping<U> withMapping
5513 (LongToObject<? extends U> op) {
5514 return new LUOMPap<U>(ex, origin, fence, array,
5515 CommonOps.compoundOp(this.op, op));
5516 }
5517
5518 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
5519 (IntAndLongToObject<? extends V> mapper) {
5520 return new LUOCPap<V>(ex, origin, fence, array,
5521 compoundIndexedOp(this.op, mapper));
5522 }
5523
5524 public ParallelLongArrayWithDoubleMapping withIndexedMapping
5525 (IntAndLongToDouble mapper) {
5526 return new LUDCPap(ex, origin, fence, array,
5527 compoundIndexedOp(this.op, mapper));
5528 }
5529
5530 public ParallelLongArrayWithLongMapping withIndexedMapping
5531 (IntAndLongToLong mapper) {
5532 return new LULCPap(ex, origin, fence, array,
5533 compoundIndexedOp(this.op, mapper));
5534 }
5535
5536 void leafApply(int lo, int hi, LongProcedure procedure) {
5537 final LongOp f = op;
5538 final long[] a = this.array;
5539 for (int i = lo; i < hi; ++i)
5540 procedure.op(f.op(a[i]));
5541 }
5542
5543 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5544 if (lo >= hi)
5545 return base;
5546 final long[] a = this.array;
5547 final LongOp f = op;
5548 long r = f.op(a[lo]);
5549 for (int i = lo+1; i < hi; ++i)
5550 r = reducer.op(r, f.op(a[i]));
5551 return r;
5552 }
5553 }
5554
5555 // long-combined, filtered
5556 static final class OFLMPap<T> extends OLMPap<T> {
5557 final Predicate<? super T> selector;
5558 OFLMPap(ForkJoinPool ex, int origin, int fence,
5559 T[] array, Predicate<? super T> selector,
5560 ObjectToLong<? super T> op) {
5561 super(ex, origin, fence, array, op);
5562 this.selector = selector;
5563 }
5564
5565 boolean hasFilter() { return true; }
5566 boolean isSelected(int i) { return selector.op(this.array[i]); }
5567
5568 public ParallelArrayWithDoubleMapping<T> withMapping
5569 (LongToDouble op) {
5570 return new OFDMPap<T>(ex, origin, fence, array, selector,
5571 CommonOps.compoundOp(this.op, op));
5572 }
5573
5574 public ParallelArrayWithLongMapping<T> withMapping
5575 (LongOp op) {
5576 return new OFLMPap<T>(ex, origin, fence, array, selector,
5577 CommonOps.compoundOp(this.op, op));
5578 }
5579
5580 public <U> ParallelArrayWithMapping<T,U> withMapping
5581 (LongToObject<? extends U> op) {
5582 return new OFOMPap<T,U>(ex, origin, fence, array, selector,
5583 CommonOps.compoundOp(this.op, op));
5584 }
5585
5586 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
5587 (IntAndLongToObject<? extends V> mapper) {
5588 return new OFOCPap<T,V>(ex, origin, fence, array, selector,
5589 compoundIndexedOp(this.op, mapper));
5590 }
5591
5592 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
5593 (IntAndLongToDouble mapper) {
5594 return new OFDCPap<T>(ex, origin, fence, array, selector,
5595 compoundIndexedOp(this.op, mapper));
5596 }
5597
5598 public ParallelArrayWithLongMapping<T> withIndexedMapping
5599 (IntAndLongToLong mapper) {
5600 return new OFLCPap<T>(ex, origin, fence, array, selector,
5601 compoundIndexedOp(this.op, mapper));
5602 }
5603
5604 void leafApply(int lo, int hi, LongProcedure procedure) {
5605 final Predicate s = selector;
5606 final Object[] a = this.array;
5607 final ObjectToLong f = op;
5608 for (int i = lo; i < hi; ++i) {
5609 Object x = a[i];
5610 if (s.op(x))
5611 procedure.op(f.op(x));
5612 }
5613 }
5614
5615 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5616 final Predicate s = selector;
5617 final ObjectToLong f = op;
5618 boolean gotFirst = false;
5619 long r = base;
5620 final Object[] a = this.array;
5621 for (int i = lo; i < hi; ++i) {
5622 Object t = a[i];
5623 if (s.op(t)) {
5624 long y = f.op(t);
5625 if (!gotFirst) {
5626 gotFirst = true;
5627 r = y;
5628 }
5629 else
5630 r = reducer.op(r, y);
5631 }
5632 }
5633 return r;
5634 }
5635 }
5636
5637 static final class DFLMPap extends DLMPap {
5638 final DoublePredicate selector;
5639 DFLMPap(ForkJoinPool ex, int origin, int fence,
5640 double[] array, DoublePredicate selector, DoubleToLong op) {
5641 super(ex, origin, fence, array, op);
5642 this.selector = selector;
5643 }
5644
5645 boolean hasFilter() { return true; }
5646 boolean isSelected(int i) { return selector.op(this.array[i]); }
5647
5648 public ParallelDoubleArrayWithDoubleMapping withMapping
5649 (LongToDouble op) {
5650 return new DFDMPap(ex, origin, fence, array, selector,
5651 CommonOps.compoundOp(this.op, op));
5652 }
5653
5654 public ParallelDoubleArrayWithLongMapping withMapping
5655 (LongOp op) {
5656 return new DFLMPap(ex, origin, fence, array, selector,
5657 CommonOps.compoundOp(this.op, op));
5658 }
5659
5660 public <U> ParallelDoubleArrayWithMapping<U> withMapping
5661 (LongToObject<? extends U> op) {
5662 return new DFOMPap<U>(ex, origin, fence, array, selector,
5663 CommonOps.compoundOp(this.op, op));
5664 }
5665
5666 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
5667 (IntAndLongToObject<? extends V> mapper) {
5668 return new DFOCPap<V>(ex, origin, fence, array, selector,
5669 compoundIndexedOp(this.op, mapper));
5670 }
5671
5672 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
5673 (IntAndLongToDouble mapper) {
5674 return new DFDCPap(ex, origin, fence, array, selector,
5675 compoundIndexedOp(this.op, mapper));
5676 }
5677
5678 public ParallelDoubleArrayWithLongMapping withIndexedMapping
5679 (IntAndLongToLong mapper) {
5680 return new DFLCPap(ex, origin, fence, array, selector,
5681 compoundIndexedOp(this.op, mapper));
5682 }
5683
5684 void leafApply(int lo, int hi, LongProcedure procedure) {
5685 final DoublePredicate s = selector;
5686 final DoubleToLong f = op;
5687 final double[] a = this.array;
5688 for (int i = lo; i < hi; ++i) {
5689 double x = a[i];
5690 if (s.op(x))
5691 procedure.op(f.op(x));
5692 }
5693 }
5694
5695 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5696 boolean gotFirst = false;
5697 long r = base;
5698 final double[] a = this.array;
5699 final DoublePredicate s = selector;
5700 final DoubleToLong f = op;
5701 for (int i = lo; i < hi; ++i) {
5702 double t = a[i];
5703 if (s.op(t)) {
5704 long y = f.op(t);
5705 if (!gotFirst) {
5706 gotFirst = true;
5707 r = y;
5708 }
5709 else
5710 r = reducer.op(r, y);
5711 }
5712 }
5713 return r;
5714 }
5715 }
5716
5717 static final class LFLMPap extends LLMPap {
5718 final LongPredicate selector;
5719 LFLMPap(ForkJoinPool ex, int origin, int fence,
5720 long[] array, LongPredicate selector, LongOp op) {
5721 super(ex, origin, fence, array, op);
5722 this.selector = selector;
5723 }
5724
5725 boolean hasFilter() { return true; }
5726 boolean isSelected(int i) { return selector.op(this.array[i]); }
5727
5728 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
5729 return new LFLMPap(ex, origin, fence, array, selector,
5730 CommonOps.compoundOp(this.op, op));
5731 }
5732
5733 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
5734 return new LFDMPap(ex, origin, fence, array, selector,
5735 CommonOps.compoundOp(this.op, op));
5736 }
5737
5738 public <U> ParallelLongArrayWithMapping<U> withMapping
5739 (LongToObject<? extends U> op) {
5740 return new LFOMPap<U>(ex, origin, fence, array, selector,
5741 CommonOps.compoundOp(this.op, op));
5742 }
5743
5744 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
5745 (IntAndLongToObject<? extends V> mapper) {
5746 return new LFOCPap<V>(ex, origin, fence, array, selector,
5747 compoundIndexedOp(this.op, mapper));
5748 }
5749
5750 public ParallelLongArrayWithDoubleMapping withIndexedMapping
5751 (IntAndLongToDouble mapper) {
5752 return new LFDCPap(ex, origin, fence, array, selector,
5753 compoundIndexedOp(this.op, mapper));
5754 }
5755
5756 public ParallelLongArrayWithLongMapping withIndexedMapping
5757 (IntAndLongToLong mapper) {
5758 return new LFLCPap(ex, origin, fence, array, selector,
5759 compoundIndexedOp(this.op, mapper));
5760 }
5761
5762 void leafApply(int lo, int hi, LongProcedure procedure) {
5763 final LongPredicate s = selector;
5764 final LongOp f = op;
5765 final long[] a = this.array;
5766 for (int i = lo; i < hi; ++i) {
5767 long x = a[i];
5768 if (s.op(x))
5769 procedure.op(f.op(x));
5770 }
5771 }
5772
5773 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5774 final LongPredicate s = selector;
5775 final LongOp f = op;
5776 boolean gotFirst = false;
5777 long r = base;
5778 final long[] a = this.array;
5779 for (int i = lo; i < hi; ++i) {
5780 long t = a[i];
5781 if (s.op(t)) {
5782 long y = f.op(t);
5783 if (!gotFirst) {
5784 gotFirst = true;
5785 r = y;
5786 }
5787 else
5788 r = reducer.op(r, y);
5789 }
5790 }
5791 return r;
5792 }
5793 }
5794
5795 // Long-mapped, relational
5796 static final class ORLMPap<T> extends OLMPap<T> {
5797 final IntAndObjectPredicate<? super T> selector;
5798 ORLMPap(ForkJoinPool ex, int origin, int fence,
5799 T[] array, IntAndObjectPredicate<? super T> selector,
5800 ObjectToLong<? super T> op) {
5801 super(ex, origin, fence, array, op);
5802 this.selector = selector;
5803 }
5804
5805 boolean hasFilter() { return true; }
5806 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
5807
5808 public ParallelArrayWithDoubleMapping<T> withMapping
5809 (LongToDouble op) {
5810 return new ORDMPap<T>(ex, origin, fence, array, selector,
5811 CommonOps.compoundOp(this.op, op));
5812 }
5813
5814 public ParallelArrayWithLongMapping<T> withMapping
5815 (LongOp op) {
5816 return new ORLMPap<T>(ex, origin, fence, array, selector,
5817 CommonOps.compoundOp(this.op, op));
5818 }
5819
5820 public <U> ParallelArrayWithMapping<T,U> withMapping
5821 (LongToObject<? extends U> op) {
5822 return new OROMPap<T,U>(ex, origin, fence, array, selector,
5823 CommonOps.compoundOp(this.op, op));
5824 }
5825
5826 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
5827 (IntAndLongToObject<? extends V> mapper) {
5828 return new OROCPap<T,V>(ex, origin, fence, array, selector,
5829 compoundIndexedOp(this.op, mapper));
5830 }
5831
5832 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
5833 (IntAndLongToDouble mapper) {
5834 return new ORDCPap<T>(ex, origin, fence, array, selector,
5835 compoundIndexedOp(this.op, mapper));
5836 }
5837
5838 public ParallelArrayWithLongMapping<T> withIndexedMapping
5839 (IntAndLongToLong mapper) {
5840 return new ORLCPap<T>(ex, origin, fence, array, selector,
5841 compoundIndexedOp(this.op, mapper));
5842 }
5843
5844 void leafApply(int lo, int hi, LongProcedure procedure) {
5845 final IntAndObjectPredicate s = selector;
5846 final Object[] a = this.array;
5847 final ObjectToLong f = op;
5848 for (int i = lo; i < hi; ++i) {
5849 Object x = a[i];
5850 if (s.op(i, x))
5851 procedure.op(f.op(x));
5852 }
5853 }
5854
5855 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5856 final IntAndObjectPredicate s = selector;
5857 final ObjectToLong f = op;
5858 boolean gotFirst = false;
5859 long r = base;
5860 final Object[] a = this.array;
5861 for (int i = lo; i < hi; ++i) {
5862 Object t = a[i];
5863 if (s.op(i, t)) {
5864 long y = f.op(t);
5865 if (!gotFirst) {
5866 gotFirst = true;
5867 r = y;
5868 }
5869 else
5870 r = reducer.op(r, y);
5871 }
5872 }
5873 return r;
5874 }
5875 }
5876
5877 static final class DRLMPap extends DLMPap {
5878 final IntAndDoublePredicate selector;
5879 DRLMPap(ForkJoinPool ex, int origin, int fence, double[] array,
5880 IntAndDoublePredicate selector, DoubleToLong op) {
5881 super(ex, origin, fence, array, op);
5882 this.selector = selector;
5883 }
5884
5885 boolean hasFilter() { return true; }
5886 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
5887
5888 public ParallelDoubleArrayWithDoubleMapping withMapping
5889 (LongToDouble op) {
5890 return new DRDMPap(ex, origin, fence, array, selector,
5891 CommonOps.compoundOp(this.op, op));
5892 }
5893
5894 public ParallelDoubleArrayWithLongMapping withMapping
5895 (LongOp op) {
5896 return new DRLMPap(ex, origin, fence, array, selector,
5897 CommonOps.compoundOp(this.op, op));
5898 }
5899
5900 public <U> ParallelDoubleArrayWithMapping<U> withMapping
5901 (LongToObject<? extends U> op) {
5902 return new DROMPap<U>(ex, origin, fence, array, selector,
5903 CommonOps.compoundOp(this.op, op));
5904 }
5905
5906 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
5907 (IntAndLongToObject<? extends V> mapper) {
5908 return new DROCPap<V>(ex, origin, fence, array, selector,
5909 compoundIndexedOp(this.op, mapper));
5910 }
5911
5912 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
5913 (IntAndLongToDouble mapper) {
5914 return new DRDCPap(ex, origin, fence, array, selector,
5915 compoundIndexedOp(this.op, mapper));
5916 }
5917
5918 public ParallelDoubleArrayWithLongMapping withIndexedMapping
5919 (IntAndLongToLong mapper) {
5920 return new DRLCPap(ex, origin, fence, array, selector,
5921 compoundIndexedOp(this.op, mapper));
5922 }
5923
5924 void leafApply(int lo, int hi, LongProcedure procedure) {
5925 final IntAndDoublePredicate s = selector;
5926 final DoubleToLong f = op;
5927 final double[] a = this.array;
5928 for (int i = lo; i < hi; ++i) {
5929 double x = a[i];
5930 if (s.op(i, x))
5931 procedure.op(f.op(x));
5932 }
5933 }
5934
5935 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
5936 boolean gotFirst = false;
5937 long r = base;
5938 final double[] a = this.array;
5939 final IntAndDoublePredicate s = selector;
5940 final DoubleToLong f = op;
5941 for (int i = lo; i < hi; ++i) {
5942 double t = a[i];
5943 if (s.op(i, t)) {
5944 long y = f.op(t);
5945 if (!gotFirst) {
5946 gotFirst = true;
5947 r = y;
5948 }
5949 else
5950 r = reducer.op(r, y);
5951 }
5952 }
5953 return r;
5954 }
5955 }
5956
5957 static final class LRLMPap extends LLMPap {
5958 final IntAndLongPredicate selector;
5959 LRLMPap(ForkJoinPool ex, int origin, int fence,
5960 long[] array, IntAndLongPredicate selector, LongOp op) {
5961 super(ex, origin, fence, array, op);
5962 this.selector = selector;
5963 }
5964
5965 boolean hasFilter() { return true; }
5966 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
5967
5968 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
5969 return new LRLMPap(ex, origin, fence, array, selector,
5970 CommonOps.compoundOp(this.op, op));
5971 }
5972
5973 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
5974 return new LRDMPap(ex, origin, fence, array, selector,
5975 CommonOps.compoundOp(this.op, op));
5976 }
5977
5978 public <U> ParallelLongArrayWithMapping<U> withMapping
5979 (LongToObject<? extends U> op) {
5980 return new LROMPap<U>(ex, origin, fence, array, selector,
5981 CommonOps.compoundOp(this.op, op));
5982 }
5983
5984 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
5985 (IntAndLongToObject<? extends V> mapper) {
5986 return new LROCPap<V>(ex, origin, fence, array, selector,
5987 compoundIndexedOp(this.op, mapper));
5988 }
5989
5990 public ParallelLongArrayWithDoubleMapping withIndexedMapping
5991 (IntAndLongToDouble mapper) {
5992 return new LRDCPap(ex, origin, fence, array, selector,
5993 compoundIndexedOp(this.op, mapper));
5994 }
5995
5996 public ParallelLongArrayWithLongMapping withIndexedMapping
5997 (IntAndLongToLong mapper) {
5998 return new LRLCPap(ex, origin, fence, array, selector,
5999 compoundIndexedOp(this.op, mapper));
6000 }
6001
6002 void leafApply(int lo, int hi, LongProcedure procedure) {
6003 final IntAndLongPredicate s = selector;
6004 final LongOp f = op;
6005 final long[] a = this.array;
6006 for (int i = lo; i < hi; ++i) {
6007 long x = a[i];
6008 if (s.op(i, x))
6009 procedure.op(f.op(x));
6010 }
6011 }
6012
6013 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6014 final IntAndLongPredicate s = selector;
6015 final LongOp f = op;
6016 boolean gotFirst = false;
6017 long r = base;
6018 final long[] a = this.array;
6019 for (int i = lo; i < hi; ++i) {
6020 long t = a[i];
6021 if (s.op(i, t)) {
6022 long y = f.op(t);
6023 if (!gotFirst) {
6024 gotFirst = true;
6025 r = y;
6026 }
6027 else
6028 r = reducer.op(r, y);
6029 }
6030 }
6031 return r;
6032 }
6033 }
6034
6035 // long-combined
6036 abstract static class OLCPap<T> extends ParallelArrayWithLongMapping<T> {
6037 final IntAndObjectToLong<? super T> op;
6038 OLCPap(ForkJoinPool ex, int origin, int fence,
6039 T[] array, IntAndObjectToLong<? super T> op) {
6040 super(ex, origin, fence, array);
6041 this.op = op;
6042 }
6043
6044 final boolean hasMap() { return true; }
6045 final long lget(int i) { return op.op(i, this.array[i]); }
6046 final Object oget(int i) { return Long.valueOf(lget(i)); }
6047 final double dget(int i) { return (double)(lget(i)); }
6048
6049 final void leafTransfer(int lo, int hi, long[] dest, int offset) {
6050 final IntAndObjectToLong f = op;
6051 final Object[] a = this.array;
6052 for (int i = lo; i < hi; ++i)
6053 dest[offset++] = f.op(i, a[i]);
6054 }
6055
6056 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
6057 long[] dest, int offset) {
6058 final Object[] a = this.array;
6059 final IntAndObjectToLong f = op;
6060 for (int i = loIdx; i < hiIdx; ++i) {
6061 int idx = indices[i];
6062 dest[offset++] = f.op(idx, a[idx]);
6063 }
6064 }
6065 }
6066
6067 abstract static class DLCPap extends ParallelDoubleArrayWithLongMapping {
6068 final IntAndDoubleToLong op;
6069 DLCPap(ForkJoinPool ex, int origin, int fence,
6070 double[] array, IntAndDoubleToLong op) {
6071 super(ex, origin, fence, array);
6072 this.op = op;
6073 }
6074
6075 final boolean hasMap() { return true; }
6076 final long lget(int i) { return op.op(i, this.array[i]); }
6077 final Object oget(int i) { return Long.valueOf(lget(i)); }
6078 final double dget(int i) { return (double)(lget(i)); }
6079
6080 final void leafTransfer(int lo, int hi, long[] dest, int offset) {
6081 final IntAndDoubleToLong f = op;
6082 final double[] a = this.array;
6083 for (int i = lo; i < hi; ++i)
6084 dest[offset++] = f.op(i, a[i]);
6085 }
6086
6087 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
6088 long[] dest, int offset) {
6089 final double[] a = this.array;
6090 final IntAndDoubleToLong f = op;
6091 for (int i = loIdx; i < hiIdx; ++i) {
6092 int idx = indices[i];
6093 dest[offset++] = f.op(idx, a[idx]);
6094 }
6095 }
6096 }
6097
6098 abstract static class LLCPap extends ParallelLongArrayWithLongMapping {
6099 final IntAndLongToLong op;
6100 LLCPap(ForkJoinPool ex, int origin, int fence,
6101 long[] array, IntAndLongToLong op) {
6102 super(ex, origin, fence, array);
6103 this.op = op;
6104 }
6105
6106 final boolean hasMap() { return true; }
6107 final long lget(int i) { return op.op(i, this.array[i]); }
6108 final Object oget(int i) { return Long.valueOf(lget(i)); }
6109 final double dget(int i) { return (double)(lget(i)); }
6110
6111 final void leafTransfer(int lo, int hi, long[] dest, int offset) {
6112 final IntAndLongToLong f = op;
6113 final long[] a = this.array;
6114 for (int i = lo; i < hi; ++i)
6115 dest[offset++] = f.op(i, a[i]);
6116 }
6117
6118 final void leafTransferByIndex(int[] indices, int loIdx, int hiIdx,
6119 long[] dest, int offset) {
6120 final long[] a = this.array;
6121 final IntAndLongToLong f = op;
6122 for (int i = loIdx; i < hiIdx; ++i) {
6123 int idx = indices[i];
6124 dest[offset++] = f.op(idx, a[idx]);
6125 }
6126 }
6127 }
6128
6129 // long-combined, unfiltered
6130 static final class OULCPap<T> extends OLCPap<T> {
6131 OULCPap(ForkJoinPool ex, int origin, int fence,
6132 T[] array, IntAndObjectToLong<? super T> op) {
6133 super(ex, origin, fence, array, op);
6134 }
6135
6136 public ParallelArrayWithDoubleMapping<T> withMapping(LongToDouble op) {
6137 return new OUDCPap<T>(ex, origin, fence, array,
6138 compoundIndexedOp(this.op, op));
6139 }
6140
6141 public ParallelArrayWithLongMapping<T> withMapping(LongOp op) {
6142 return new OULCPap<T>(ex, origin, fence, array,
6143 compoundIndexedOp(this.op, op));
6144 }
6145
6146 public <U> ParallelArrayWithMapping<T,U> withMapping
6147 (LongToObject<? extends U> op) {
6148 return new OUOCPap<T,U>(ex, origin, fence, array,
6149 compoundIndexedOp(this.op, op));
6150 }
6151
6152 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
6153 (IntAndLongToObject<? extends V> mapper) {
6154 return new OUOCPap<T,V>(ex, origin, fence, array,
6155 compoundIndexedOp(this.op, mapper));
6156 }
6157
6158 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
6159 (IntAndLongToDouble mapper) {
6160 return new OUDCPap<T>(ex, origin, fence, array,
6161 compoundIndexedOp(this.op, mapper));
6162 }
6163
6164 public ParallelArrayWithLongMapping<T> withIndexedMapping
6165 (IntAndLongToLong mapper) {
6166 return new OULCPap<T>(ex, origin, fence, array,
6167 compoundIndexedOp(this.op, mapper));
6168 }
6169
6170 void leafApply(int lo, int hi, LongProcedure procedure) {
6171 final IntAndObjectToLong f = op;
6172 final Object[] a = this.array;
6173 for (int i = lo; i < hi; ++i)
6174 procedure.op(f.op(i, a[i]));
6175 }
6176
6177 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6178 if (lo >= hi)
6179 return base;
6180 final Object[] a = this.array;
6181 final IntAndObjectToLong f = op;
6182 long r = f.op(lo, a[lo]);
6183 for (int i = lo+1; i < hi; ++i)
6184 r = reducer.op(r, f.op(i, a[i]));
6185 return r;
6186 }
6187
6188 }
6189 static final class DULCPap extends DLCPap {
6190 DULCPap(ForkJoinPool ex, int origin, int fence,
6191 double[] array, IntAndDoubleToLong op) {
6192 super(ex, origin, fence, array, op);
6193 }
6194
6195 public ParallelDoubleArrayWithDoubleMapping withMapping
6196 (LongToDouble op) {
6197 return new DUDCPap(ex, origin, fence, array,
6198 compoundIndexedOp(this.op, op));
6199 }
6200
6201 public ParallelDoubleArrayWithLongMapping withMapping(LongOp op) {
6202 return new DULCPap(ex, origin, fence, array,
6203 compoundIndexedOp(this.op, op));
6204 }
6205
6206 public <U> ParallelDoubleArrayWithMapping< U> withMapping
6207 (LongToObject<? extends U> op) {
6208 return new DUOCPap<U>(ex, origin, fence, array,
6209 compoundIndexedOp(this.op, op));
6210 }
6211
6212 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
6213 (IntAndLongToObject<? extends V> mapper) {
6214 return new DUOCPap<V>(ex, origin, fence, array,
6215 compoundIndexedOp(this.op, mapper));
6216 }
6217
6218 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
6219 (IntAndLongToDouble mapper) {
6220 return new DUDCPap(ex, origin, fence, array,
6221 compoundIndexedOp(this.op, mapper));
6222 }
6223
6224 public ParallelDoubleArrayWithLongMapping withIndexedMapping
6225 (IntAndLongToLong mapper) {
6226 return new DULCPap(ex, origin, fence, array,
6227 compoundIndexedOp(this.op, mapper));
6228 }
6229
6230 void leafApply(int lo, int hi, LongProcedure procedure) {
6231 final IntAndDoubleToLong f = op;
6232 final double[] a = this.array;
6233 for (int i = lo; i < hi; ++i)
6234 procedure.op(f.op(i, a[i]));
6235 }
6236
6237 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6238 if (lo >= hi)
6239 return base;
6240 final double[] a = this.array;
6241 final IntAndDoubleToLong f = op;
6242 long r = f.op(lo, a[lo]);
6243 for (int i = lo+1; i < hi; ++i)
6244 r = reducer.op(r, f.op(i, a[i]));
6245 return r;
6246 }
6247 }
6248
6249 static final class LULCPap extends LLCPap {
6250 LULCPap(ForkJoinPool ex, int origin, int fence,
6251 long[] array, IntAndLongToLong op) {
6252 super(ex, origin, fence, array, op);
6253 }
6254
6255 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
6256 return new LUDCPap(ex, origin, fence, array,
6257 compoundIndexedOp(this.op, op));
6258 }
6259
6260 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
6261 return new LULCPap(ex, origin, fence, array,
6262 compoundIndexedOp(this.op, op));
6263 }
6264
6265 public <U> ParallelLongArrayWithMapping< U> withMapping
6266 (LongToObject<? extends U> op) {
6267 return new LUOCPap<U>(ex, origin, fence, array,
6268 compoundIndexedOp(this.op, op));
6269 }
6270
6271 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
6272 (IntAndLongToObject<? extends V> mapper) {
6273 return new LUOCPap<V>(ex, origin, fence, array,
6274 compoundIndexedOp(this.op, mapper));
6275 }
6276
6277 public ParallelLongArrayWithDoubleMapping withIndexedMapping
6278 (IntAndLongToDouble mapper) {
6279 return new LUDCPap(ex, origin, fence, array,
6280 compoundIndexedOp(this.op, mapper));
6281 }
6282
6283 public ParallelLongArrayWithLongMapping withIndexedMapping
6284 (IntAndLongToLong mapper) {
6285 return new LULCPap(ex, origin, fence, array,
6286 compoundIndexedOp(this.op, mapper));
6287 }
6288
6289 void leafApply(int lo, int hi, LongProcedure procedure) {
6290 final IntAndLongToLong f = op;
6291 final long[] a = this.array;
6292 for (int i = lo; i < hi; ++i)
6293 procedure.op(f.op(i, a[i]));
6294 }
6295
6296 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6297 if (lo >= hi)
6298 return base;
6299 final long[] a = this.array;
6300 final IntAndLongToLong f = op;
6301 long r = f.op(lo, a[lo]);
6302 for (int i = lo+1; i < hi; ++i)
6303 r = reducer.op(r, f.op(i, a[i]));
6304 return r;
6305 }
6306 }
6307
6308 // long-combined, filtered
6309 static final class OFLCPap<T> extends OLCPap<T> {
6310 final Predicate<? super T> selector;
6311 OFLCPap(ForkJoinPool ex, int origin, int fence,
6312 T[] array, Predicate<? super T> selector,
6313 IntAndObjectToLong<? super T> op) {
6314 super(ex, origin, fence, array, op);
6315 this.selector = selector;
6316 }
6317
6318 boolean hasFilter() { return true; }
6319 boolean isSelected(int i) { return selector.op(this.array[i]); }
6320
6321 public ParallelArrayWithDoubleMapping<T> withMapping(LongToDouble op) {
6322 return new OFDCPap<T>(ex, origin, fence, array, selector,
6323 compoundIndexedOp(this.op, op));
6324 }
6325
6326 public ParallelArrayWithLongMapping<T> withMapping(LongOp op) {
6327 return new OFLCPap<T>(ex, origin, fence, array, selector,
6328 compoundIndexedOp(this.op, op));
6329 }
6330
6331 public <U> ParallelArrayWithMapping<T,U> withMapping
6332 (LongToObject<? extends U> op) {
6333 return new OFOCPap<T,U>(ex, origin, fence, array,
6334 selector,
6335 compoundIndexedOp(this.op, op));
6336 }
6337
6338 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
6339 (IntAndLongToObject<? extends V> mapper) {
6340 return new OFOCPap<T,V>(ex, origin, fence, array,
6341 selector,
6342 compoundIndexedOp(this.op, mapper));
6343 }
6344
6345 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
6346 (IntAndLongToDouble mapper) {
6347 return new OFDCPap<T>(ex, origin, fence, array, selector,
6348 compoundIndexedOp(this.op, mapper));
6349 }
6350
6351 public ParallelArrayWithLongMapping<T> withIndexedMapping
6352 (IntAndLongToLong mapper) {
6353 return new OFLCPap<T>(ex, origin, fence, array, selector,
6354 compoundIndexedOp(this.op, mapper));
6355 }
6356
6357 void leafApply(int lo, int hi, LongProcedure procedure) {
6358 final Predicate s = selector;
6359 final Object[] a = this.array;
6360 final IntAndObjectToLong f = op;
6361 for (int i = lo; i < hi; ++i) {
6362 Object x = a[i];
6363 if (s.op(x))
6364 procedure.op(f.op(i, x));
6365 }
6366 }
6367
6368 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6369 final Predicate s = selector;
6370 final IntAndObjectToLong f = op;
6371 boolean gotFirst = false;
6372 long r = base;
6373 final Object[] a = this.array;
6374 for (int i = lo; i < hi; ++i) {
6375 Object t = a[i];
6376 if (s.op(t)) {
6377 long y = f.op(i, t);
6378 if (!gotFirst) {
6379 gotFirst = true;
6380 r = y;
6381 }
6382 else
6383 r = reducer.op(r, y);
6384 }
6385 }
6386 return r;
6387 }
6388
6389 }
6390
6391 static final class DFLCPap extends DLCPap {
6392 final DoublePredicate selector;
6393 DFLCPap(ForkJoinPool ex, int origin, int fence,
6394 double[] array, DoublePredicate selector,
6395 IntAndDoubleToLong op) {
6396 super(ex, origin, fence, array, op);
6397 this.selector = selector;
6398 }
6399
6400 boolean hasFilter() { return true; }
6401 boolean isSelected(int i) { return selector.op(this.array[i]); }
6402
6403 public ParallelDoubleArrayWithDoubleMapping withMapping
6404 (LongToDouble op) {
6405 return new DFDCPap(ex, origin, fence, array, selector,
6406 compoundIndexedOp(this.op, op));
6407 }
6408
6409 public ParallelDoubleArrayWithLongMapping withMapping(LongOp op) {
6410 return new DFLCPap(ex, origin, fence, array, selector,
6411 compoundIndexedOp(this.op, op));
6412 }
6413
6414 public <U> ParallelDoubleArrayWithMapping< U> withMapping
6415 (LongToObject<? extends U> op) {
6416 return new DFOCPap<U>(ex, origin, fence, array, selector,
6417 compoundIndexedOp(this.op, op));
6418 }
6419
6420 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
6421 (IntAndLongToObject<? extends V> mapper) {
6422 return new DFOCPap<V>(ex, origin, fence, array, selector,
6423 compoundIndexedOp(this.op, mapper));
6424 }
6425
6426 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
6427 (IntAndLongToDouble mapper) {
6428 return new DFDCPap(ex, origin, fence, array, selector,
6429 compoundIndexedOp(this.op, mapper));
6430 }
6431
6432 public ParallelDoubleArrayWithLongMapping withIndexedMapping
6433 (IntAndLongToLong mapper) {
6434 return new DFLCPap(ex, origin, fence, array, selector,
6435 compoundIndexedOp(this.op, mapper));
6436 }
6437
6438 void leafApply(int lo, int hi, LongProcedure procedure) {
6439 final DoublePredicate s = selector;
6440 final double[] a = this.array;
6441 final IntAndDoubleToLong f = op;
6442 for (int i = lo; i < hi; ++i) {
6443 double x = a[i];
6444 if (s.op(x))
6445 procedure.op(f.op(i, x));
6446 }
6447 }
6448
6449 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6450 final DoublePredicate s = selector;
6451 final IntAndDoubleToLong f = op;
6452 boolean gotFirst = false;
6453 long r = base;
6454 final double[] a = this.array;
6455 for (int i = lo; i < hi; ++i) {
6456 double t = a[i];
6457 if (s.op(t)) {
6458 long y = f.op(i, t);
6459 if (!gotFirst) {
6460 gotFirst = true;
6461 r = y;
6462 }
6463 else
6464 r = reducer.op(r, y);
6465 }
6466 }
6467 return r;
6468 }
6469 }
6470
6471 static final class LFLCPap extends LLCPap {
6472 final LongPredicate selector;
6473 LFLCPap(ForkJoinPool ex, int origin, int fence,
6474 long[] array, LongPredicate selector,
6475 IntAndLongToLong op) {
6476 super(ex, origin, fence, array, op);
6477 this.selector = selector;
6478 }
6479
6480 boolean hasFilter() { return true; }
6481 boolean isSelected(int i) { return selector.op(this.array[i]); }
6482
6483 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
6484 return new LFDCPap(ex, origin, fence, array, selector,
6485 compoundIndexedOp(this.op, op));
6486 }
6487
6488 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
6489 return new LFLCPap(ex, origin, fence, array, selector,
6490 compoundIndexedOp(this.op, op));
6491 }
6492
6493 public <U> ParallelLongArrayWithMapping< U> withMapping
6494 (LongToObject<? extends U> op) {
6495 return new LFOCPap<U>(ex, origin, fence, array, selector,
6496 compoundIndexedOp(this.op, op));
6497 }
6498
6499 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
6500 (IntAndLongToObject<? extends V> mapper) {
6501 return new LFOCPap<V>(ex, origin, fence, array, selector,
6502 compoundIndexedOp(this.op, mapper));
6503 }
6504
6505 public ParallelLongArrayWithDoubleMapping withIndexedMapping
6506 (IntAndLongToDouble mapper) {
6507 return new LFDCPap(ex, origin, fence, array, selector,
6508 compoundIndexedOp(this.op, mapper));
6509 }
6510
6511 public ParallelLongArrayWithLongMapping withIndexedMapping
6512 (IntAndLongToLong mapper) {
6513 return new LFLCPap(ex, origin, fence, array, selector,
6514 compoundIndexedOp(this.op, mapper));
6515 }
6516
6517 void leafApply(int lo, int hi, LongProcedure procedure) {
6518 final LongPredicate s = selector;
6519 final long[] a = this.array;
6520 final IntAndLongToLong f = op;
6521 for (int i = lo; i < hi; ++i) {
6522 long x = a[i];
6523 if (s.op(x))
6524 procedure.op(f.op(i, x));
6525 }
6526 }
6527
6528 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6529 final LongPredicate s = selector;
6530 final IntAndLongToLong f = op;
6531 boolean gotFirst = false;
6532 long r = base;
6533 final long[] a = this.array;
6534 for (int i = lo; i < hi; ++i) {
6535 long t = a[i];
6536 if (s.op(t)) {
6537 long y = f.op(i, t);
6538 if (!gotFirst) {
6539 gotFirst = true;
6540 r = y;
6541 }
6542 else
6543 r = reducer.op(r, y);
6544 }
6545 }
6546 return r;
6547 }
6548 }
6549
6550 // long-combined, relational
6551 static final class ORLCPap<T> extends OLCPap<T> {
6552 final IntAndObjectPredicate<? super T> selector;
6553 ORLCPap(ForkJoinPool ex, int origin, int fence,
6554 T[] array, IntAndObjectPredicate<? super T> selector,
6555 IntAndObjectToLong<? super T> op) {
6556 super(ex, origin, fence, array, op);
6557 this.selector = selector;
6558 }
6559
6560 boolean hasFilter() { return true; }
6561 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
6562
6563 public ParallelArrayWithDoubleMapping<T> withMapping(LongToDouble op) {
6564 return new ORDCPap<T>(ex, origin, fence, array, selector,
6565 compoundIndexedOp(this.op, op));
6566 }
6567
6568 public ParallelArrayWithLongMapping<T> withMapping(LongOp op) {
6569 return new ORLCPap<T>(ex, origin, fence, array, selector,
6570 compoundIndexedOp(this.op, op));
6571 }
6572
6573 public <U> ParallelArrayWithMapping<T,U> withMapping
6574 (LongToObject<? extends U> op) {
6575 return new OROCPap<T,U>(ex, origin, fence, array,
6576 selector,
6577 compoundIndexedOp(this.op, op));
6578 }
6579
6580 public <V> ParallelArrayWithMapping<T,V> withIndexedMapping
6581 (IntAndLongToObject<? extends V> mapper) {
6582 return new OROCPap<T,V>(ex, origin, fence, array,
6583 selector,
6584 compoundIndexedOp(this.op, mapper));
6585 }
6586
6587 public ParallelArrayWithDoubleMapping<T> withIndexedMapping
6588 (IntAndLongToDouble mapper) {
6589 return new ORDCPap<T>(ex, origin, fence, array, selector,
6590 compoundIndexedOp(this.op, mapper));
6591 }
6592
6593 public ParallelArrayWithLongMapping<T> withIndexedMapping
6594 (IntAndLongToLong mapper) {
6595 return new ORLCPap<T>(ex, origin, fence, array, selector,
6596 compoundIndexedOp(this.op, mapper));
6597 }
6598
6599 void leafApply(int lo, int hi, LongProcedure procedure) {
6600 final IntAndObjectPredicate s = selector;
6601 final Object[] a = this.array;
6602 final IntAndObjectToLong f = op;
6603 for (int i = lo; i < hi; ++i) {
6604 Object x = a[i];
6605 if (s.op(i, x))
6606 procedure.op(f.op(i, x));
6607 }
6608 }
6609
6610 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6611 final IntAndObjectPredicate s = selector;
6612 final IntAndObjectToLong f = op;
6613 boolean gotFirst = false;
6614 long r = base;
6615 final Object[] a = this.array;
6616 for (int i = lo; i < hi; ++i) {
6617 Object t = a[i];
6618 if (s.op(i, t)) {
6619 long y = f.op(i, t);
6620 if (!gotFirst) {
6621 gotFirst = true;
6622 r = y;
6623 }
6624 else
6625 r = reducer.op(r, y);
6626 }
6627 }
6628 return r;
6629 }
6630
6631 }
6632
6633 static final class DRLCPap extends DLCPap {
6634 final IntAndDoublePredicate selector;
6635 DRLCPap(ForkJoinPool ex, int origin, int fence,
6636 double[] array, IntAndDoublePredicate selector,
6637 IntAndDoubleToLong op) {
6638 super(ex, origin, fence, array, op);
6639 this.selector = selector;
6640 }
6641
6642 boolean hasFilter() { return true; }
6643 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
6644
6645 public ParallelDoubleArrayWithDoubleMapping withMapping
6646 (LongToDouble op) {
6647 return new DRDCPap(ex, origin, fence, array, selector,
6648 compoundIndexedOp(this.op, op));
6649 }
6650
6651 public ParallelDoubleArrayWithLongMapping withMapping(LongOp op) {
6652 return new DRLCPap(ex, origin, fence, array, selector,
6653 compoundIndexedOp(this.op, op));
6654 }
6655
6656 public <U> ParallelDoubleArrayWithMapping< U> withMapping
6657 (LongToObject<? extends U> op) {
6658 return new DROCPap<U>(ex, origin, fence, array, selector,
6659 compoundIndexedOp(this.op, op));
6660 }
6661
6662 public <V> ParallelDoubleArrayWithMapping<V> withIndexedMapping
6663 (IntAndLongToObject<? extends V> mapper) {
6664 return new DROCPap<V>(ex, origin, fence, array, selector,
6665 compoundIndexedOp(this.op, mapper));
6666 }
6667
6668 public ParallelDoubleArrayWithDoubleMapping withIndexedMapping
6669 (IntAndLongToDouble mapper) {
6670 return new DRDCPap(ex, origin, fence, array, selector,
6671 compoundIndexedOp(this.op, mapper));
6672 }
6673
6674 public ParallelDoubleArrayWithLongMapping withIndexedMapping
6675 (IntAndLongToLong mapper) {
6676 return new DRLCPap(ex, origin, fence, array, selector,
6677 compoundIndexedOp(this.op, mapper));
6678 }
6679
6680 void leafApply(int lo, int hi, LongProcedure procedure) {
6681 final IntAndDoublePredicate s = selector;
6682 final double[] a = this.array;
6683 final IntAndDoubleToLong f = op;
6684 for (int i = lo; i < hi; ++i) {
6685 double x = a[i];
6686 if (s.op(i, x))
6687 procedure.op(f.op(i, x));
6688 }
6689 }
6690
6691 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6692 final IntAndDoublePredicate s = selector;
6693 final IntAndDoubleToLong f = op;
6694 boolean gotFirst = false;
6695 long r = base;
6696 final double[] a = this.array;
6697 for (int i = lo; i < hi; ++i) {
6698 double t = a[i];
6699 if (s.op(i, t)) {
6700 long y = f.op(i, t);
6701 if (!gotFirst) {
6702 gotFirst = true;
6703 r = y;
6704 }
6705 else
6706 r = reducer.op(r, y);
6707 }
6708 }
6709 return r;
6710 }
6711 }
6712
6713 static final class LRLCPap extends LLCPap {
6714 final IntAndLongPredicate selector;
6715 LRLCPap(ForkJoinPool ex, int origin, int fence,
6716 long[] array, IntAndLongPredicate selector,
6717 IntAndLongToLong op) {
6718 super(ex, origin, fence, array, op);
6719 this.selector = selector;
6720 }
6721
6722 boolean hasFilter() { return true; }
6723 boolean isSelected(int i) { return selector.op(i, this.array[i]); }
6724
6725 public ParallelLongArrayWithDoubleMapping withMapping(LongToDouble op) {
6726 return new LRDCPap(ex, origin, fence, array, selector,
6727 compoundIndexedOp(this.op, op));
6728 }
6729
6730 public ParallelLongArrayWithLongMapping withMapping(LongOp op) {
6731 return new LRLCPap(ex, origin, fence, array, selector,
6732 compoundIndexedOp(this.op, op));
6733 }
6734
6735 public <U> ParallelLongArrayWithMapping< U> withMapping
6736 (LongToObject<? extends U> op) {
6737 return new LROCPap<U>(ex, origin, fence, array, selector,
6738 compoundIndexedOp(this.op, op));
6739 }
6740
6741 public <V> ParallelLongArrayWithMapping<V> withIndexedMapping
6742 (IntAndLongToObject<? extends V> mapper) {
6743 return new LROCPap<V>(ex, origin, fence, array, selector,
6744 compoundIndexedOp(this.op, mapper));
6745 }
6746
6747 public ParallelLongArrayWithDoubleMapping withIndexedMapping
6748 (IntAndLongToDouble mapper) {
6749 return new LRDCPap(ex, origin, fence, array, selector,
6750 compoundIndexedOp(this.op, mapper));
6751 }
6752
6753 public ParallelLongArrayWithLongMapping withIndexedMapping
6754 (IntAndLongToLong mapper) {
6755 return new LRLCPap(ex, origin, fence, array, selector,
6756 compoundIndexedOp(this.op, mapper));
6757 }
6758
6759 void leafApply(int lo, int hi, LongProcedure procedure) {
6760 final IntAndLongPredicate s = selector;
6761 final long[] a = this.array;
6762 final IntAndLongToLong f = op;
6763 for (int i = lo; i < hi; ++i) {
6764 long x = a[i];
6765 if (s.op(i, x))
6766 procedure.op(f.op(i, x));
6767 }
6768 }
6769
6770 long leafReduce(int lo, int hi, LongReducer reducer, long base) {
6771 final IntAndLongPredicate s = selector;
6772 final IntAndLongToLong f = op;
6773 boolean gotFirst = false;
6774 long r = base;
6775 final long[] a = this.array;
6776 for (int i = lo; i < hi; ++i) {
6777 long t = a[i];
6778 if (s.op(i, t)) {
6779 long y = f.op(i, t);
6780 if (!gotFirst) {
6781 gotFirst = true;
6782 r = y;
6783 }
6784 else
6785 r = reducer.op(r, y);
6786 }
6787 }
6788 return r;
6789 }
6790 }
6791
6792 /*
6793 * Iterator support
6794 */
6795
6796 class SequentiallyAsDouble implements Iterable<Double> {
6797 public Iterator<Double> iterator() {
6798 if (hasFilter())
6799 return new FilteredAsDoubleIterator();
6800 else
6801 return new UnfilteredAsDoubleIterator();
6802 }
6803 }
6804
6805 class UnfilteredAsDoubleIterator implements Iterator<Double> {
6806 int cursor = origin;
6807 public boolean hasNext() { return cursor < fence; }
6808 public Double next() {
6809 if (cursor >= fence)
6810 throw new NoSuchElementException();
6811 return Double.valueOf(dget(cursor++));
6812 }
6813 public void remove() {
6814 throw new UnsupportedOperationException();
6815 }
6816 }
6817
6818 class FilteredAsDoubleIterator implements Iterator<Double> {
6819 double next;
6820 int cursor;
6821 FilteredAsDoubleIterator() {
6822 cursor = origin;
6823 advance();
6824 }
6825 private void advance() {
6826 while (cursor < fence) {
6827 if (isSelected(cursor)) {
6828 next = dget(cursor);
6829 break;
6830 }
6831 cursor++;
6832 }
6833 }
6834
6835 public boolean hasNext() { return cursor < fence; }
6836 public Double next() {
6837 if (cursor >= fence)
6838 throw new NoSuchElementException();
6839 Double x = Double.valueOf(next);
6840 cursor++;
6841 advance();
6842 return x;
6843 }
6844 public void remove() {
6845 throw new UnsupportedOperationException();
6846 }
6847 }
6848
6849 class SequentiallyAsLong implements Iterable<Long> {
6850 public Iterator<Long> iterator() {
6851 if (hasFilter())
6852 return new FilteredAsLongIterator();
6853 else
6854 return new UnfilteredAsLongIterator();
6855 }
6856 }
6857
6858 class UnfilteredAsLongIterator implements Iterator<Long> {
6859 int cursor = origin;
6860 public boolean hasNext() { return cursor < fence; }
6861 public Long next() {
6862 if (cursor >= fence)
6863 throw new NoSuchElementException();
6864 return Long.valueOf(lget(cursor++));
6865 }
6866 public void remove() {
6867 throw new UnsupportedOperationException();
6868 }
6869 }
6870
6871 class FilteredAsLongIterator implements Iterator<Long> {
6872 long next;
6873 int cursor;
6874 FilteredAsLongIterator() {
6875 cursor = origin;
6876 advance();
6877 }
6878 private void advance() {
6879 while (cursor < fence) {
6880 if (isSelected(cursor)) {
6881 next = lget(cursor);
6882 break;
6883 }
6884 cursor++;
6885 }
6886 }
6887
6888 public boolean hasNext() { return cursor < fence; }
6889 public Long next() {
6890 if (cursor >= fence)
6891 throw new NoSuchElementException();
6892 Long x = Long.valueOf(next);
6893 cursor++;
6894 advance();
6895 return x;
6896 }
6897 public void remove() {
6898 throw new UnsupportedOperationException();
6899 }
6900 }
6901
6902 class Sequentially<U> implements Iterable<U> {
6903 public Iterator<U> iterator() {
6904 if (hasFilter())
6905 return new FilteredIterator<U>();
6906 else
6907 return new UnfilteredIterator<U>();
6908 }
6909 }
6910
6911 class UnfilteredIterator<U> implements Iterator<U> {
6912 int cursor = origin;
6913 public boolean hasNext() { return cursor < fence; }
6914 public U next() {
6915 if (cursor >= fence)
6916 throw new NoSuchElementException();
6917 return (U)oget(cursor++);
6918 }
6919 public void remove() {
6920 throw new UnsupportedOperationException();
6921 }
6922 }
6923
6924 class FilteredIterator<U> implements Iterator<U> {
6925 Object next;
6926 int cursor;
6927 FilteredIterator() {
6928 cursor = origin;
6929 advance();
6930 }
6931 private void advance() {
6932 while (cursor < fence) {
6933 if (isSelected(cursor)) {
6934 next = oget(cursor);
6935 break;
6936 }
6937 cursor++;
6938 }
6939 }
6940
6941 public boolean hasNext() { return cursor < fence; }
6942 public U next() {
6943 if (cursor >= fence)
6944 throw new NoSuchElementException();
6945 U x = (U)next;
6946 cursor++;
6947 advance();
6948 return x;
6949 }
6950 public void remove() {
6951 throw new UnsupportedOperationException();
6952 }
6953 }
6954
6955 // Zillions of little classes to support binary ops
6956 // ToDo: specialize to flatten dispatch
6957
6958 static <T,U,V,W> IntAndObjectToObject<T,V> indexedMapper
6959 (final BinaryOp<? super T, ? super U, ? extends V> combiner,
6960 final ParallelArrayWithMapping<W,U> u, final int origin) {
6961 return new IntAndObjectToObject<T,V>() {
6962 final int offset = u.origin - origin;
6963 public V op(int i, T a) { return combiner.op(a, (U)(u.oget(i+offset))); }
6964 };
6965 }
6966
6967 static <T,U,W> IntAndObjectToDouble<T> indexedMapper
6968 (final ObjectAndObjectToDouble<? super T, ? super U> combiner,
6969 final ParallelArrayWithMapping<W,U> u, final int origin) {
6970 return new IntAndObjectToDouble<T>() {
6971 final int offset = u.origin - origin;
6972 public double op(int i, T a) { return combiner.op(a, (U)(u.oget(i+offset))); }
6973 };
6974 }
6975
6976 static <T,U,W> IntAndObjectToLong<T> indexedMapper
6977 (final ObjectAndObjectToLong<? super T, ? super U> combiner,
6978 final ParallelArrayWithMapping<W,U> u, final int origin) {
6979 return new IntAndObjectToLong<T>() {
6980 final int offset = u.origin - origin;
6981 public long op(int i, T a) { return combiner.op(a, (U)(u.oget(i+offset))); }
6982 };
6983 }
6984
6985 static <T,V> IntAndObjectToObject<T,V> indexedMapper
6986 (final ObjectAndDoubleToObject<? super T, ? extends V> combiner,
6987 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
6988 return new IntAndObjectToObject<T,V>() {
6989 final int offset = u.origin - origin;
6990 public V op(int i, T a) { return combiner.op(a, u.dget(i+offset)); }
6991 };
6992 }
6993
6994 static <T> IntAndObjectToDouble<T> indexedMapper
6995 (final ObjectAndDoubleToDouble<? super T> combiner,
6996 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
6997 return new IntAndObjectToDouble<T>() {
6998 final int offset = u.origin - origin;
6999 public double op(int i, T a) { return combiner.op(a, u.dget(i+offset)); }
7000 };
7001 }
7002
7003 static <T,U> IntAndObjectToLong<T> indexedMapper
7004 (final ObjectAndDoubleToLong<? super T> combiner,
7005 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7006 return new IntAndObjectToLong<T>() {
7007 final int offset = u.origin - origin;
7008 public long op(int i, T a) { return combiner.op(a, u.dget(i+offset)); }
7009 };
7010 }
7011
7012 static <T,V> IntAndObjectToObject<T,V> indexedMapper
7013 (final ObjectAndLongToObject<? super T, ? extends V> combiner,
7014 final ParallelLongArrayWithLongMapping u, final int origin) {
7015 return new IntAndObjectToObject<T,V>() {
7016 final int offset = u.origin - origin;
7017 public V op(int i, T a) { return combiner.op(a, u.lget(i+offset)); }
7018 };
7019 }
7020
7021 static <T> IntAndObjectToDouble<T> indexedMapper
7022 (final ObjectAndLongToDouble<? super T> combiner,
7023 final ParallelLongArrayWithLongMapping u, final int origin) {
7024 return new IntAndObjectToDouble<T>() {
7025 final int offset = u.origin - origin;
7026 public double op(int i, T a) { return combiner.op(a, u.lget(i+offset)); }
7027 };
7028 }
7029
7030 static <T> IntAndObjectToLong<T> indexedMapper
7031 (final ObjectAndLongToLong<? super T> combiner,
7032 final ParallelLongArrayWithLongMapping u, final int origin) {
7033 return new IntAndObjectToLong<T>() {
7034 final int offset = u.origin - origin;
7035 public long op(int i, T a) { return combiner.op(a, u.lget(i+offset)); }
7036 };
7037 }
7038
7039 static <U,V,W> IntAndDoubleToObject<V> indexedMapper
7040 (final DoubleAndObjectToObject<? super U, ? extends V> combiner,
7041 final ParallelArrayWithMapping<W,U> u, final int origin) {
7042 return new IntAndDoubleToObject<V>() {
7043 final int offset = u.origin - origin;
7044 public V op(int i, double a) { return combiner.op(a, (U)(u.oget(i+offset))); }
7045 };
7046 }
7047
7048 static <U,W> IntAndDoubleToDouble indexedMapper
7049 (final DoubleAndObjectToDouble<? super U> combiner,
7050 final ParallelArrayWithMapping<W,U> u, final int origin) {
7051 return new IntAndDoubleToDouble() {
7052 final int offset = u.origin - origin;
7053 public double op(int i, double a) { return combiner.op(a, (U)(u.oget(i+offset))); }
7054 };
7055 }
7056
7057 static <U,W> IntAndDoubleToLong indexedMapper
7058 (final DoubleAndObjectToLong<? super U> combiner,
7059 final ParallelArrayWithMapping<W,U> u, final int origin) {
7060 return new IntAndDoubleToLong() {
7061 final int offset = u.origin - origin;
7062 public long op(int i, double a) { return combiner.op(a, (U)(u.oget(i+offset))); }
7063 };
7064 }
7065
7066 static <V> IntAndDoubleToObject<V> indexedMapper
7067 (final DoubleAndDoubleToObject<? extends V> combiner,
7068 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7069 return new IntAndDoubleToObject<V>() {
7070 final int offset = u.origin - origin;
7071 public V op(int i, double a) { return combiner.op(a, u.dget(i+offset)); }
7072 };
7073 }
7074
7075 static IntAndDoubleToDouble indexedMapper
7076 (final BinaryDoubleOp combiner,
7077 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7078 return new IntAndDoubleToDouble() {
7079 final int offset = u.origin - origin;
7080 public double op(int i, double a) { return combiner.op(a, u.dget(i+offset)); }
7081 };
7082 }
7083
7084 static IntAndDoubleToLong indexedMapper
7085 (final DoubleAndDoubleToLong combiner,
7086 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7087 return new IntAndDoubleToLong() {
7088 final int offset = u.origin - origin;
7089 public long op(int i, double a) { return combiner.op(a, u.dget(i+offset)); }
7090 };
7091 }
7092
7093 static <V> IntAndDoubleToObject<V> indexedMapper
7094 (final DoubleAndLongToObject<? extends V> combiner,
7095 final ParallelLongArrayWithLongMapping u, final int origin) {
7096 return new IntAndDoubleToObject<V>() {
7097 final int offset = u.origin - origin;
7098 public V op(int i, double a) { return combiner.op(a, u.lget(i+offset)); }
7099 };
7100 }
7101
7102 static IntAndDoubleToDouble indexedMapper
7103 (final DoubleAndLongToDouble combiner,
7104 final ParallelLongArrayWithLongMapping u, final int origin) {
7105 return new IntAndDoubleToDouble() {
7106 final int offset = u.origin - origin;
7107 public double op(int i, double a) { return combiner.op(a, u.lget(i+offset)); }
7108 };
7109 }
7110
7111 static IntAndDoubleToLong indexedMapper
7112 (final DoubleAndLongToLong combiner,
7113 final ParallelLongArrayWithLongMapping u, final int origin) {
7114 return new IntAndDoubleToLong() {
7115 final int offset = u.origin - origin;
7116 public long op(int i, double a) { return combiner.op(a, u.lget(i+offset)); }
7117 };
7118 }
7119
7120 static <U,V,W> IntAndLongToObject<V> indexedMapper
7121 (final LongAndObjectToObject<? super U, ? extends V> combiner,
7122 final ParallelArrayWithMapping<W,U> u, final int origin) {
7123 return new IntAndLongToObject<V>() {
7124 final int offset = u.origin - origin;
7125 public V op(int i, long a) { return combiner.op(a, (U)(u.oget(i+offset))); }
7126 };
7127 }
7128
7129 static <U,W> IntAndLongToDouble indexedMapper
7130 (final LongAndObjectToDouble<? super U> combiner,
7131 final ParallelArrayWithMapping<W,U> u, final int origin) {
7132 return new IntAndLongToDouble() {
7133 final int offset = u.origin - origin;
7134 public double op(int i, long a) { return combiner.op(a, (U)(u.oget(i+offset))); }
7135 };
7136 }
7137
7138 static <U,W> IntAndLongToLong indexedMapper
7139 (final LongAndObjectToLong<? super U> combiner,
7140 final ParallelArrayWithMapping<W,U> u, final int origin) {
7141 return new IntAndLongToLong() {
7142 final int offset = u.origin - origin;
7143 public long op(int i, long a) { return combiner.op(a, (U)(u.oget(i+offset))); }
7144 };
7145 }
7146
7147 static <V> IntAndLongToObject<V> indexedMapper
7148 (final LongAndDoubleToObject<? extends V> combiner,
7149 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7150 return new IntAndLongToObject<V>() {
7151 final int offset = u.origin - origin;
7152 public V op(int i, long a) { return combiner.op(a, u.dget(i+offset)); }
7153 };
7154 }
7155
7156 static IntAndLongToDouble indexedMapper
7157 (final LongAndDoubleToDouble combiner,
7158 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7159 return new IntAndLongToDouble() {
7160 final int offset = u.origin - origin;
7161 public double op(int i, long a) { return combiner.op(a, u.dget(i+offset)); }
7162 };
7163 }
7164
7165 static IntAndLongToLong indexedMapper
7166 (final LongAndDoubleToLong combiner,
7167 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7168 return new IntAndLongToLong() {
7169 final int offset = u.origin - origin;
7170 public long op(int i, long a) { return combiner.op(a, u.dget(i+offset)); }
7171 };
7172 }
7173
7174 static <V> IntAndLongToObject<V> indexedMapper
7175 (final LongAndLongToObject<? extends V> combiner,
7176 final ParallelLongArrayWithLongMapping u, final int origin) {
7177 return new IntAndLongToObject<V>() {
7178 final int offset = u.origin - origin;
7179 public V op(int i, long a) { return combiner.op(a, u.lget(i+offset)); }
7180 };
7181 }
7182
7183 static IntAndLongToDouble indexedMapper
7184 (final LongAndLongToDouble combiner,
7185 final ParallelLongArrayWithLongMapping u, final int origin) {
7186 return new IntAndLongToDouble() {
7187 final int offset = u.origin - origin;
7188 public double op(int i, long a) { return combiner.op(a, u.lget(i+offset)); }
7189 };
7190 }
7191
7192 static IntAndLongToLong indexedMapper
7193 (final BinaryLongOp combiner,
7194 final ParallelLongArrayWithLongMapping u, final int origin) {
7195 return new IntAndLongToLong() {
7196 final int offset = u.origin - origin;
7197 public long op(int i, long a) { return combiner.op(a, u.lget(i+offset)); }
7198 };
7199 }
7200
7201 static <T,U,V> IntAndObjectToObject<T,V> compoundIndexedOp
7202 (final IntAndObjectToObject<? super T, ? extends U> fst,
7203 final IntAndObjectToObject<? super U, ? extends V> snd) {
7204 return new IntAndObjectToObject<T,V>() {
7205 public V op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7206 };
7207 }
7208
7209 static <T,U> IntAndObjectToDouble<T> compoundIndexedOp
7210 (final IntAndObjectToObject<? super T, ? extends U> fst,
7211 final IntAndObjectToDouble<? super U> snd) {
7212 return new IntAndObjectToDouble<T>() {
7213 public double op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7214 };
7215 }
7216
7217 static <T,U> IntAndObjectToLong<T> compoundIndexedOp
7218 (final IntAndObjectToObject<? super T, ? extends U> fst,
7219 final IntAndObjectToLong<? super U> snd) {
7220 return new IntAndObjectToLong<T>() {
7221 public long op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7222 };
7223 }
7224
7225 static <U,V> IntAndDoubleToObject<V> compoundIndexedOp
7226 (final IntAndDoubleToObject<? extends U> fst,
7227 final IntAndObjectToObject<? super U, ? extends V> snd) {
7228 return new IntAndDoubleToObject<V>() {
7229 public V op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7230 };
7231 }
7232
7233 static <U> IntAndDoubleToDouble compoundIndexedOp
7234 (final IntAndDoubleToObject<? extends U> fst,
7235 final IntAndObjectToDouble<? super U> snd) {
7236 return new IntAndDoubleToDouble() {
7237 public double op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7238 };
7239 }
7240
7241 static <U> IntAndDoubleToLong compoundIndexedOp
7242 (final IntAndDoubleToObject<? extends U> fst,
7243 final IntAndObjectToLong<? super U> snd) {
7244 return new IntAndDoubleToLong() {
7245 public long op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7246 };
7247 }
7248
7249 static <U,V> IntAndLongToObject<V> compoundIndexedOp
7250 (final IntAndLongToObject<? extends U> fst,
7251 final IntAndObjectToObject<? super U, ? extends V> snd) {
7252 return new IntAndLongToObject<V>() {
7253 public V op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7254 };
7255 }
7256
7257 static <U> IntAndLongToDouble compoundIndexedOp
7258 (final IntAndLongToObject<? extends U> fst,
7259 final IntAndObjectToDouble<? super U> snd) {
7260 return new IntAndLongToDouble() {
7261 public double op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7262 };
7263 }
7264
7265 static <U> IntAndLongToLong compoundIndexedOp
7266 (final IntAndLongToObject<? extends U> fst,
7267 final IntAndObjectToLong<? super U> snd) {
7268 return new IntAndLongToLong() {
7269 public long op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7270 };
7271 }
7272
7273 static <T,V> IntAndObjectToObject<T,V> compoundIndexedOp
7274 (final IntAndObjectToDouble<? super T> fst,
7275 final IntAndDoubleToObject<? extends V> snd) {
7276 return new IntAndObjectToObject<T,V>() {
7277 public V op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7278 };
7279 }
7280
7281 static <T> IntAndObjectToDouble<T> compoundIndexedOp
7282 (final IntAndObjectToDouble<? super T> fst,
7283 final IntAndDoubleToDouble snd) {
7284 return new IntAndObjectToDouble<T>() {
7285 public double op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7286 };
7287 }
7288
7289 static <T> IntAndObjectToLong<T> compoundIndexedOp
7290 (final IntAndObjectToLong<? super T> fst,
7291 final IntAndLongToLong snd) {
7292 return new IntAndObjectToLong<T>() {
7293 public long op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7294 };
7295 }
7296
7297 static <V> IntAndDoubleToObject<V> compoundIndexedOp
7298 (final IntAndDoubleToLong fst,
7299 final IntAndLongToObject<? extends V> snd) {
7300 return new IntAndDoubleToObject<V>() {
7301 public V op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7302 };
7303 }
7304
7305 static IntAndDoubleToDouble compoundIndexedOp
7306 (final IntAndDoubleToDouble fst,
7307 final IntAndDoubleToDouble snd) {
7308 return new IntAndDoubleToDouble() {
7309 public double op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7310 };
7311 }
7312
7313 static IntAndDoubleToLong compoundIndexedOp
7314 (final IntAndDoubleToDouble fst,
7315 final IntAndDoubleToLong snd) {
7316 return new IntAndDoubleToLong() {
7317 public long op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7318 };
7319 }
7320
7321 static <V> IntAndLongToObject<V> compoundIndexedOp
7322 (final IntAndLongToDouble fst,
7323 final IntAndDoubleToObject<? extends V> snd) {
7324 return new IntAndLongToObject<V>() {
7325 public V op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7326 };
7327 }
7328
7329 static IntAndLongToDouble compoundIndexedOp
7330 (final IntAndLongToDouble fst,
7331 final IntAndDoubleToDouble snd) {
7332 return new IntAndLongToDouble() {
7333 public double op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7334 };
7335 }
7336
7337 static IntAndLongToLong compoundIndexedOp
7338 (final IntAndLongToDouble fst,
7339 final IntAndDoubleToLong snd) {
7340 return new IntAndLongToLong() {
7341 public long op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7342 };
7343 }
7344
7345 static <T,V> IntAndObjectToObject<T,V> compoundIndexedOp
7346 (final IntAndObjectToLong<? super T> fst,
7347 final IntAndLongToObject<? extends V> snd) {
7348 return new IntAndObjectToObject<T,V>() {
7349 public V op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7350 };
7351 }
7352
7353 static <T> IntAndObjectToDouble<T> compoundIndexedOp
7354 (final IntAndObjectToLong<? super T> fst,
7355 final IntAndLongToDouble snd) {
7356 return new IntAndObjectToDouble<T>() {
7357 public double op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7358 };
7359 }
7360
7361 static <T> IntAndObjectToLong<T> compoundIndexedOp
7362 (final IntAndObjectToDouble<? super T> fst,
7363 final IntAndDoubleToLong snd) {
7364 return new IntAndObjectToLong<T>() {
7365 public long op(int i, T a) { return snd.op(i, fst.op(i, a)); }
7366 };
7367 }
7368
7369 static <V> IntAndDoubleToObject<V> compoundIndexedOp
7370 (final IntAndDoubleToDouble fst,
7371 final IntAndDoubleToObject<? extends V> snd) {
7372 return new IntAndDoubleToObject<V>() {
7373 public V op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7374 };
7375 }
7376
7377 static IntAndDoubleToDouble compoundIndexedOp
7378 (final IntAndDoubleToLong fst,
7379 final IntAndLongToDouble snd) {
7380 return new IntAndDoubleToDouble() {
7381 public double op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7382 };
7383 }
7384
7385 static IntAndDoubleToLong compoundIndexedOp
7386 (final IntAndDoubleToLong fst,
7387 final IntAndLongToLong snd) {
7388 return new IntAndDoubleToLong() {
7389 public long op(int i, double a) { return snd.op(i, fst.op(i, a)); }
7390 };
7391 }
7392
7393 static <V> IntAndLongToObject<V> compoundIndexedOp
7394 (final IntAndLongToLong fst,
7395 final IntAndLongToObject<? extends V> snd) {
7396 return new IntAndLongToObject<V>() {
7397 public V op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7398 };
7399 }
7400
7401 static IntAndLongToDouble compoundIndexedOp
7402 (final IntAndLongToLong fst,
7403 final IntAndLongToDouble snd) {
7404 return new IntAndLongToDouble() {
7405 public double op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7406 };
7407 }
7408
7409 static IntAndLongToLong compoundIndexedOp
7410 (final IntAndLongToLong fst,
7411 final IntAndLongToLong snd) {
7412 return new IntAndLongToLong() {
7413 public long op(int i, long a) { return snd.op(i, fst.op(i, a)); }
7414 };
7415 }
7416
7417 static <T,U,V> IntAndObjectToObject<T,V> compoundIndexedOp
7418 (final IntAndObjectToObject<? super T, ? extends U> fst,
7419 final Op<? super U, ? extends V> snd) {
7420 return new IntAndObjectToObject<T,V>() {
7421 public V op(int i, T a) { return snd.op(fst.op(i, a)); }
7422 };
7423 }
7424
7425 static <T,U> IntAndObjectToDouble<T> compoundIndexedOp
7426 (final IntAndObjectToObject<? super T, ? extends U> fst,
7427 final ObjectToDouble<? super U> snd) {
7428 return new IntAndObjectToDouble<T>() {
7429 public double op(int i, T a) { return snd.op(fst.op(i, a)); }
7430 };
7431 }
7432
7433 static <T,U> IntAndObjectToLong<T> compoundIndexedOp
7434 (final IntAndObjectToObject<? super T, ? extends U> fst,
7435 final ObjectToLong<? super U> snd) {
7436 return new IntAndObjectToLong<T>() {
7437 public long op(int i, T a) { return snd.op(fst.op(i, a)); }
7438 };
7439 }
7440
7441 static <U,V> IntAndDoubleToObject<V> compoundIndexedOp
7442 (final IntAndDoubleToObject<? extends U> fst,
7443 final Op<? super U, ? extends V> snd) {
7444 return new IntAndDoubleToObject<V>() {
7445 public V op(int i, double a) { return snd.op(fst.op(i, a)); }
7446 };
7447 }
7448
7449 static <U> IntAndDoubleToDouble compoundIndexedOp
7450 (final IntAndDoubleToObject<? extends U> fst,
7451 final ObjectToDouble<? super U> snd) {
7452 return new IntAndDoubleToDouble() {
7453 public double op(int i, double a) { return snd.op(fst.op(i, a)); }
7454 };
7455 }
7456
7457 static <U> IntAndDoubleToLong compoundIndexedOp
7458 (final IntAndDoubleToObject<? extends U> fst,
7459 final ObjectToLong<? super U> snd) {
7460 return new IntAndDoubleToLong() {
7461 public long op(int i, double a) { return snd.op(fst.op(i, a)); }
7462 };
7463 }
7464
7465 static <U,V> IntAndLongToObject<V> compoundIndexedOp
7466 (final IntAndLongToObject<? extends U> fst,
7467 final Op<? super U, ? extends V> snd) {
7468 return new IntAndLongToObject<V>() {
7469 public V op(int i, long a) { return snd.op(fst.op(i, a)); }
7470 };
7471 }
7472
7473 static <U> IntAndLongToDouble compoundIndexedOp
7474 (final IntAndLongToObject<? extends U> fst,
7475 final ObjectToDouble<? super U> snd) {
7476 return new IntAndLongToDouble() {
7477 public double op(int i, long a) { return snd.op(fst.op(i, a)); }
7478 };
7479 }
7480
7481 static <U> IntAndLongToLong compoundIndexedOp
7482 (final IntAndLongToObject<? extends U> fst,
7483 final ObjectToLong<? super U> snd) {
7484 return new IntAndLongToLong() {
7485 public long op(int i, long a) { return snd.op(fst.op(i, a)); }
7486 };
7487 }
7488
7489 static <T,V> IntAndObjectToObject<T,V> compoundIndexedOp
7490 (final IntAndObjectToDouble<? super T> fst,
7491 final DoubleToObject<? extends V> snd) {
7492 return new IntAndObjectToObject<T,V>() {
7493 public V op(int i, T a) { return snd.op(fst.op(i, a)); }
7494 };
7495 }
7496
7497 static <T> IntAndObjectToDouble<T> compoundIndexedOp
7498 (final IntAndObjectToDouble<? super T> fst, final DoubleOp snd) {
7499 return new IntAndObjectToDouble<T>() {
7500 public double op(int i, T a) { return snd.op(fst.op(i, a)); }
7501 };
7502 }
7503
7504 static <T> IntAndObjectToLong<T> compoundIndexedOp
7505 (final IntAndObjectToDouble<? super T> fst, final DoubleToLong snd) {
7506 return new IntAndObjectToLong<T>() {
7507 public long op(int i, T a) { return snd.op(fst.op(i, a)); }
7508 };
7509 }
7510
7511 static <V> IntAndDoubleToObject<V> compoundIndexedOp
7512 (final IntAndDoubleToDouble fst,
7513 final DoubleToObject<? extends V> snd) {
7514 return new IntAndDoubleToObject<V>() {
7515 public V op(int i, double a) { return snd.op(fst.op(i, a)); }
7516 };
7517 }
7518
7519 static IntAndDoubleToDouble compoundIndexedOp
7520 (final IntAndDoubleToDouble fst, final DoubleOp snd) {
7521 return new IntAndDoubleToDouble() {
7522 public double op(int i, double a) { return snd.op(fst.op(i, a)); }
7523 };
7524 }
7525
7526 static IntAndDoubleToLong compoundIndexedOp
7527 (final IntAndDoubleToDouble fst, final DoubleToLong snd) {
7528 return new IntAndDoubleToLong() {
7529 public long op(int i, double a) { return snd.op(fst.op(i, a)); }
7530 };
7531 }
7532
7533 static <V> IntAndLongToObject<V> compoundIndexedOp
7534 (final IntAndLongToDouble fst, final DoubleToObject<? extends V> snd) {
7535 return new IntAndLongToObject<V>() {
7536 public V op(int i, long a) { return snd.op(fst.op(i, a)); }
7537 };
7538 }
7539
7540 static IntAndLongToDouble compoundIndexedOp
7541 (final IntAndLongToDouble fst, final DoubleOp snd) {
7542 return new IntAndLongToDouble() {
7543 public double op(int i,long a) { return snd.op(fst.op(i, a)); }
7544 };
7545 }
7546
7547 static IntAndLongToLong compoundIndexedOp
7548 (final IntAndLongToDouble fst, final DoubleToLong snd) {
7549 return new IntAndLongToLong() {
7550 public long op(int i, long a) { return snd.op(fst.op(i, a)); }
7551 };
7552 }
7553
7554 static <T,V> IntAndObjectToObject<T,V> compoundIndexedOp
7555 (final IntAndObjectToLong<? super T> fst,
7556 final LongToObject<? extends V> snd) {
7557 return new IntAndObjectToObject<T,V>() {
7558 public V op(int i, T a) { return snd.op(fst.op(i, a)); }
7559 };
7560 }
7561
7562 static <T> IntAndObjectToDouble<T> compoundIndexedOp
7563 (final IntAndObjectToLong<? super T> fst, final LongToDouble snd) {
7564 return new IntAndObjectToDouble<T>() {
7565 public double op(int i, T a) { return snd.op(fst.op(i, a)); }
7566 };
7567 }
7568
7569 static <T> IntAndObjectToLong<T> compoundIndexedOp
7570 (final IntAndObjectToLong<? super T> fst, final LongOp snd) {
7571 return new IntAndObjectToLong<T>() {
7572 public long op(int i, T a) { return snd.op(fst.op(i, a)); }
7573 };
7574 }
7575
7576 static <V> IntAndDoubleToObject<V> compoundIndexedOp
7577 (final IntAndDoubleToLong fst, final LongToObject<? extends V> snd) {
7578 return new IntAndDoubleToObject<V>() {
7579 public V op(int i, double a) { return snd.op(fst.op(i, a)); }
7580 };
7581 }
7582
7583 static IntAndDoubleToDouble compoundIndexedOp
7584 (final IntAndDoubleToLong fst, final LongToDouble snd) {
7585 return new IntAndDoubleToDouble() {
7586 public double op(int i, double a) { return snd.op(fst.op(i, a)); }
7587 };
7588 }
7589
7590 static IntAndDoubleToLong compoundIndexedOp
7591 (final IntAndDoubleToLong fst, final LongOp snd) {
7592 return new IntAndDoubleToLong() {
7593 public long op(int i, double a) { return snd.op(fst.op(i, a)); }
7594 };
7595 }
7596
7597 static <V> IntAndLongToObject<V> compoundIndexedOp
7598 (final IntAndLongToLong fst, final LongToObject<? extends V> snd) {
7599 return new IntAndLongToObject<V>() {
7600 public V op(int i, long a) { return snd.op(fst.op(i, a)); }
7601 };
7602 }
7603
7604 static IntAndLongToDouble compoundIndexedOp
7605 (final IntAndLongToLong fst, final LongToDouble snd) {
7606 return new IntAndLongToDouble() {
7607 public double op(int i,long a) { return snd.op(fst.op(i, a)); }
7608 };
7609 }
7610
7611 static IntAndLongToLong compoundIndexedOp
7612 (final IntAndLongToLong fst,
7613 final LongOp snd) {
7614 return new IntAndLongToLong() {
7615 public long op(int i, long a) { return snd.op(fst.op(i, a)); }
7616 };
7617 }
7618
7619 static <T,U,V> IntAndObjectToObject<T,V> compoundIndexedOp
7620 (final Op<? super T, ? extends U> fst,
7621 final IntAndObjectToObject<? super U, ? extends V> snd) {
7622 return new IntAndObjectToObject<T,V>() {
7623 public V op(int i, T a) { return snd.op(i, fst.op(a)); }
7624 };
7625 }
7626
7627 static <T,U> IntAndObjectToDouble<T> compoundIndexedOp
7628 (final Op<? super T, ? extends U> fst,
7629 final IntAndObjectToDouble<? super U> snd) {
7630 return new IntAndObjectToDouble<T>() {
7631 public double op(int i, T a) { return snd.op(i, fst.op(a)); }
7632 };
7633 }
7634
7635 static <T,U> IntAndObjectToLong<T> compoundIndexedOp
7636 (final Op<? super T, ? extends U> fst,
7637 final IntAndObjectToLong<? super U> snd) {
7638 return new IntAndObjectToLong<T>() {
7639 public long op(int i, T a) { return snd.op(i, fst.op(a)); }
7640 };
7641 }
7642
7643 static <U,V> IntAndDoubleToObject<V> compoundIndexedOp
7644 (final DoubleToObject<? extends U> fst,
7645 final IntAndObjectToObject<? super U, ? extends V> snd) {
7646 return new IntAndDoubleToObject<V>() {
7647 public V op(int i, double a) { return snd.op(i, fst.op(a)); }
7648 };
7649 }
7650
7651 static <U> IntAndDoubleToDouble compoundIndexedOp
7652 (final DoubleToObject<? extends U> fst,
7653 final IntAndObjectToDouble<? super U> snd) {
7654 return new IntAndDoubleToDouble() {
7655 public double op(int i, double a) { return snd.op(i, fst.op(a)); }
7656 };
7657 }
7658
7659 static <U> IntAndDoubleToLong compoundIndexedOp
7660 (final DoubleToObject<? extends U> fst,
7661 final IntAndObjectToLong<? super U> snd) {
7662 return new IntAndDoubleToLong() {
7663 public long op(int i, double a) { return snd.op(i, fst.op(a)); }
7664 };
7665 }
7666
7667 static <U,V> IntAndLongToObject<V> compoundIndexedOp
7668 (final LongToObject<? extends U> fst,
7669 final IntAndObjectToObject<? super U, ? extends V> snd) {
7670 return new IntAndLongToObject<V>() {
7671 public V op(int i, long a) { return snd.op(i, fst.op(a)); }
7672 };
7673 }
7674
7675 static <U> IntAndLongToDouble compoundIndexedOp
7676 (final LongToObject<? extends U> fst,
7677 final IntAndObjectToDouble<? super U> snd) {
7678 return new IntAndLongToDouble() {
7679 public double op(int i, long a) { return snd.op(i, fst.op(a)); }
7680 };
7681 }
7682
7683 static <U> IntAndLongToLong compoundIndexedOp
7684 (final LongToObject<? extends U> fst,
7685 final IntAndObjectToLong<? super U> snd) {
7686 return new IntAndLongToLong() {
7687 public long op(int i, long a) { return snd.op(i, fst.op(a)); }
7688 };
7689 }
7690
7691 static <T,V> IntAndObjectToObject<T,V> compoundIndexedOp
7692 (final ObjectToDouble<? super T> fst,
7693 final IntAndDoubleToObject<? extends V> snd) {
7694 return new IntAndObjectToObject<T,V>() {
7695 public V op(int i, T a) { return snd.op(i, fst.op(a)); }
7696 };
7697 }
7698
7699 static <T> IntAndObjectToDouble<T> compoundIndexedOp
7700 (final ObjectToDouble<? super T> fst, final IntAndDoubleToDouble snd) {
7701 return new IntAndObjectToDouble<T>() {
7702 public double op(int i, T a) { return snd.op(i, fst.op(a)); }
7703 };
7704 }
7705
7706 static <T> IntAndObjectToLong<T> compoundIndexedOp
7707 (final ObjectToDouble<? super T> fst, final IntAndDoubleToLong snd) {
7708 return new IntAndObjectToLong<T>() {
7709 public long op(int i, T a) { return snd.op(i, fst.op(a)); }
7710 };
7711 }
7712
7713 static <V> IntAndDoubleToObject<V> compoundIndexedOp
7714 (final DoubleOp fst, final IntAndDoubleToObject<? extends V> snd) {
7715 return new IntAndDoubleToObject<V>() {
7716 public V op(int i, double a) { return snd.op(i, fst.op(a)); }
7717 };
7718 }
7719
7720 static IntAndDoubleToDouble compoundIndexedOp
7721 (final DoubleOp fst, final IntAndDoubleToDouble snd) {
7722 return new IntAndDoubleToDouble() {
7723 public double op(int i, double a) { return snd.op(i, fst.op(a)); }
7724 };
7725 }
7726
7727 static IntAndDoubleToLong compoundIndexedOp
7728 (final DoubleOp fst, final IntAndDoubleToLong snd) {
7729 return new IntAndDoubleToLong() {
7730 public long op(int i, double a) { return snd.op(i, fst.op(a)); }
7731 };
7732 }
7733
7734 static <V> IntAndLongToObject<V> compoundIndexedOp
7735 (final LongToDouble fst, final IntAndDoubleToObject<? extends V> snd) {
7736 return new IntAndLongToObject<V>() {
7737 public V op(int i, long a) { return snd.op(i, fst.op(a)); }
7738 };
7739 }
7740
7741 static IntAndLongToDouble compoundIndexedOp
7742 (final LongToDouble fst, final IntAndDoubleToDouble snd) {
7743 return new IntAndLongToDouble() {
7744 public double op(int i, long a) { return snd.op(i, fst.op(a)); }
7745 };
7746 }
7747
7748 static IntAndLongToLong compoundIndexedOp
7749 (final LongToDouble fst, final IntAndDoubleToLong snd) {
7750 return new IntAndLongToLong() {
7751 public long op(int i, long a) { return snd.op(i, fst.op(a)); }
7752 };
7753 }
7754
7755 static <T,V> IntAndObjectToObject<T,V> compoundIndexedOp
7756 (final ObjectToLong<? super T> fst,
7757 final IntAndLongToObject<? extends V> snd) {
7758 return new IntAndObjectToObject<T,V>() {
7759 public V op(int i, T a) { return snd.op(i, fst.op(a)); }
7760 };
7761 }
7762
7763 static <T> IntAndObjectToDouble<T> compoundIndexedOp
7764 (final ObjectToLong<? super T> fst, final IntAndLongToDouble snd) {
7765 return new IntAndObjectToDouble<T>() {
7766 public double op(int i, T a) { return snd.op(i, fst.op(a)); }
7767 };
7768 }
7769
7770 static <T> IntAndObjectToLong<T> compoundIndexedOp
7771 (final ObjectToLong<? super T> fst, final IntAndLongToLong snd) {
7772 return new IntAndObjectToLong<T>() {
7773 public long op(int i, T a) { return snd.op(i, fst.op(a)); }
7774 };
7775 }
7776
7777 static <V> IntAndDoubleToObject<V> compoundIndexedOp
7778 (final DoubleToLong fst, final IntAndLongToObject<? extends V> snd) {
7779 return new IntAndDoubleToObject<V>() {
7780 public V op(int i, double a) { return snd.op(i, fst.op(a)); }
7781 };
7782 }
7783
7784 static IntAndDoubleToDouble compoundIndexedOp
7785 (final DoubleToLong fst, final IntAndLongToDouble snd) {
7786 return new IntAndDoubleToDouble() {
7787 public double op(int i, double a) { return snd.op(i, fst.op(a)); }
7788 };
7789 }
7790
7791 static IntAndDoubleToLong compoundIndexedOp
7792 (final DoubleToLong fst, final IntAndLongToLong snd) {
7793 return new IntAndDoubleToLong() {
7794 public long op(int i, double a) { return snd.op(i, fst.op(a)); }
7795 };
7796 }
7797
7798 static <V> IntAndLongToObject<V> compoundIndexedOp
7799 (final LongOp fst, final IntAndLongToObject<? extends V> snd) {
7800 return new IntAndLongToObject<V>() {
7801 public V op(int i, long a) { return snd.op(i, fst.op(a)); }
7802 };
7803 }
7804
7805 static IntAndLongToDouble compoundIndexedOp
7806 (final LongOp fst, final IntAndLongToDouble snd) {
7807 return new IntAndLongToDouble() {
7808 public double op(int i, long a) { return snd.op(i, fst.op(a)); }
7809 };
7810 }
7811
7812 static IntAndLongToLong compoundIndexedOp
7813 (final LongOp fst, final IntAndLongToLong snd) {
7814 return new IntAndLongToLong() {
7815 public long op(int i, long a) { return snd.op(i, fst.op(a)); }
7816 };
7817 }
7818
7819 // binary predicates
7820
7821 static <T,U,W> IntAndObjectPredicate<T> indexedSelector
7822 (final BinaryPredicate<? super T, ? super U> bp,
7823 final ParallelArrayWithMapping<W,U> u, final int origin) {
7824 return new IntAndObjectPredicate<T>() {
7825 final int offset = u.origin - origin;
7826 public boolean op(int i, T a) {
7827 int k = i + offset;
7828 return u.isSelected(k) && bp.op(a, (U)(u.oget(k)));
7829 }
7830 };
7831 }
7832
7833 static IntAndDoublePredicate indexedSelector
7834 (final BinaryDoublePredicate bp,
7835 final ParallelDoubleArrayWithDoubleMapping u, final int origin) {
7836 return new IntAndDoublePredicate() {
7837 final int offset = u.origin - origin;
7838 public boolean op(int i, double a) {
7839 int k = i + offset;
7840 return u.isSelected(k) && bp.op(a, u.dget(k));
7841 }
7842 };
7843 }
7844
7845 static IntAndLongPredicate indexedSelector
7846 (final BinaryLongPredicate bp,
7847 final ParallelLongArrayWithLongMapping u, final int origin) {
7848 return new IntAndLongPredicate() {
7849 final int offset = u.origin - origin;
7850 public boolean op(int i, long a) {
7851 int k = i + offset;
7852 return u.isSelected(k) && bp.op(a, u.lget(k));
7853 }
7854 };
7855 }
7856
7857 static <S, T extends S> IntAndObjectPredicate<T> compoundIndexedSelector
7858 (final Predicate<S> fst, final IntAndObjectPredicate<? super T> snd) {
7859 return new IntAndObjectPredicate<T>() {
7860 public boolean op(int i, T a) { return fst.op(a) && snd.op(i, a); }
7861 };
7862 }
7863
7864 static <S, T extends S> IntAndObjectPredicate<T> compoundIndexedSelector
7865 (final IntAndObjectPredicate<S> fst,
7866 final IntAndObjectPredicate<? super T> snd) {
7867 return new IntAndObjectPredicate<T>() {
7868 public boolean op(int i, T a) { return fst.op(i, a) && snd.op(i, a); }
7869 };
7870 }
7871
7872 static <S, T extends S> IntAndObjectPredicate<T> compoundIndexedSelector
7873 (final IntAndObjectPredicate<S> fst, final Predicate<? super T> snd) {
7874 return new IntAndObjectPredicate<T>() {
7875 public boolean op(int i, T a) { return fst.op(i, a) && snd.op(a); }
7876 };
7877 }
7878
7879 static IntAndDoublePredicate compoundIndexedSelector
7880 (final DoublePredicate fst, final IntAndDoublePredicate snd) {
7881 return new IntAndDoublePredicate() {
7882 public boolean op(int i, double a) { return fst.op(a) && snd.op(i, a); }
7883 };
7884 }
7885
7886 static IntAndDoublePredicate compoundIndexedSelector
7887 (final IntAndDoublePredicate fst, final IntAndDoublePredicate snd) {
7888 return new IntAndDoublePredicate() {
7889 public boolean op(int i, double a) { return fst.op(i, a) && snd.op(i, a); }
7890 };
7891 }
7892
7893 static IntAndDoublePredicate compoundIndexedSelector
7894 (final IntAndDoublePredicate fst, final DoublePredicate snd) {
7895 return new IntAndDoublePredicate() {
7896 public boolean op(int i, double a) { return fst.op(i, a) && snd.op(a); }
7897 };
7898 }
7899
7900 static IntAndLongPredicate compoundIndexedSelector
7901 (final LongPredicate fst, final IntAndLongPredicate snd) {
7902 return new IntAndLongPredicate() {
7903 public boolean op(int i, long a) { return fst.op(a) && snd.op(i, a); }
7904 };
7905 }
7906
7907 static IntAndLongPredicate compoundIndexedSelector
7908 (final IntAndLongPredicate fst, final IntAndLongPredicate snd) {
7909 return new IntAndLongPredicate() {
7910 public boolean op(int i, long a) { return fst.op(i, a) && snd.op(i, a); }
7911 };
7912 }
7913
7914 static IntAndLongPredicate compoundIndexedSelector
7915 (final IntAndLongPredicate fst, final LongPredicate snd) {
7916 return new IntAndLongPredicate() {
7917 public boolean op(int i, long a) { return fst.op(i, a) && snd.op(a); }
7918 };
7919 }
7920
7921 }