/* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/publicdomain/zero/1.0/ */ package extra166y; import java.util.*; /** * Interfaces and utilities declaring per-element operations used * within parallel methods on aggregates. This class provides type * names for all operation signatures accepting zero, one or two * arguments, and returning zero or one results, for parameterized * types, as well as specializations to {@code int}, {@code long}, * and {@code double}. In keeping with normal Java evaluation rules * that promote, for example {@code short} to {@code int}, operation * names for these smaller types are absent. * *

Preliminary release note: Some of the declarations in this * class are likely to be moved elsewhere in the JDK libraries * upon actual release, and most likely will not all nested in the * same class. * *

The naming conventions are as follows: *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
result = op(a) or * result = op(a,b)
* * * * * * * *
* arg types * result type * *
* a * b * {@code int} * {@code long} * {@code double} * Object * *
* * * * * * * *
* {@code int} * <none> * Ops.IntOp * Ops.IntToLong * Ops.IntToDouble * Ops.IntToObject * *
* * {@code int} * Ops.BinaryIntOp * Ops.IntAndIntToLong * Ops.IntAndIntToDouble * Ops.IntAndIntToObject * *
* * {@code long} * Ops.IntAndLongToInt * Ops.IntAndLongToLong * Ops.IntAndLongToDouble * Ops.IntAndLongToObject * *
* * {@code double} * Ops.IntAndDoubleToInt * Ops.IntAndDoubleToLong * Ops.IntAndDoubleToDouble * Ops.IntAndDoubleToObject * *
* * Object * Ops.IntAndObjectToInt * Ops.IntAndObjectToLong * Ops.IntAndObjectToDouble * Ops.IntAndObjectToObject * *
* * * * * * * *
* {@code long} * <none> * Ops.LongToInt * Ops.LongOp * Ops.LongToDouble * Ops.LongToObject * *
* * {@code int} * Ops.LongAndIntToInt * Ops.LongAndIntToLong * Ops.LongAndIntToDouble * Ops.LongAndIntToObject * *
* * {@code long} * Ops.LongAndLongToInt * Ops.BinaryLongOp * Ops.LongAndLongToDouble * Ops.LongAndLongToObject * *
* * {@code double} * Ops.LongAndDoubleToInt * Ops.LongAndDoubleToLong * Ops.LongAndDoubleToDouble * Ops.LongAndDoubleToObject * *
* * Object * Ops.LongAndObjectToInt * Ops.LongAndObjectToLong * Ops.LongAndObjectToDouble * Ops.LongAndObjectToObject * *
* * * * * * * *
* {@code double} * <none> * Ops.DoubleToInt * Ops.DoubleToLong * Ops.DoubleOp * Ops.DoubleToObject * *
* * {@code int} * Ops.DoubleAndIntToInt * Ops.DoubleAndIntToLong * Ops.DoubleAndIntToDouble * Ops.DoubleAndIntToObject * *
* * {@code long} * Ops.DoubleAndLongToInt * Ops.DoubleAndLongToLong * Ops.DoubleAndLongToDouble * Ops.DoubleAndLongToObject * *
* * {@code double} * Ops.DoubleAndDoubleToInt * Ops.DoubleAndDoubleToLong * Ops.BinaryDoubleOp * Ops.DoubleAndDoubleToObject *
* * Object * Ops.DoubleAndObjectToInt * Ops.DoubleAndObjectToLong * Ops.DoubleAndObjectToDouble * Ops.DoubleAndObjectToObject * *
* * * * * * * *
* Object * <none> * Ops.ObjectToInt * Ops.ObjectToLong * Ops.ObjectToDouble * Ops.Op * *
* * {@code int} * Ops.ObjectAndIntToInt * Ops.ObjectAndIntToLong * Ops.ObjectAndIntToDouble * Ops.ObjectAndIntToObject * *
* * {@code long} * Ops.ObjectAndLongToInt * Ops.ObjectAndLongToLong * Ops.ObjectAndLongToDouble * Ops.ObjectAndLongToObject * *
* * {@code double} * Ops.ObjectAndDoubleToInt * Ops.ObjectAndDoubleToLong * Ops.ObjectAndDoubleToDouble * Ops.ObjectAndDoubleToObject * *
* * Object * Ops.ObjectAndObjectToInt * Ops.ObjectAndObjectToLong * Ops.ObjectAndObjectToDouble * Ops.BinaryOp * *
* * * * * * *
* *

In addition to stated signatures, implementations of these * interfaces must work safely in parallel. In general, this means * methods should operate only on their arguments, and should not rely * on ThreadLocals, unsafely published globals, or other unsafe * constructions. Additionally, they should not block waiting for * synchronization. * *

This class is normally best used via {@code import static}. */ public class Ops { private Ops() {} // disable construction // Thanks to David Biesack for the above html table // You want to read/edit this with a wide editor panel public static interface Op { R op(A a);} public static interface BinaryOp { R op(A a, B b);} public static interface Predicate { boolean op(A a);} public static interface BinaryPredicate { boolean op(A a, B b);} public static interface Procedure { void op(A a);} public static interface Generator { R op();} public static interface Reducer extends BinaryOp {} public static interface IntOp { int op(int a);} public static interface BinaryIntOp { int op(int a, int b);} public static interface IntPredicate { boolean op(int a);} public static interface IntProcedure { void op(int a);} public static interface IntGenerator { int op();} public static interface BinaryIntPredicate { boolean op(int a, int b);} public static interface IntReducer extends BinaryIntOp {} public static interface IntComparator { int compare(int a, int b);} public static interface LongOp { long op(long a);} public static interface BinaryLongOp { long op(long a, long b);} public static interface LongPredicate { boolean op(long a);} public static interface BinaryLongPredicate { boolean op(long a, long b);} public static interface LongProcedure { void op(long a);} public static interface LongGenerator { long op();} public static interface LongReducer extends BinaryLongOp {} public static interface LongComparator { int compare(long a, long b);} public static interface DoubleOp { double op(double a);} public static interface BinaryDoubleOp { double op(double a, double b);} public static interface DoublePredicate { boolean op(double a);} public static interface BinaryDoublePredicate { boolean op(double a, double b);} public static interface DoubleProcedure { void op(double a);} public static interface DoubleGenerator { double op();} public static interface DoubleReducer extends BinaryDoubleOp {} public static interface DoubleComparator { int compare(double a, double b);} public static interface Action { void op();} // mixed mode ops public static interface IntToLong { long op(int a);} public static interface IntToDouble { double op(int a);} public static interface IntToObject { R op(int a);} public static interface LongToInt { int op(long a);} public static interface LongToDouble { double op(long a);} public static interface LongToObject { R op(long a);} public static interface DoubleToInt { int op(double a);} public static interface DoubleToLong { long op(double a);} public static interface DoubleToObject { R op(double a);} public static interface ObjectToInt { int op(A a);} public static interface ObjectToLong { long op(A a);} public static interface ObjectToDouble { double op(A a);} public static interface IntAndIntProcedure { void op(int a, int b);} public static interface IntAndIntToLong { long op(int a, int b);} public static interface IntAndIntToDouble { double op(int a, int b);} public static interface IntAndIntToObject { R op(int a, int b);} public static interface IntAndLongProcedure { void op(int a, long b);} public static interface IntAndLongPredicate { boolean op(int a, long b);} public static interface IntAndLongToInt { int op(int a, long b);} public static interface IntAndLongToLong { long op(int a, long b);} public static interface IntAndLongToDouble { double op(int a, long b);} public static interface IntAndLongToObject { R op(int a, long b);} public static interface IntAndDoubleProcedure { void op(int a, double b);} public static interface IntAndDoublePredicate { boolean op(int a, double b);} public static interface IntAndDoubleToInt { int op(int a, double b);} public static interface IntAndDoubleToLong { long op(int a, double b);} public static interface IntAndDoubleToDouble { double op(int a, double b);} public static interface IntAndDoubleToObject { R op(int a, double b);} public static interface IntAndObjectProcedure { void op(int a, A b);} public static interface IntAndObjectPredicate { boolean op(int a, A b);} public static interface IntAndObjectToInt { int op(int a, A b);} public static interface IntAndObjectToLong { long op(int a, A b);} public static interface IntAndObjectToDouble { double op(int a, A b);} public static interface IntAndObjectToObject { R op(int a, A b);} public static interface LongAndIntProcedure { void op(long a, int b);} public static interface LongAndIntPredicate { boolean op(long a, int b);} public static interface LongAndIntToInt { int op(long a, int b);} public static interface LongAndIntToLong { long op(long a, int b);} public static interface LongAndIntToDouble { double op(long a, int b);} public static interface LongAndIntToObject { R op(long a, int b);} public static interface LongAndLongProcedure { void op(long a, long b);} public static interface LongAndLongToInt { int op(long a, long b);} public static interface LongAndLongToDouble { double op(long a, long b);} public static interface LongAndLongToObject { R op(long a, long b);} public static interface LongAndDoubleProcedure { void op(long a, double b);} public static interface LongAndDoublePredicate { boolean op(long a, double b);} public static interface LongAndDoubleToInt { int op(long a, double b);} public static interface LongAndDoubleToLong { long op(long a, double b);} public static interface LongAndDoubleToDouble { double op(long a, double b);} public static interface LongAndDoubleToObject { R op(long a, double b);} public static interface LongAndObjectProcedure { void op(long a, A b);} public static interface LongAndObjectPredicate { boolean op(long a, A b);} public static interface LongAndObjectToInt { int op(long a, A b);} public static interface LongAndObjectToLong { long op(long a, A b);} public static interface LongAndObjectToDouble { double op(long a, A b);} public static interface LongAndObjectToObject { R op(long a, A b);} public static interface DoubleAndIntProcedure { void op(double a, int b);} public static interface DoubleAndIntPredicate { boolean op(double a, int b);} public static interface DoubleAndIntToInt { int op(double a, int b);} public static interface DoubleAndIntToLong { long op(double a, int b);} public static interface DoubleAndIntToDouble { double op(double a, int b);} public static interface DoubleAndIntToObject { R op(double a, int b);} public static interface DoubleAndLongProcedure { void op(double a, long b);} public static interface DoubleAndLongPredicate { boolean op(double a, long b);} public static interface DoubleAndLongToInt { int op(double a, long b);} public static interface DoubleAndLongToLong { long op(double a, long b);} public static interface DoubleAndLongToDouble { double op(double a, long b);} public static interface DoubleAndLongToObject { R op(double a, long b);} public static interface DoubleAndDoubleProcedure { void op(double a, double b);} public static interface DoubleAndDoubleToInt { int op(double a, double b);} public static interface DoubleAndDoubleToLong { long op(double a, double b);} public static interface DoubleAndDoubleToObject { R op(double a, double b);} public static interface DoubleAndObjectProcedure { void op(double a, A b);} public static interface DoubleAndObjectPredicate { boolean op(double a, A b);} public static interface DoubleAndObjectToInt { int op(double a, A b);} public static interface DoubleAndObjectToLong { long op(double a, A b);} public static interface DoubleAndObjectToDouble { double op(double a, A b);} public static interface DoubleAndObjectToObject { R op(double a, A b);} public static interface ObjectAndIntProcedure { void op(A a, int b);} public static interface ObjectAndIntPredicate { boolean op(A a, int b);} public static interface ObjectAndIntToInt { int op(A a, int b);} public static interface ObjectAndIntToLong { long op(A a, int b);} public static interface ObjectAndIntToDouble { double op(A a, int b);} public static interface ObjectAndIntToObject { R op(A a, int b);} public static interface ObjectAndLongProcedure { void op(A a, long b);} public static interface ObjectAndLongPredicate { boolean op(A a, long b);} public static interface ObjectAndLongToInt { int op(A a, long b);} public static interface ObjectAndLongToLong { long op(A a, long b);} public static interface ObjectAndLongToDouble { double op(A a, long b);} public static interface ObjectAndLongToObject { R op(A a, long b);} public static interface ObjectAndDoubleProcedure { void op(A a, double b);} public static interface ObjectAndDoublePredicate { boolean op(A a, double b);} public static interface ObjectAndDoubleToInt { int op(A a, double b);} public static interface ObjectAndDoubleToLong { long op(A a, double b);} public static interface ObjectAndDoubleToDouble { double op(A a, double b);} public static interface ObjectAndDoubleToObject { R op(A a, double b);} public static interface ObjectAndObjectProcedure{ void op(A a, B b);} public static interface ObjectAndObjectToInt { int op(A a, B b);} public static interface ObjectAndObjectToLong { long op(A a, B b);} public static interface ObjectAndObjectToDouble { double op(A a, B b);} }