/*
VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/

package visad.data.fits;

public abstract class GenericArrayConverter
{
  Object o;
  int[] lengths;

  public GenericArrayConverter(Class type, int[] lengths)
  {
    o = java.lang.reflect.Array.newInstance(type, lengths);

    this.lengths = lengths;
  }

  abstract void assign(Object obj, int index, double value);

  private Object getBottomArray(Object o, int[] which)
  {
    int d = which.length - 1;

    int i = 0;
    while (i < d) {
      o = java.lang.reflect.Array.get(o, which[i++]);
    }

    return o;
  }

  private Object getNextRMBottomArray(Object o, int[] coord)
  {
    int l = coord.length - 1;

    while (coord[l] >= lengths[l]) {
      coord[l] = 0;

      l--;
      if (l < 0) {
	return null;
      }

      coord[l]++;
    }

    return getBottomArray(o, coord);
  }

  private Object getNextCMBottomArray(Object o, int[] coord)
  {
    int l = 0;

    while (coord[l] >= lengths[lengths.length - (l+1)]) {
      coord[l] = 0;

      l++;
      if (l >= coord.length) {
	return null;
      }

      coord[l]++;
    }

    return getBottomArray(o, coord);
  }

  public Object getRowMajor(double[][] values)
  {
    int[] coord = new int[lengths.length];
    for (int i = 0; i < lengths.length; i++) {
      coord[i] = 0;
    }

    final int lastCoord = lengths.length - 1;

    Object ra = getBottomArray(o, coord);
    for (int i = 0; i < values.length; i++) {
      for (int j = 0; j < values[i].length; j++) {
        assign(ra, lengths[lastCoord] - ++coord[lastCoord], values[i][j]);

	if (coord[lastCoord] >= lengths[lastCoord]) {
	  ra = getNextRMBottomArray(o, coord);
	  if (ra == null) {
	    return o;
	  }
	}
      }
    }

    return o;
  }

  public Object getColumnMajor(double[][] values)
  {
    int[] coord = new int[lengths.length];
    for (int i = 0; i < lengths.length; i++) {
      coord[i] = 0;
    }

    final int lastCoord = lengths.length - 1;

    Object ra;
    for (int i = 0; i < values[0].length; i++) {
      assign(getBottomArray(o, coord), coord[lastCoord], values[0][i]);
      coord[0]++;

      if (coord[0] >= lengths[0]) {
        if (getNextCMBottomArray(o, coord) == null) {
          return o;
	}
      }
    }

    return o;
  }
}

 

Ads help maintain this website.