/******************************************************************************
 * Copyright (c) 2002 - 2006 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *****************************************************************************/
/*
 * Created on Sep 1, 2005
 */
package com.ibm.wala.cast.tree;

import java.util.Set;

import com.ibm.wala.util.collections.HashSetFactory;

public class CAstQualifier {
  public static final Set/* <CAstQualifier> */<CAstQualifier>sQualifiers = HashSetFactory.make();
    
  public static final CAstQualifier CONST = new CAstQualifier("const");
  public static final CAstQualifier STRICTFP = new CAstQualifier("strictfp");
  public static final CAstQualifier VOLATILE = new CAstQualifier("volatile");
  public static final CAstQualifier ABSTRACT = new CAstQualifier("abstract");
  public static final CAstQualifier INTERFACE = new CAstQualifier("interface");
  public static final CAstQualifier NATIVE = new CAstQualifier("native");
  public static final CAstQualifier TRANSIENT = new CAstQualifier("transient");
  public static final CAstQualifier FINAL = new CAstQualifier("final");
  public static final CAstQualifier STATIC = new CAstQualifier("static");
  public static final CAstQualifier PRIVATE = new CAstQualifier("private");
  public static final CAstQualifier PROTECTED = new CAstQualifier("protected");
  public static final CAstQualifier PUBLIC = new CAstQualifier("public");
  public static final CAstQualifier SYNCHRONIZED = new CAstQualifier("synchronized");
  public static final CAstQualifier ANNOTATION = new CAstQualifier("@annotation");

  static {
    sQualifiers.add(ANNOTATION);
    sQualifiers.add(PUBLIC);
    sQualifiers.add(PROTECTED);
    sQualifiers.add(PRIVATE);
    sQualifiers.add(STATIC);
    sQualifiers.add(FINAL);
    sQualifiers.add(SYNCHRONIZED);
    sQualifiers.add(TRANSIENT);
    sQualifiers.add(NATIVE);
    sQualifiers.add(INTERFACE);
    sQualifiers.add(ABSTRACT);
    sQualifiers.add(VOLATILE);
    sQualifiers.add(STRICTFP);
    sQualifiers.add(CONST);
  }

  private static int sNextBitNum = 0;

  private String fName;

  private long fBit;

  public CAstQualifier(String name) {
    super();
    fBit = 1L << sNextBitNum++;
    fName = name;
    sQualifiers.add(this);
  }

  public long getBit() {
    return fBit;
  }

  public String getName() {
    return fName;
  }

  public boolean equals(Object o) {
    if (!(o instanceof CAstQualifier))
      return false;
    CAstQualifier other = (CAstQualifier) o;
    return other.fName.equals(fName) && (fBit == other.fBit);
  }

  public int hashCode() {
    int result = 37;
    result = result * 13 + fName.hashCode();
    return result;
  }

  @Override
  public String toString() {
    return fName;
  }
}
