ucar.multiarray
Class MultiArrayProxy

java.lang.Object
  extended by ucar.multiarray.MultiArrayProxy
All Implemented Interfaces:
Accessor, MultiArray, MultiArrayInfo

public class MultiArrayProxy
extends java.lang.Object
implements MultiArray

This MultiArray implementation wraps another MultiArray and an IndexMap to provide a different view of the wrapped MultiArray. Indices passed to access methods are passed through a chain of mappings.

See Also:
MultiArray, IndexMap

Constructor Summary
MultiArrayProxy(MultiArray delegate, IndexMap im)
          Construct a new proxy.
 
Method Summary
 void copyin(int[] origin, MultiArray data)
          Aggregate write access.
 MultiArray copyout(int[] origin, int[] shape)
          Aggregate read access.
 java.lang.Object get(int[] index)
          Get (read) the array element at index.
 boolean getBoolean(int[] index)
          Get the array element at index, as a boolean.
 byte getByte(int[] index)
          Get the array element at index, as a byte.
 char getChar(int[] index)
          Get the array element at index, as a char.
 java.lang.Class getComponentType()
          Returns the Class object representing the component type of the array.
 double getDouble(int[] index)
          Get the array element at index, as a double.
 float getFloat(int[] index)
          Get the array element at index, as a float.
 int getInt(int[] index)
          Get the array element at index, as an int.
 int[] getLengths()
          Returns the shape of the backing MultiArray as transformed by the dimensionsInverseMap() method of the IndexMap.
 long getLong(int[] index)
          Get the array element at index, as a long.
 int getRank()
          Returns the number of dimensions of the backing MultiArray, as transformed by the rankInverseMap() method of the IndexMap.
 short getShort(int[] index)
          Get the array element at index, as a short.
 boolean isScalar()
          Convenience interface; return true if and only if the rank is zero.
 boolean isUnlimited()
          Returns true if and only if the effective dimension lengths can change.
static void main(java.lang.String[] args)
           
 void set(int[] index, java.lang.Object value)
          Length of index must equal rank() of this.
 void setBoolean(int[] index, boolean value)
          Set the array element at index to the specified boolean value.
 void setByte(int[] index, byte value)
          Set the array element at index to the specified byte value.
 void setChar(int[] index, char value)
          Set the array element at index to the specified char value.
 void setDouble(int[] index, double value)
          Set the array element at index to the specified double value.
 void setFloat(int[] index, float value)
          Set the array element at index to the specified float value.
 void setInt(int[] index, int value)
          Set the array element at index to the specified int value.
 void setLong(int[] index, long value)
          Set the array element at index to the specified long value.
 void setShort(int[] index, short value)
          Set the array element at index to the specified short value.
 java.lang.Object toArray()
          Returns a new array containing all of the elements in this MultiArray.
 java.lang.Object toArray(java.lang.Object dst, int[] origin, int[] shape)
          Returns an array containing elements of this MultiArray specified by origin and shape, possibly converting the component type.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

MultiArrayProxy

public MultiArrayProxy(MultiArray delegate,
                       IndexMap im)
Construct a new proxy.

Parameters:
delegate - MultiArray backing the proxy view provided.
im - IndexMap defining the proxy view.
Method Detail

getComponentType

public java.lang.Class getComponentType()
Returns the Class object representing the component type of the array.

Specified by:
getComponentType in interface MultiArrayInfo
Returns:
Class The componentType
See Also:
Class.getComponentType()

getRank

public int getRank()
Returns the number of dimensions of the backing MultiArray, as transformed by the rankInverseMap() method of the IndexMap.

Specified by:
getRank in interface MultiArrayInfo
Returns:
int number of dimensions

getLengths

public int[] getLengths()
Returns the shape of the backing MultiArray as transformed by the dimensionsInverseMap() method of the IndexMap.

Specified by:
getLengths in interface MultiArrayInfo
Returns:
int array whose length is the rank of this MultiArray and whose elements represent the length of each of it's dimensions

isUnlimited

public boolean isUnlimited()
Returns true if and only if the effective dimension lengths can change.

Specified by:
isUnlimited in interface MultiArrayInfo
Returns:
boolean true iff this can grow

isScalar

public boolean isScalar()
Convenience interface; return true if and only if the rank is zero.

Specified by:
isScalar in interface MultiArrayInfo
Returns:
boolean true iff rank == 0

get

public java.lang.Object get(int[] index)
                     throws java.io.IOException
Description copied from interface: Accessor
Get (read) the array element at index. The returned value is wrapped in an object if it has a primitive type. Length of index must be greater than or equal to the rank of this. Values of index components must be less than corresponding values from getLengths().

Specified by:
get in interface Accessor
Parameters:
index - MultiArray index
Returns:
Object value at index Length of index must equal rank() of this. Values of index components must be less than corresponding values from getLengths().
Throws:
java.io.IOException

getBoolean

public boolean getBoolean(int[] index)
                   throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a boolean.

Specified by:
getBoolean in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getChar

public char getChar(int[] index)
             throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a char.

Specified by:
getChar in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getByte

public byte getByte(int[] index)
             throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a byte.

Specified by:
getByte in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getShort

