home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / inprise / JSAMPLES.Z / PrimeFactory.java < prev    next >
Text File  |  1998-05-08  |  4KB  |  145 lines

  1. /*
  2.  * Copyright (c) 1997-1998 Borland International, Inc. All Rights Reserved.
  3.  * 
  4.  * This SOURCE CODE FILE, which has been provided by Borland as part
  5.  * of a Borland product for use ONLY by licensed users of the product,
  6.  * includes CONFIDENTIAL and PROPRIETARY information of Borland.  
  7.  *
  8.  * USE OF THIS SOFTWARE IS GOVERNED BY THE TERMS AND CONDITIONS 
  9.  * OF THE LICENSE STATEMENT AND LIMITED WARRANTY FURNISHED WITH
  10.  * THE PRODUCT.
  11.  *
  12.  * IN PARTICULAR, YOU WILL INDEMNIFY AND HOLD BORLAND, ITS RELATED
  13.  * COMPANIES AND ITS SUPPLIERS, HARMLESS FROM AND AGAINST ANY CLAIMS
  14.  * OR LIABILITIES ARISING OUT OF THE USE, REPRODUCTION, OR DISTRIBUTION
  15.  * OF YOUR PROGRAMS, INCLUDING ANY CLAIMS OR LIABILITIES ARISING OUT OF
  16.  * OR RESULTING FROM THE USE, MODIFICATION, OR DISTRIBUTION OF PROGRAMS
  17.  * OR FILES CREATED FROM, BASED ON, AND/OR DERIVED FROM THIS SOURCE
  18.  * CODE FILE.
  19.  */
  20. package borland.samples.jbcl.listview;
  21.  
  22. import borland.jbcl.model.VectorModelListener;
  23. import borland.jbcl.model.WritableVectorModel;
  24. import borland.jbcl.model.VectorModelEvent;
  25. import borland.jbcl.util.EventMulticaster;
  26.  
  27. public class PrimeFactory extends Thread implements WritableVectorModel{
  28.   long testNumber = 30;
  29.   long checkNumber = 31;
  30.   private long[] increment = {1,7,11,13,17,19,23,29};
  31.   long[] primes = new long[500000] ;
  32.   int count = 0;
  33.   long nextSquare =  49;
  34.   int squareSubscript = 3;
  35.   private EventMulticaster modelListeners = new EventMulticaster();
  36.   private boolean events = true;
  37.  
  38.   public PrimeFactory() {
  39.     //the only numbers we need to check mod 30
  40.     primes[count++] = 2;
  41.     primes[count++] = 3;
  42.     primes[count++] = 5;
  43.     primes[count++] = 7;
  44.     primes[count++] = 11;
  45.     primes[count++] = 13;
  46.     primes[count++] = 17;
  47.     primes[count++] = 19;
  48.     primes[count++] = 23;
  49.     primes[count++] = 29;
  50.   }
  51.  
  52.   public void run() {
  53.     while (count < primes.length - 8){
  54.       for (int i = 0; i < 8;i++) {
  55.         if (test(testNumber + increment[i]))  {
  56.           processModelEvent(new VectorModelEvent(this,VectorModelEvent.ITEM_ADDED,count-1));
  57.           //yield(); the ListView structureChanged ModelEvent listener method does this so we don't have to
  58.         }
  59.       }
  60.       testNumber += 30;
  61.     }
  62.   }
  63.  
  64.   boolean test(long check) {
  65.     //if square root of the limiting prime, bump the limiting prime
  66.     checkNumber = check;
  67.     if (check == nextSquare) {
  68.       squareSubscript++;
  69.       nextSquare = primes[squareSubscript] * primes[squareSubscript];
  70.       //System.err.println("nextSquare = " + nextSquare);
  71.       return false;
  72.     }
  73.     int i = 3;
  74.  
  75.     while (i < squareSubscript) {
  76.       int start = i;
  77.       int end = squareSubscript < (start + 100) ? squareSubscript : start + 100;
  78.       for (i = start;i <= end;i++) {
  79.         if ((check/primes[i])*primes[i] == check)
  80.           return false;
  81.       }
  82.     }
  83.     primes[count++] = check;
  84.     return  true;
  85.   }
  86.  
  87.   public long getCheckNumber() {
  88.     return checkNumber;
  89.   }
  90.  
  91.   public boolean canSet(int parm1, boolean parm2) {
  92.     return false;
  93.   }
  94.  
  95.   public void set(int parm1, Object parm2) { }
  96.   public void touched(int parm1) { }
  97.   public boolean isVariableSize() {
  98.     return true;
  99.   }
  100.   public void addItem(Object parm1) { }
  101.   public void addItem(int parm1, Object parm2) { }
  102.   public void remove(int parm1) { }
  103.   public void removeAll() { }
  104.  
  105.   public void enableModelEvents(boolean enable) {
  106.     if (events != enable) {
  107.       events = enable;
  108.       if (enable)
  109.         processModelEvent(new VectorModelEvent(this, VectorModelEvent.STRUCTURE_CHANGED));
  110.     }
  111.   }
  112.  
  113.   public Object get(int parm1) {
  114.     return new Long(primes[parm1]);
  115.   }
  116.  
  117.   public int getCount() {
  118.     return count;
  119.   }
  120.  
  121.   public int find(Object parm1) {
  122.     long value =  ((Long) parm1).longValue();
  123.     for (int i = 1; i < count; i++) {
  124.       if (primes[i] >=  value)
  125.         return i;
  126.     }
  127.     return count-1;
  128.   }
  129.  
  130.   public void addModelListener(VectorModelListener listener) {
  131.     modelListeners.add(listener);
  132.   }
  133.  
  134.   public void removeModelListener(VectorModelListener listener) {
  135.     modelListeners.remove(listener);
  136.   }
  137.  
  138.   protected void processModelEvent(VectorModelEvent e) {
  139.     if (events && modelListeners.hasListeners()) {
  140.       modelListeners.dispatch(e);
  141.       yield();
  142.     }
  143.   }
  144. }
  145.