/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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.apache.hadoop.record.meta;

import java.io.IOException;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.record.RecordOutput;

/** 
 * Represents typeID for basic types.
 *  
 * @deprecated Replaced by <a href="http://hadoop.apache.org/avro/">Avro</a>.
 */
@Deprecated
@InterfaceAudience.Public
@InterfaceStability.Stable
public class TypeID {

  /**
   * constants representing the IDL types we support
   */
  public static final class RIOType {
    public static final byte BOOL   = 1;
    public static final byte BUFFER = 2;
    public static final byte BYTE   = 3;
    public static final byte DOUBLE = 4;
    public static final byte FLOAT  = 5;
    public static final byte INT    = 6;
    public static final byte LONG   = 7;
    public static final byte MAP    = 8;
    public static final byte STRING = 9;
    public static final byte STRUCT = 10;
    public static final byte VECTOR = 11;
  }

  /**
   * Constant classes for the basic types, so we can share them.
   */
  public static final TypeID BoolTypeID = new TypeID(RIOType.BOOL);
  public static final TypeID BufferTypeID = new TypeID(RIOType.BUFFER);
  public static final TypeID ByteTypeID = new TypeID(RIOType.BYTE);
  public static final TypeID DoubleTypeID = new TypeID(RIOType.DOUBLE);
  public static final TypeID FloatTypeID = new TypeID(RIOType.FLOAT);
  public static final TypeID IntTypeID = new TypeID(RIOType.INT);
  public static final TypeID LongTypeID = new TypeID(RIOType.LONG);
  public static final TypeID StringTypeID = new TypeID(RIOType.STRING);
  
  protected byte typeVal;

  /**
   * Create a TypeID object 
   */
  TypeID(byte typeVal) {
    this.typeVal = typeVal;
  }

  /**
   * Get the type value. One of the constants in RIOType.
   */
  public byte getTypeVal() {
    return typeVal;
  }

  /**
   * Serialize the TypeID object
   */
  void write(RecordOutput rout, String tag) throws IOException {
    rout.writeByte(typeVal, tag);
  }
  
  /**
   * Two base typeIDs are equal if they refer to the same type
   */
  public boolean equals(Object o) {
    if (this == o) 
      return true;

    if (o == null)
      return false;

    if (this.getClass() != o.getClass())
      return false;

    TypeID oTypeID = (TypeID) o;
    return (this.typeVal == oTypeID.typeVal);
  }
  
  /**
   * We use a basic hashcode implementation, since this class will likely not
   * be used as a hashmap key 
   */
  public int hashCode() {
    // See 'Effectve Java' by Joshua Bloch
    return 37*17+(int)typeVal;
  }
}