public short getShort(int[] index)
               throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a short.

Specified by:
getShort in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getInt

public int getInt(int[] index)
           throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as an int.

Specified by:
getInt in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getLong

public long getLong(int[] index)
             throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a long.

Specified by:
getLong in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getFloat

public float getFloat(int[] index)
               throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a float.

Specified by:
getFloat in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

getDouble

public double getDouble(int[] index)
                 throws java.io.IOException
Description copied from interface: Accessor
Get the array element at index, as a double.

Specified by:
getDouble in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.get(int[])

set

public void set(int[] index,
                java.lang.Object value)
         throws java.io.IOException
Length of index must equal rank() of this. Values of index components must be less than corresponding values from getLengths().

Specified by:
set in interface Accessor
Parameters:
index - MultiArray index
value - the new value.
Throws:
java.io.IOException

setBoolean

public void setBoolean(int[] index,
                       boolean value)
                throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified boolean value.

Specified by:
setBoolean in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setChar

public void setChar(int[] index,
                    char value)
             throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified char value.

Specified by:
setChar in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setByte

public void setByte(int[] index,
                    byte value)
             throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified byte value.

Specified by:
setByte in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setShort

public void setShort(int[] index,
                     short value)
              throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified short value.

Specified by:
setShort in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setInt

public void setInt(int[] index,
                   int value)
            throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified int value.

Specified by:
setInt in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setLong

public void setLong(int[] index,
                    long value)
             throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified long value.

Specified by:
setLong in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setFloat

public void setFloat(int[] index,
                     float value)
              throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified float value.

Specified by:
setFloat in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

setDouble

public void setDouble(int[] index,
                      double value)
               throws java.io.IOException
Description copied from interface: Accessor
Set the array element at index to the specified double value.

Specified by:
setDouble in interface Accessor
Throws:
java.io.IOException
See Also:
Accessor.set(int[], java.lang.Object)

copyout

public MultiArray copyout(int[] origin,
                          int[] shape)
                   throws java.io.IOException
Description copied from interface: Accessor
Aggregate read access. Return a new MultiArray of the same componentType as this, and with shape as specified, which is initialized to the values of this, as clipped to (origin, origin + shape).

It is easier to implement than to specify :-).

The main reason to implement this instead of using the equivalent proxy is for remote or file access.

assert(origin[ii] + shape[ii] <= lengths[ii]);

Specified by:
copyout in interface Accessor
Parameters:
origin - int array specifying the starting index.
shape - int array specifying the extents in each dimension. This becomes the shape of the return.
Returns:
the MultiArray with the specified shape
Throws:
java.io.IOException
See Also:
Accessor.copyout(int[], int[])

copyin

public void copyin(int[] origin,
                   MultiArray data)
            throws java.io.IOException
Description copied from interface: Accessor
Aggregate write access. Given a MultiArray, copy it into this at the specified starting index. TODO: clearer specification.

Hopefully this member can be optimized in various situations.

assert(origin[ii] + (source.getLengths())[ii] <= (getLengths())[ii]);

Specified by:
copyin in interface Accessor
Parameters:
origin - int array specifying the starting index.
data - MultiArray with the same componentType as this and shape smaller than this.getLengths() - origin
Throws:
java.io.IOException
See Also:
Accessor.copyin(int[], ucar.multiarray.MultiArray)

toArray

public java.lang.Object toArray()
                         throws java.io.IOException
Description copied from interface: Accessor
Returns a new array containing all of the elements in this MultiArray. The returned array is one dimensional. The order of the elements in the result is natural, as if we used an IndexIterator to step through the elements of this MultiArray. The component type of the result is the same as this.

This method acts as bridge between array-based and MultiArray-based APIs.

This method is functionally equivalent to

                Object anArray = Array.newInstance(getComponentType(), 1);
                int [] origin = new int[getRank()]
                int [] shape = getDimensions();
                return toArray(anArray, origin, shape);
 

Specified by:
toArray in interface Accessor
Returns:
a one dimensional Array containing all the elements in this MultiArray
Throws:
java.io.IOException
See Also:
TODO: optimize?

toArray

public java.lang.Object toArray(java.lang.Object dst,
                                int[] origin,
                                int[] shape)
                         throws java.io.IOException
Description copied from interface: Accessor
Returns an array containing elements of this MultiArray specified by origin and shape, possibly converting the component type. The returned array is one dimensional. The order of the elements in the result is natural, as if we used an IndexIterator to step through the elements of this MultiArray.

The anArray argument should be an array. If it is large enough to contain the output, it is used and no new storage is allocated. Otherwise, new storage is allocated with the same component type as the argument, and the data is copied into it.

This method acts as bridge between array-based and MultiArray-based APIs.

This method is similar to copyout(origin, shape).toArray(), but avoids a copy operation and (potentially) an allocation.

NOTE: Implementation of type conversion is deferred until JDK 1.2. Currently, the componentType of anArray must be the same as this

Specified by:
toArray in interface Accessor
Returns:
a one dimensional Array containing the specified elements
Throws:
java.io.IOException
See Also:
TODO: optimize?

main

public static void main(java.lang.String[] args)