home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / misc / Cache.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  2.5 KB  |  159 lines

  1. package sun.misc;
  2.  
  3. import java.util.Dictionary;
  4. import java.util.Enumeration;
  5.  
  6. public class Cache extends Dictionary {
  7.    private CacheEntry[] table;
  8.    private int count;
  9.    private int threshold;
  10.    private float loadFactor;
  11.  
  12.    private void init(int var1, float var2) {
  13.       if (var1 > 0 && !((double)var2 <= (double)0.0F)) {
  14.          this.loadFactor = var2;
  15.          this.table = new CacheEntry[var1];
  16.          this.threshold = (int)((float)var1 * var2);
  17.       } else {
  18.          throw new IllegalArgumentException();
  19.       }
  20.    }
  21.  
  22.    public Cache(int var1, float var2) {
  23.       this.init(var1, var2);
  24.    }
  25.  
  26.    public Cache(int var1) {
  27.       this.init(var1, 0.75F);
  28.    }
  29.  
  30.    public Cache() {
  31.       try {
  32.          this.init(101, 0.75F);
  33.       } catch (IllegalArgumentException var1) {
  34.          throw new Error("panic");
  35.       }
  36.    }
  37.  
  38.    public int size() {
  39.       return this.count;
  40.    }
  41.  
  42.    public boolean isEmpty() {
  43.       return this.count == 0;
  44.    }
  45.  
  46.    public synchronized Enumeration keys() {
  47.       return new CacheEnumerator(this.table, true);
  48.    }
  49.  
  50.    public synchronized Enumeration elements() {
  51.       return new CacheEnumerator(this.table, false);
  52.    }
  53.  
  54.    public synchronized Object get(Object var1) {
  55.       CacheEntry[] var2 = this.table;
  56.       int var3 = var1.hashCode();
  57.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  58.  
  59.       for(CacheEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  60.          if (var5.hash == var3 && var5.key.equals(var1)) {
  61.             return ((Ref)var5).check();
  62.          }
  63.       }
  64.  
  65.       return null;
  66.    }
  67.  
  68.    protected void rehash() {
  69.       int var1 = this.table.length;
  70.       CacheEntry[] var2 = this.table;
  71.       int var3 = var1 * 2 + 1;
  72.       CacheEntry[] var4 = new CacheEntry[var3];
  73.       this.threshold = (int)((float)var3 * this.loadFactor);
  74.       this.table = var4;
  75.       int var5 = var1;
  76.  
  77.       while(var5-- > 0) {
  78.          CacheEntry var6 = var2[var5];
  79.  
  80.          while(var6 != null) {
  81.             CacheEntry var7 = var6;
  82.             var6 = var6.next;
  83.             if (((Ref)var7).check() != null) {
  84.                int var8 = (var7.hash & Integer.MAX_VALUE) % var3;
  85.                var7.next = var4[var8];
  86.                var4[var8] = var7;
  87.             } else {
  88.                --this.count;
  89.             }
  90.          }
  91.       }
  92.  
  93.    }
  94.  
  95.    public synchronized Object put(Object var1, Object var2) {
  96.       if (var2 == null) {
  97.          throw new NullPointerException();
  98.       } else {
  99.          CacheEntry[] var3 = this.table;
  100.          int var4 = var1.hashCode();
  101.          int var5 = (var4 & Integer.MAX_VALUE) % var3.length;
  102.          CacheEntry var6 = null;
  103.  
  104.          for(CacheEntry var7 = var3[var5]; var7 != null; var7 = var7.next) {
  105.             if (var7.hash == var4 && var7.key.equals(var1)) {
  106.                Object var8 = ((Ref)var7).check();
  107.                ((Ref)var7).setThing(var2);
  108.                return var8;
  109.             }
  110.  
  111.             if (((Ref)var7).check() == null) {
  112.                var6 = var7;
  113.             }
  114.          }
  115.  
  116.          if (this.count >= this.threshold) {
  117.             this.rehash();
  118.             return this.put(var1, var2);
  119.          } else {
  120.             if (var6 == null) {
  121.                var6 = new CacheEntry();
  122.                var6.next = var3[var5];
  123.                var3[var5] = var6;
  124.                ++this.count;
  125.             }
  126.  
  127.             var6.hash = var4;
  128.             var6.key = var1;
  129.             ((Ref)var6).setThing(var2);
  130.             return null;
  131.          }
  132.       }
  133.    }
  134.  
  135.    public synchronized Object remove(Object var1) {
  136.       CacheEntry[] var2 = this.table;
  137.       int var3 = var1.hashCode();
  138.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  139.       CacheEntry var5 = var2[var4];
  140.  
  141.       for(CacheEntry var6 = null; var5 != null; var5 = var5.next) {
  142.          if (var5.hash == var3 && var5.key.equals(var1)) {
  143.             if (var6 != null) {
  144.                var6.next = var5.next;
  145.             } else {
  146.                var2[var4] = var5.next;
  147.             }
  148.  
  149.             --this.count;
  150.             return ((Ref)var5).check();
  151.          }
  152.  
  153.          var6 = var5;
  154.       }
  155.  
  156.       return null;
  157.    }
  158. }
  159.