/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.surface; import java.util.Arrays; import org.apache.commons.lang.Validate; /** * Parent class for a family of surfaces that have <i>x</i>, <i>y</i> and <i>z</i> values of any type. * @param <T> Type of the x-axis values * @param <U> Type of the y-axis values * @param <V> Type of the z-axis values */ public abstract class ObjectsSurface<T, U, V> extends Surface<T, U, V> { private final int _n; private final T[] _xData; private final U[] _yData; private final V[] _zData; /** * @param xData An array of <i>x</i> data, not null, no null elements. * @param yData An array of <i>y</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param zData An array of <i>z</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. */ public ObjectsSurface(final T[] xData, final U[] yData, final V[] zData) { super(); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.length == yData.length); Validate.isTrue(xData.length == zData.length); _n = xData.length; _xData = Arrays.copyOf(xData, _n); _yData = Arrays.copyOf(yData, _n); _zData = Arrays.copyOf(zData, _n); } /** * @param xData An array of <i>x</i> data, not null * @param yData An array of <i>y</i> data, not null * @param zData An array of <i>z</i> data, not null * @param name The surface name */ public ObjectsSurface(final T[] xData, final U[] yData, final V[] zData, final String name) { super(name); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.length == yData.length); Validate.isTrue(xData.length == zData.length); _n = xData.length; _xData = Arrays.copyOf(xData, _n); _yData = Arrays.copyOf(yData, _n); _zData = Arrays.copyOf(zData, _n); } /** * {@inheritDoc} */ @Override public T[] getXData() { return _xData; } /** * {@inheritDoc} */ @Override public U[] getYData() { return _yData; } /** * {@inheritDoc} */ @Override public V[] getZData() { return _zData; } /** * {@inheritDoc} */ @Override public int size() { return _n; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Arrays.hashCode(_xData); result = prime * result + Arrays.hashCode(_yData); result = prime * result + Arrays.hashCode(_zData); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (getClass() != obj.getClass()) { return false; } final ObjectsSurface<?, ?, ?> other = (ObjectsSurface<?, ?, ?>) obj; if (!Arrays.equals(_xData, other._xData)) { return false; } if (!Arrays.equals(_yData, other._yData)) { return false; } if (!Arrays.equals(_zData, other._zData)) { return false; } return true; } }