package greenfoot.collision;

import greenfoot.Actor;

import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.List;

public class CollisionProfiler
implements CollisionChecker{    
   
   private static boolean to_console = true;
    
   
   
   private static boolean verbose = true;
    
   
   
   
   private static final int MAX_SEQ_COUNT = 100;

   
   private CollisionChecker checker;
    
   
   private long addObjectTime;
   
   private long removeObjectTime;
   
   private long updateObjectLocationTime;
   
   private long updateObjectSizeTime;
   
   private long getObjectsAtTime;
   
   private long getIntersectingObjectsTime;
   
   private long getObjectsInRangeTime;
   
   private long getNeighboursTime;
   
   private long getObjectsInDirectionTime;
   
   private long getObjectsTime;
   
   private long getOneObjectAtTime;
   
   private long getOneIntersectingObjectTime;

   
   private int sequenceCount;
   
   private int sequences;
    
   
   private PrintStream fileStream;

   
   private int objectCount;
    
   
   public CollisionProfiler(CollisionChecker checker)
   {        
      this.checker = checker;     
      }
    
   
   public void initialize(int width, int height, int cellSize, boolean wrap)
   {
      checker.initialize(width, height, cellSize, wrap);
      if (to_console) {            
         fileStream = System.out;         
         }
       

      else {
           
      File f = new File(System.getProperty("user.home"));
           
      f = new File(f, "profile.txt");
           
      try {
      f.createNewFile();             
      }
           
   catch (IOException e1) {                
      
      e1.printStackTrace();             
      }
           
   try {
               
   fileStream = new PrintStream(f);             
   }
           
catch (FileNotFoundException e) {                
   
   e.printStackTrace();             
   }         
}     
}

   
public synchronized void addObject(Actor actor)
   {
   long t1 = System.nanoTime();
   checker.addObject(actor);
   long t2 = System.nanoTime();
       
   addObjectTime += t2 - t1;     
   }

   
public synchronized void removeObject(Actor object)
   {
   long t1 = System.nanoTime();
   checker.removeObject(object);
   long t2 = System.nanoTime();
       
   removeObjectTime += t2 - t1;     
   }

   
public  synchronized void updateObjectLocation(Actor object, int oldX, int oldY)
   { 
   long t1 = System.nanoTime();
   checker.updateObjectLocation(object, oldX, oldY);
   long t2 = System.nanoTime();
       
   updateObjectLocationTime += t2 - t1;              
   }

   
public  synchronized void updateObjectSize(Actor object)
   {
   long t1 = System.nanoTime();
   checker.updateObjectSize(object);
   long t2 = System.nanoTime();
       
   updateObjectSizeTime += t2 - t1;              
   }

   
public <T extends Actor> List getObjectsAt(int x, int y, Class<T> cls)
   {
   long t1 = System.nanoTime();
   List<T> l  = checker.getObjectsAt(x, y, cls);
   long t2 = System.nanoTime();
       
   getObjectsAtTime += t2 - t1;
       
   return l;     
   }

   
public <T extends Actor> List getIntersectingObjects(Actor actor, Class<T> cls)
   { 
   long t1 = System.nanoTime();
   List<T> l = checker.getIntersectingObjects(actor, cls);
   long t2 = System.nanoTime();
       
   getIntersectingObjectsTime += t2 - t1;
       
   return l;     
   }

   
public <T extends Actor> List getObjectsInRange(int x, int y, int r, Class<T> cls)
   {
   long t1 = System.nanoTime();
   List<T> l = checker.getObjectsInRange(x, y, r, cls);
   long t2 = System.nanoTime();
       
   getObjectsInRangeTime += t2 - t1;
       
   return l;     
   }

   
public <T extends Actor> List getNeighbours(Actor actor, int distance, boolean diag, Class<T> cls)
   {
   long t1 = System.nanoTime();
   List<T> l = checker.getNeighbours(actor, distance, diag, cls);
   long t2 = System.nanoTime();
       
   getNeighboursTime += t2 - t1;
       
   return l;     
   }

   
public <T extends Actor> List getObjectsInDirection(int x, int y, int angle, int length, Class<T> cls)
   {
   long t1 = System.nanoTime();
   List<T> l = checker.getObjectsInDirection(x, y, angle, length, cls);
   long t2 = System.nanoTime();
       
   getObjectsInDirectionTime += t2 - t1;
       
   return l;     
   }

   
public synchronized  List getObjects(Class<T> cls)
   {
   long t1 = System.nanoTime();
   List<T> l = checker.getObjects(cls);
   long t2 = System.nanoTime();
       
   getObjectsTime += t2 - t1;
       
   return l;     
   }
    
   
public List getObjectsList()
   {
   return checker.getObjectsList();     
   }
    
   
public void startSequence()
   {
   checker.startSequence();
       
   sequenceCount++;
   objectCount += checker.getObjects(null).size();
   if (sequenceCount > MAX_SEQ_COUNT) {             
      printTimes();
            
           
      addObjectTime = 0;
           
      removeObjectTime = 0;
           
      updateObjectLocationTime = 0;
           
      updateObjectSizeTime = 0;
           
      getObjectsAtTime = 0;
           
      getIntersectingObjectsTime = 0;
           
      getObjectsInRangeTime = 0;
           
      getNeighboursTime = 0;
           
      getObjectsInDirectionTime = 0;
           
      getObjectsTime = 0;
           
      getOneObjectAtTime = 0;
           
      getOneIntersectingObjectTime = 0;
            
           
      objectCount = 0;
            
           
      sequenceCount = 0;         
      }
        
       
   
   fileStream.flush();     
   }

   
private void printTimes()
   {        
   sequences++;
   if (verbose) {
      fileStream.println("Sequence # " + sequences);         
      }
        
       
   long totalTime = 0;
       
   totalTime += addObjectTime;
       
   totalTime += removeObjectTime;
       
   totalTime += updateObjectLocationTime;
       
   totalTime += updateObjectSizeTime;
       
   totalTime += getObjectsAtTime;
       
   totalTime += getIntersectingObjectsTime ;
       
   totalTime += getObjectsInRangeTime;
       
   totalTime += getNeighboursTime;
       
   totalTime += getObjectsInDirectionTime;
       
   totalTime += getObjectsTime;
       
   totalTime += getOneObjectAtTime;
       
   totalTime += getOneIntersectingObjectTime;
       
   
        
   if (verbose) {
      fileStream.println("addObjectTime                : " + addObjectTime);
      fileStream.println("removeObjectTime             : " + removeObjectTime);
      fileStream.println("updateObjectLocationTime     : " + updateObjectLocationTime);
      fileStream.println("updateObjectSizeTime         : " + updateObjectSizeTime);
      fileStream.println("getObjectsAtTime             : " + getObjectsAtTime);
      fileStream.println("getIntersectingObjectsTime   : " + getIntersectingObjectsTime);
      fileStream.println("getObjectsInRanageTime       : " + getObjectsInRangeTime);
      fileStream.println("getNeighboursTime            : " + getNeighboursTime);
      fileStream.println("getObjectsInDirectionTime    : " + getObjectsInDirectionTime);
      fileStream.println("getObjectsTime               : " + getObjectsTime);
      fileStream.println("getOneObjectAtTime           : " + getOneObjectAtTime);
      fileStream.println("getOneIntersectingObjectTime : " + getOneIntersectingObjectTime);         
      }
        
   
   fileStream.println(  totalTime +","+ objectCount / sequenceCount);
   fileStream.println("========================");     
   }

   
public <T extends Actor> T getOneObjectAt(Actor actor, int dx, int dy, Class<T> cls)
   {
   long t1 = System.nanoTime();
   T o = checker.getOneObjectAt(actor, dx, dy, cls);
   long t2 = System.nanoTime();
       
   getOneObjectAtTime += t2 - t1;
       
   return o;     
   }

   
public <T extends Actor> T getOneIntersectingObject(Actor object, Class<T> cls)
   {
   long t1 = System.nanoTime();
   T o = checker.getOneIntersectingObject(object, cls);
   long t2 = System.nanoTime();
       
   getOneIntersectingObjectTime += t2 - t1;
       
   return o;     
   }

   
public void paintDebug(Graphics g)
   {
        
   } 
}
top, use, map, class CollisionProfiler

.   CollisionProfiler
.   initialize
.   addObject
.   removeObject
.   updateObjectLocation
.   updateObjectSize
.   getObjectsAt
.   getIntersectingObjects
.   getObjectsInRange
.   getNeighbours
.   getObjectsInDirection
.   getObjects
.   getObjectsList
.   startSequence
.   printTimes
.   getOneObjectAt
.   getOneIntersectingObject
.   paintDebug




365 neLoCode + 0 LoComm