home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / util / IdentityHashMap.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  6.7 KB  |  475 lines

  1. package java.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7. import java.io.StreamCorruptedException;
  8.  
  9. public class IdentityHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, Serializable, Cloneable {
  10.    private static final int DEFAULT_CAPACITY = 32;
  11.    private static final int MINIMUM_CAPACITY = 4;
  12.    private static final int MAXIMUM_CAPACITY = 536870912;
  13.    private transient Object[] table;
  14.    private int size;
  15.    private transient volatile int modCount;
  16.    private transient int threshold;
  17.    private static final Object NULL_KEY = new Object();
  18.    private transient Set<Map.Entry<K, V>> entrySet;
  19.    private static final long serialVersionUID = 8188218128353913216L;
  20.  
  21.    private static Object maskNull(Object var0) {
  22.       return var0 == null ? NULL_KEY : var0;
  23.    }
  24.  
  25.    private static Object unmaskNull(Object var0) {
  26.       return var0 == NULL_KEY ? null : var0;
  27.    }
  28.  
  29.    public IdentityHashMap() {
  30.       this.entrySet = null;
  31.       this.init(32);
  32.    }
  33.  
  34.    public IdentityHashMap(int var1) {
  35.       this.entrySet = null;
  36.       if (var1 < 0) {
  37.          throw new IllegalArgumentException("expectedMaxSize is negative: " + var1);
  38.       } else {
  39.          this.init(this.capacity(var1));
  40.       }
  41.    }
  42.  
  43.    private int capacity(int var1) {
  44.       int var2 = 3 * var1 / 2;
  45.       int var3;
  46.       if (var2 <= 536870912 && var2 >= 0) {
  47.          for(var3 = 4; var3 < var2; var3 <<= 1) {
  48.          }
  49.       } else {
  50.          var3 = 536870912;
  51.       }
  52.  
  53.       return var3;
  54.    }
  55.  
  56.    private void init(int var1) {
  57.       this.threshold = var1 * 2 / 3;
  58.       this.table = new Object[2 * var1];
  59.    }
  60.  
  61.    public IdentityHashMap(Map<? extends K, ? extends V> var1) {
  62.       this((int)((double)(1 + var1.size()) * 1.1));
  63.       this.putAll(var1);
  64.    }
  65.  
  66.    public int size() {
  67.       return this.size;
  68.    }
  69.  
  70.    public boolean isEmpty() {
  71.       return this.size == 0;
  72.    }
  73.  
  74.    private static int hash(Object var0, int var1) {
  75.       int var2 = System.identityHashCode(var0);
  76.       return (var2 << 1) - (var2 << 8) & var1 - 1;
  77.    }
  78.  
  79.    private static int nextKeyIndex(int var0, int var1) {
  80.       return var0 + 2 < var1 ? var0 + 2 : 0;
  81.    }
  82.  
  83.    public V get(Object var1) {
  84.       Object var2 = maskNull(var1);
  85.       Object[] var3 = this.table;
  86.       int var4 = var3.length;
  87.       int var5 = hash(var2, var4);
  88.  
  89.       while(true) {
  90.          Object var6 = var3[var5];
  91.          if (var6 == var2) {
  92.             return (V)var3[var5 + 1];
  93.          }
  94.  
  95.          if (var6 == null) {
  96.             return null;
  97.          }
  98.  
  99.          var5 = nextKeyIndex(var5, var4);
  100.       }
  101.    }
  102.  
  103.    public boolean containsKey(Object var1) {
  104.       Object var2 = maskNull(var1);
  105.       Object[] var3 = this.table;
  106.       int var4 = var3.length;
  107.       int var5 = hash(var2, var4);
  108.  
  109.       while(true) {
  110.          Object var6 = var3[var5];
  111.          if (var6 == var2) {
  112.             return true;
  113.          }
  114.  
  115.          if (var6 == null) {
  116.             return false;
  117.          }
  118.  
  119.          var5 = nextKeyIndex(var5, var4);
  120.       }
  121.    }
  122.  
  123.    public boolean containsValue(Object var1) {
  124.       Object[] var2 = this.table;
  125.  
  126.       for(int var3 = 1; var3 < var2.length; var3 += 2) {
  127.          if (var2[var3] == var1) {
  128.             return true;
  129.          }
  130.       }
  131.  
  132.       return false;
  133.    }
  134.  
  135.    private boolean containsMapping(Object var1, Object var2) {
  136.       Object var3 = maskNull(var1);
  137.       Object[] var4 = this.table;
  138.       int var5 = var4.length;
  139.       int var6 = hash(var3, var5);
  140.  
  141.       while(true) {
  142.          Object var7 = var4[var6];
  143.          if (var7 == var3) {
  144.             return var4[var6 + 1] == var2;
  145.          }
  146.  
  147.          if (var7 == null) {
  148.             return false;
  149.          }
  150.  
  151.          var6 = nextKeyIndex(var6, var5);
  152.       }
  153.    }
  154.  
  155.    public V put(K var1, V var2) {
  156.       Object var3 = maskNull(var1);
  157.       Object[] var4 = this.table;
  158.       int var5 = var4.length;
  159.  
  160.       int var6;
  161.       Object var7;
  162.       for(var6 = hash(var3, var5); (var7 = var4[var6]) != null; var6 = nextKeyIndex(var6, var5)) {
  163.          if (var7 == var3) {
  164.             Object var8 = var4[var6 + 1];
  165.             var4[var6 + 1] = var2;
  166.             return (V)var8;
  167.          }
  168.       }
  169.  
  170.       ++this.modCount;
  171.       var4[var6] = var3;
  172.       var4[var6 + 1] = var2;
  173.       if (++this.size >= this.threshold) {
  174.          this.resize(var5);
  175.       }
  176.  
  177.       return null;
  178.    }
  179.  
  180.    private void resize(int var1) {
  181.       int var2 = var1 * 2;
  182.       Object[] var3 = this.table;
  183.       int var4 = var3.length;
  184.       if (var4 == 1073741824) {
  185.          if (this.threshold == 536870911) {
  186.             throw new IllegalStateException("Capacity exhausted.");
  187.          } else {
  188.             this.threshold = 536870911;
  189.          }
  190.       } else if (var4 < var2) {
  191.          Object[] var5 = new Object[var2];
  192.          this.threshold = var2 / 3;
  193.  
  194.          for(int var6 = 0; var6 < var4; var6 += 2) {
  195.             Object var7 = var3[var6];
  196.             if (var7 != null) {
  197.                Object var8 = var3[var6 + 1];
  198.                var3[var6] = null;
  199.                var3[var6 + 1] = null;
  200.  
  201.                int var9;
  202.                for(var9 = hash(var7, var2); var5[var9] != null; var9 = nextKeyIndex(var9, var2)) {
  203.                }
  204.  
  205.                var5[var9] = var7;
  206.                var5[var9 + 1] = var8;
  207.             }
  208.          }
  209.  
  210.          this.table = var5;
  211.       }
  212.    }
  213.  
  214.    public void putAll(Map<? extends K, ? extends V> var1) {
  215.       int var2 = var1.size();
  216.       if (var2 != 0) {
  217.          if (var2 > this.threshold) {
  218.             this.resize(this.capacity(var2));
  219.          }
  220.  
  221.          for(Map.Entry var4 : var1.entrySet()) {
  222.             this.put(var4.getKey(), var4.getValue());
  223.          }
  224.  
  225.       }
  226.    }
  227.  
  228.    public V remove(Object var1) {
  229.       Object var2 = maskNull(var1);
  230.       Object[] var3 = this.table;
  231.       int var4 = var3.length;
  232.       int var5 = hash(var2, var4);
  233.  
  234.       while(true) {
  235.          Object var6 = var3[var5];
  236.          if (var6 == var2) {
  237.             ++this.modCount;
  238.             --this.size;
  239.             Object var7 = var3[var5 + 1];
  240.             var3[var5 + 1] = null;
  241.             var3[var5] = null;
  242.             this.closeDeletion(var5);
  243.             return (V)var7;
  244.          }
  245.  
  246.          if (var6 == null) {
  247.             return null;
  248.          }
  249.  
  250.          var5 = nextKeyIndex(var5, var4);
  251.       }
  252.    }
  253.  
  254.    private boolean removeMapping(Object var1, Object var2) {
  255.       Object var3 = maskNull(var1);
  256.       Object[] var4 = this.table;
  257.       int var5 = var4.length;
  258.       int var6 = hash(var3, var5);
  259.  
  260.       while(true) {
  261.          Object var7 = var4[var6];
  262.          if (var7 == var3) {
  263.             if (var4[var6 + 1] != var2) {
  264.                return false;
  265.             } else {
  266.                ++this.modCount;
  267.                --this.size;
  268.                var4[var6] = null;
  269.                var4[var6 + 1] = null;
  270.                this.closeDeletion(var6);
  271.                return true;
  272.             }
  273.          }
  274.  
  275.          if (var7 == null) {
  276.             return false;
  277.          }
  278.  
  279.          var6 = nextKeyIndex(var6, var5);
  280.       }
  281.    }
  282.  
  283.    private void closeDeletion(int var1) {
  284.       Object[] var2 = this.table;
  285.       int var3 = var2.length;
  286.  
  287.       Object var4;
  288.       for(int var5 = nextKeyIndex(var1, var3); (var4 = var2[var5]) != null; var5 = nextKeyIndex(var5, var3)) {
  289.          int var6 = hash(var4, var3);
  290.          if (var5 < var6 && (var6 <= var1 || var1 <= var5) || var6 <= var1 && var1 <= var5) {
  291.             var2[var1] = var4;
  292.             var2[var1 + 1] = var2[var5 + 1];
  293.             var2[var5] = null;
  294.             var2[var5 + 1] = null;
  295.             var1 = var5;
  296.          }
  297.       }
  298.  
  299.    }
  300.  
  301.    public void clear() {
  302.       ++this.modCount;
  303.       Object[] var1 = this.table;
  304.  
  305.       for(int var2 = 0; var2 < var1.length; ++var2) {
  306.          var1[var2] = null;
  307.       }
  308.  
  309.       this.size = 0;
  310.    }
  311.  
  312.    public boolean equals(Object var1) {
  313.       if (var1 == this) {
  314.          return true;
  315.       } else if (var1 instanceof IdentityHashMap) {
  316.          IdentityHashMap var6 = (IdentityHashMap)var1;
  317.          if (var6.size() != this.size) {
  318.             return false;
  319.          } else {
  320.             Object[] var3 = var6.table;
  321.  
  322.             for(int var4 = 0; var4 < var3.length; var4 += 2) {
  323.                Object var5 = var3[var4];
  324.                if (var5 != null && !this.containsMapping(var5, var3[var4 + 1])) {
  325.                   return false;
  326.                }
  327.             }
  328.  
  329.             return true;
  330.          }
  331.       } else if (var1 instanceof Map) {
  332.          Map var2 = (Map)var1;
  333.          return this.entrySet().equals(var2.entrySet());
  334.       } else {
  335.          return false;
  336.       }
  337.    }
  338.  
  339.    public int hashCode() {
  340.       int var1 = 0;
  341.       Object[] var2 = this.table;
  342.  
  343.       for(int var3 = 0; var3 < var2.length; var3 += 2) {
  344.          Object var4 = var2[var3];
  345.          if (var4 != null) {
  346.             Object var5 = unmaskNull(var4);
  347.             var1 += System.identityHashCode(var5) ^ System.identityHashCode(var2[var3 + 1]);
  348.          }
  349.       }
  350.  
  351.       return var1;
  352.    }
  353.  
  354.    public Object clone() {
  355.       try {
  356.          IdentityHashMap var1 = (IdentityHashMap)super.clone();
  357.          var1.entrySet = null;
  358.          var1.table = this.table.clone();
  359.          return var1;
  360.       } catch (CloneNotSupportedException var2) {
  361.          throw new InternalError();
  362.       }
  363.    }
  364.  
  365.    public Set<K> keySet() {
  366.       Set var1 = this.keySet;
  367.       return var1 != null ? var1 : (this.keySet = new KeySet(this, (1)null));
  368.    }
  369.  
  370.    public Collection<V> values() {
  371.       Collection var1 = this.values;
  372.       return var1 != null ? var1 : (this.values = new Values(this, (1)null));
  373.    }
  374.  
  375.    public Set<Map.Entry<K, V>> entrySet() {
  376.       Set var1 = this.entrySet;
  377.       return var1 != null ? var1 : (this.entrySet = new EntrySet(this, (1)null));
  378.    }
  379.  
  380.    private void writeObject(ObjectOutputStream var1) throws IOException {
  381.       var1.defaultWriteObject();
  382.       var1.writeInt(this.size);
  383.       Object[] var2 = this.table;
  384.  
  385.       for(int var3 = 0; var3 < var2.length; var3 += 2) {
  386.          Object var4 = var2[var3];
  387.          if (var4 != null) {
  388.             var1.writeObject(unmaskNull(var4));
  389.             var1.writeObject(var2[var3 + 1]);
  390.          }
  391.       }
  392.  
  393.    }
  394.  
  395.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  396.       var1.defaultReadObject();
  397.       int var2 = var1.readInt();
  398.       this.init(this.capacity(var2 * 4 / 3));
  399.  
  400.       for(int var3 = 0; var3 < var2; ++var3) {
  401.          Object var4 = var1.readObject();
  402.          Object var5 = var1.readObject();
  403.          this.putForCreate(var4, var5);
  404.       }
  405.  
  406.    }
  407.  
  408.    private void putForCreate(K var1, V var2) throws IOException {
  409.       Object var3 = maskNull(var1);
  410.       Object[] var4 = this.table;
  411.       int var5 = var4.length;
  412.  
  413.       int var6;
  414.       Object var7;
  415.       for(var6 = hash(var3, var5); (var7 = var4[var6]) != null; var6 = nextKeyIndex(var6, var5)) {
  416.          if (var7 == var3) {
  417.             throw new StreamCorruptedException();
  418.          }
  419.       }
  420.  
  421.       var4[var6] = var3;
  422.       var4[var6 + 1] = var2;
  423.    }
  424.  
  425.    // $FF: synthetic method
  426.    static int access$000(IdentityHashMap var0) {
  427.       return var0.size;
  428.    }
  429.  
  430.    // $FF: synthetic method
  431.    static Object[] access$100(IdentityHashMap var0) {
  432.       return var0.table;
  433.    }
  434.  
  435.    // $FF: synthetic method
  436.    static int access$200(IdentityHashMap var0) {
  437.       return var0.modCount;
  438.    }
  439.  
  440.    // $FF: synthetic method
  441.    static int access$204(IdentityHashMap var0) {
  442.       return ++var0.modCount;
  443.    }
  444.  
  445.    // $FF: synthetic method
  446.    static int access$010(IdentityHashMap var0) {
  447.       return var0.size--;
  448.    }
  449.  
  450.    // $FF: synthetic method
  451.    static int access$300(int var0, int var1) {
  452.       return nextKeyIndex(var0, var1);
  453.    }
  454.  
  455.    // $FF: synthetic method
  456.    static int access$400(Object var0, int var1) {
  457.       return hash(var0, var1);
  458.    }
  459.  
  460.    // $FF: synthetic method
  461.    static Object access$600(Object var0) {
  462.       return unmaskNull(var0);
  463.    }
  464.  
  465.    // $FF: synthetic method
  466.    static boolean access$1300(IdentityHashMap var0, Object var1, Object var2) {
  467.       return var0.containsMapping(var1, var2);
  468.    }
  469.  
  470.    // $FF: synthetic method
  471.    static boolean access$1400(IdentityHashMap var0, Object var1, Object var2) {
  472.       return var0.removeMapping(var1, var2);
  473.    }
  474. }
  475.