package mikera.vectorz.impl;

import java.util.Arrays;

import mikera.vectorz.AVector;
import mikera.vectorz.util.ErrorMessages;
import mikera.vectorz.util.IntArrays;
import mikera.vectorz.util.VectorzException;

/**
 * Vector that addresses elements indexed into another source vector.
 * 
 * Indexed elements are not necessarily distinct: two elements n the vector can refer to the same source element.
 * 
 * @author Mike
 */
public final class IndexedSubVector extends BaseIndexedVector {
	private static final long serialVersionUID = -1411109918028367417L;

	private final AVector source;
	
	private IndexedSubVector(AVector source, int[] indexes) {
		super(indexes);
		this.source=source;
	}
	
	public static IndexedSubVector wrap(AVector source, int[] indexes) {
		return new IndexedSubVector(source,indexes);
	}
	
	@Override
	public void addToArray(double[] dest, int offset) {
		for (int i=0; ithis.length)) {
			throw new IndexOutOfBoundsException(ErrorMessages.invalidRange(this, offset, length));
		}
		if (length==0) return Vector0.INSTANCE;
		if (length==this.length) return this;

		int[] newIndexes=Arrays.copyOfRange(indexes, offset, offset+length);
		return replaceIndex(newIndexes);
	}
	
	@Override 
	public IndexedSubVector exactClone() {
		return IndexedSubVector.wrap(source.exactClone(), indexes.clone());
	}
	
	@Override
	public void validate() {
		super.validate();
		int slen=source.length();
		for (int i=0; i=slen)) throw new VectorzException("Indexes out of range");
		}
	}

	@Override
	public void addAt(int i, double v) {
		source.addAt(indexes[i], v);
	}

	@Override
	public double dotProduct(double[] data, int offset) {
		double result=0.0;
		for (int i=0; i 

Ads help maintain this website.