Project: Flume-Hive
/**
 * Licensed to Cloudera, Inc. under one 
 * or more contributor license agreements.  See the NOTICE file 
 * distributed with this work for additional information 
 * regarding copyright ownership.  Cloudera, Inc. licenses this file 
 * to you under the Apache License, Version 2.0 (the 
 * "License"); you may not use this file except in compliance 
 * with the License.  You may obtain a copy of the License at 
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 */
package org.arabidopsis.ahocorasick; 
 
/**
 * Represents an EdgeList by using a single array. Very fast lookup (just an 
 * array access), but expensive in terms of memory. 
 */
 
 
class DenseEdgeList<T> implements EdgeList<T> { 
  private State<T>[] array; 
 
  @SuppressWarnings("unchecked"
  public DenseEdgeList() { 
    this.array = new State[256]; 
    for (int i = 0; i < array.length; i++) 
      this.array[i] = null
  } 
 
  /**
   * Helps in converting to dense representation. 
   */
 
  public static <T> DenseEdgeList<T> fromSparse(SparseEdgeList<T> list) { 
    byte[] keys = list.keys(); 
    DenseEdgeList<T> newInstance = new DenseEdgeList<T>(); 
    for (int i = 0; i < keys.length; i++) { 
      newInstance.put(keys[i], list.get(keys[i])); 
    } 
    return newInstance; 
  } 
 
  public State<T> get(byte b) { 
    return this.array[(int) b & 0xFF]; 
  } 
 
  public void put(byte b, State<T> s) { 
    this.array[(int) b & 0xFF] = s; 
  } 
 
  public byte[] keys() { 
    int length = 0
    for (int i = 0; i < array.length; i++) { 
      if (array[i] != null
        length++; 
    } 
    byte[] result = new byte[length]; 
    int j = 0
    for (int i = 0; i < array.length; i++) { 
      if (array[i] != null) { 
        result[j] = (byte) i; 
        j++; 
      } 
    } 
    return result; 
  } 
 
}