package mikera.vectorz.util;

import java.util.Arrays;
import java.util.List;

import mikera.util.Rand;
import mikera.vectorz.Tools;

public class IntArrays {

	private IntArrays(){}

	public static final int[] EMPTY_INT_ARRAY=new int[0];
	
	public static int[] of(int... ints) {
		return ints;
	}
	
	public static int[] create(Object o) {
		if (o instanceof List) {
			return create((List)o);
		} else if (o instanceof int[]) {
			return ((int[]) o).clone();
		} else if (o instanceof double[]) {
			return create((double[]) o);
		} else if (o instanceof Iterable) {
			return create(Tools.toList((Iterable) o));
		}
		throw new IllegalArgumentException("Can't convert to int[]: "+o);
	}
	
	/**
	 * Creates a new int array. Use the default EMPTY_INT_ARRAY if requested size is zero
	 * @param size
	 * @return
	 */
	public static int[] create(int size) {
		if (size==0) return EMPTY_INT_ARRAY;
		return new int[size];
	}
	
	public static int[] create(double[] ls) {
		int n=ls.length;
		int[] r=new int[n];
		for (int i=0; i ls) {
		int n=ls.size();
		int[] r=new int[n];
		for (int i=0; i=0; j--) {
			stride[j]=st;
			st*=shape[j];
		}
		return stride;
	}
	
	/**
	 * Tests if two int array scontain equal values.
	 * @param as
	 * @param bs
	 * @return
	 */
	public static boolean equals(int[] as, int[] bs) {
		if (as==bs) return true;
		int n=as.length;
		if (n!=bs.length) return false;
		for (int i=0; i>1;
			int mi=data[mid];
			if (i==mi) return mid;
			if (i20) {
			return seekPositionBig(data,i,0,max);
		} else {
			return seekPositionSmall(data,i, 0, max);
		}	
	}
	
	private static int seekPositionBig(int[] data, int x, int min, int max) {
		int lx=data[min];
		int hx=data[max-1];
		if (x<=lx) {
			return min;
		}
		if (x>=hx) {
			if (x==hx) return max-1;
			return max;
		}
		
		while ((min+10)>1; // bisect interval
			int mx=data[mid];
			if (x==mx) return mid;
			if (x20) {
			return indexPositionBig(data,x,0,max);
		} else {
			return indexPositionSmall(data,x, 0, max);
		}	
	}
	
	private static int indexPositionBig(int[] data, int x, int min, int max) {
		int lx=data[min];
		int hx=data[max-1];
		if (x<=lx) {
			if (x==lx) return min;
			return -1;
		}
		if (x>=hx) {
			if (x==hx) return max-1;
			return -1;
		}
		
		while ((min+10)>1; // bisect interval
			int mx=data[mid];
			if (x==mx) return mid;
			if (x=shape[i])) return false;
		}
		return true;
	}

	public static int[] select(int[] source, int... inds) {
		int n=inds.length;
		int[] r=new int[n];
		for (int i=0; i 

Ads help maintain this website.