Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2012 Trillian AB
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
  */
 package org.robovm.compiler.hash;
 
 import java.util.List;
 

Author(s):
niklas
 
 public class HashTableGenerator<K, V extends Constant> {
     private final HashFunction<K> function;
     private List<Entry<K, V>>[] table;
     private int tableSize;
     private int count = 0;
     private IntegerType indexType = .;
     private double loadFactor;
     
     public HashTableGenerator(HashFunction<K> function) {
         this(function, 4, 0.75);
     }
     
     public HashTableGenerator(HashFunction<K> functionint tableSize) {
         this(functiontableSize, 0.75);
     }
     
     public HashTableGenerator(HashFunction<K> functionint tableSizedouble loadFactor) {
         this. = function;
         this. = tableSize;
         this. = loadFactor;
         allocateTable();
     }
     
     @SuppressWarnings("unchecked")
     private void allocateTable() {
         this. = new List[1 << ];
     }
     
     public void put(K k, V v) {
         int h = .hash(k);
         putNoRehash(new Entry<K, V>(hkv));
         if ( >  * .) {
             rehash();
         }
     }
     
     private void rehash() {
         List<Entry<K, V>>[] oldTable = ;
         ++;
          = 0;
         allocateTable();
         for (int i = 0; i < oldTable.lengthi++) {
             if (oldTable[i] != null) {
                 for (Entry<K, V> entry : oldTable[i]) {
                     putNoRehash(entry);
                 }
             }
         }
     }
     
     private void putNoRehash(Entry<K, V> entry) {
         int idx = entry.h & ((1 << ) - 1);
         if ([idx] == null) {
             [idx] = new LinkedList<Entry<K, V>>();
         }
         for (Entry<K, V> e : [idx]) {
             if (e.h == entry.h && (e.k.equals(entry.k))) {
                 e.v = entry.v;
                 return;
             }
         }
         [idx].add(entry);
         ++;
     }
     
     public StructureConstant generate() {
         StructureConstantBuilder builder = new StructureConstantBuilder();
        int start = 0;
        builder.add(new IntegerConstant());
        builder.add(new IntegerConstant(.));
        builder.add(new IntegerConstant(start));
        for (int i = 1; i <= .i++) {
            if ([i - 1] == null) {
                builder.add(new IntegerConstant(start));                
            } else {
                start += [i - 1].size();
                builder.add(new IntegerConstant(start));
            }
        }
        for (int i = 0; i < .i++) {
            if ([i] != null) {
                for (Entry<K, V> entry : [i]) {
                    builder.add(entry.v);
                }
            }
        }
        return builder.build();
    }
    
    private static class Entry<K, V> {
        int h;
        K k;
        V v;
        Entry(int h, K k, V v) {
            this. = h;
            this. = k;
            this. = v;
        }
        @Override
        public int hashCode() {
            return ;
        }
        @SuppressWarnings("unchecked")
        @Override
        public boolean equals(Object obj) {
            Entry<K, V> e = (Entry<K, V>) obj;
            return this. == e.h 
                    && (this. == e.k || this..equals(e.k))
                    && (this. == e.v || this..equals(e.v));
        }
    }
New to GrepCode? Check out our FAQ X