content: /*
   * Copyright (C) 2010-2014 - Martin Berger
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */
  package edu.stanford.rsl.conrad.data.generic;
  
  import java.util.Iterator;
  
  import com.jogamp.opencl.CLContext;
  import com.jogamp.opencl.CLDevice;
  
  import edu.stanford.rsl.conrad.data.Grid;
  import edu.stanford.rsl.conrad.data.OpenCLMemoryDelegate;
  import edu.stanford.rsl.conrad.data.generic.datatypes.Gridable;
  import edu.stanford.rsl.conrad.data.generic.iterators.GenericPointwiseIteratorND;
  import edu.stanford.rsl.conrad.data.generic.opencl.OpenCLGenericGridInterface;
  import edu.stanford.rsl.conrad.opencl.OpenCLUtil;
  
  
  
  /**
   *
   */
  public abstract class GenericGrid<T extends Gridable<T>> extends Grid implements Iterable<T>, OpenCLGenericGridInterface<T>{
  	
  	protected OpenCLMemoryDelegate delegate;
  	
  	protected boolean openCLactive;
  	
  	/**
  	 * @return Returns the object at position idx
  	 */
  	public abstract T getValue(int... idx);
  	
  	/**
  	 * @return Sets the object at position idx
  	 */
  	public abstract void setValue(T val, int... idx);
  	
  	@Override
  	public Iterator<T> iterator() {
  		return new GenericPointwiseIteratorND<T>(this);
  	}
  	
  	@Override
  	public abstract GenericGridOperatorInterface<T> getGridOperator();
  	
  	
  	@Override
  	public GenericGridOperatorInterface<T> selectGridOperator(GenericGrid<T> ... grids){
  		boolean useCL = true;
  		for (GenericGrid<T> grid : grids){
  			if (!grid.openCLactive){
  				useCL = false;
  			}
  		}
  		return selectGridOperator(useCL);
  	};
  	
  	public abstract GenericGridOperatorInterface<T> selectGridOperator(boolean useOpenCLOperator);
  	
  	@Override
  	public OpenCLMemoryDelegate getDelegate() {
  		return delegate;
  	}
  	
  	@Override
  	public void notifyAfterWrite(){
  		if(openCLactive) delegate.notifyHostChange();
  	}
  	
  	@Override
  	public void notifyBeforeRead(){
  		if(openCLactive) delegate.prepareForHostOperation();
  	}
  	
  	@Override
  	public void activateCL(){
  		initializeDelegate();
  		openCLactive = true;
  	}
  	
  	@Override
  	public void deactivateCL(){
  		notifyBeforeRead();
  		if (delegate != null){
  			delegate.release();
  			delegate = null;
  		}
  		openCLactive = false;
  	}
  	
  	public  abstract void initializeDelegate(CLContext context, CLDevice device);
  	
  	public  void initializeDelegate(){
  		CLContext context = OpenCLUtil.getStaticContext();
  		CLDevice device = context.getMaxFlopsDevice();
  		initializeDelegate(context,device);
  	}
  	
  }
  
  
  