package mikera.vectorz.impl;

import java.nio.DoubleBuffer;

import mikera.vectorz.AVector;

/**
 * A vector class implemented using a java.nio.DoubleBuffer
 * 
 * Intended for use with native libraries that require interop with buffer memory
 * 
 * @author Mike
 *
 */
public class BufferVector extends ASizedVector {
	private static final long serialVersionUID = -24132234222851156L;

	final DoubleBuffer buffer;
	
	protected BufferVector(int length) {
		this(DoubleBuffer.allocate(length), length);
	}

	protected BufferVector(DoubleBuffer buf, int length) {
		super(length);
		this.buffer=buf;
	}
	
	public static BufferVector wrap(double[] source) {
		return new BufferVector(DoubleBuffer.wrap(source),source.length);
	}
	
	public static BufferVector wrap(DoubleBuffer source, int length) {
		return new BufferVector(source,length);
	}
	
	public static BufferVector create(AVector v) {
		return wrap(v.toDoubleArray());
	}
	
	public static BufferVector createLength(int length) {
		return new BufferVector(length);
	}

	@Override
	public double get(int i) {
		return buffer.get(i);
	}

	@Override
	public void set(int i,double value) {
		buffer.put(i,value);
	}
	
	@Override
	public double unsafeGet(int i) {
		return buffer.get(i);
	}

	@Override
	public void unsafeSet(int i, double value) {
		buffer.put(i,value);
	}

	@Override
	public boolean isFullyMutable() {
		return true;
	}
	
	@Override
	public AVector subVector(int offset, int length) {
		checkRange(offset,length);
		if (length==0) return Vector0.INSTANCE;
		if (length==this.length) return this;
		buffer.position(offset);
		buffer.limit(offset+length);
		DoubleBuffer newBuffer=buffer.slice();
		buffer.clear();
		return wrap(newBuffer,length);
	}
	
	@Override
	public void getElements(double[] dest, int offset) {
		buffer.get(dest, offset, length);
		buffer.clear();
	}

	@Override
	public BufferVector exactClone() {
		double[] newArray=new double[length];
		buffer.get(newArray);
		buffer.clear();
		return BufferVector.wrap(newArray);
	}

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

Ads help maintain this website.