
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_util_Hashtable__
#define __java_util_Hashtable__

#pragma interface

#include <java/util/Dictionary.h>
#include <gcj/array.h>


class java::util::Hashtable : public ::java::util::Dictionary
{

public:
  Hashtable();
  Hashtable(::java::util::Map *);
  Hashtable(jint);
  Hashtable(jint, jfloat);
  virtual jint size();
  virtual jboolean isEmpty();
  virtual ::java::util::Enumeration * keys();
  virtual ::java::util::Enumeration * elements();
  virtual jboolean contains(::java::lang::Object *);
  virtual jboolean containsValue(::java::lang::Object *);
  virtual jboolean containsKey(::java::lang::Object *);
  virtual ::java::lang::Object * get(::java::lang::Object *);
  virtual ::java::lang::Object * put(::java::lang::Object *, ::java::lang::Object *);
  virtual ::java::lang::Object * remove(::java::lang::Object *);
  virtual void putAll(::java::util::Map *);
  virtual void clear();
  virtual ::java::lang::Object * clone();
  virtual ::java::lang::String * toString();
  virtual ::java::util::Set * keySet();
  virtual ::java::util::Collection * values();
  virtual ::java::util::Set * entrySet();
  virtual jboolean equals(::java::lang::Object *);
  virtual jint hashCode();
private:
  jint hash(::java::lang::Object *);
public: // actually package-private
  virtual ::java::util::Hashtable$HashEntry * getEntry(::java::lang::Object *);
  virtual void putAllInternal(::java::util::Map *);
public: // actually protected
  virtual void rehash();
private:
  void writeObject(::java::io::ObjectOutputStream *);
  void readObject(::java::io::ObjectInputStream *);
  static const jint DEFAULT_CAPACITY = 11;
  static jfloat DEFAULT_LOAD_FACTOR;
  static const jlong serialVersionUID = 1421746759512286392LL;
  jint __attribute__((aligned(__alignof__( ::java::util::Dictionary)))) threshold;
  jfloat loadFactor;
public: // actually package-private
  JArray< ::java::util::Hashtable$HashEntry * > * buckets;
  jint modCount;
  jint size__;
private:
  ::java::util::Set * keys__;
  ::java::util::Collection * values__;
  ::java::util::Set * entries;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_Hashtable__
