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

#ifndef __gnu_java_util_WeakIdentityHashMap__
#define __gnu_java_util_WeakIdentityHashMap__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace util
      {
          class WeakIdentityHashMap;
          class WeakIdentityHashMap$WeakBucket;
          class WeakIdentityHashMap$WeakBucket$WeakEntry;
          class WeakIdentityHashMap$WeakEntrySet;
      }
    }
  }
}

class gnu::java::util::WeakIdentityHashMap : public ::java::util::AbstractMap
{

public:
  WeakIdentityHashMap();
  WeakIdentityHashMap(jint);
  WeakIdentityHashMap(jint, jfloat);
  WeakIdentityHashMap(::java::util::Map *);
private:
  jint hash(::java::lang::Object *);
public: // actually package-private
  virtual void cleanQueue();
private:
  void rehash();
  ::gnu::java::util::WeakIdentityHashMap$WeakBucket$WeakEntry * internalGet(::java::lang::Object *);
  void internalAdd(::java::lang::Object *, ::java::lang::Object *);
public: // actually package-private
  virtual void internalRemove(::gnu::java::util::WeakIdentityHashMap$WeakBucket *);
public:
  virtual jint size();
  virtual jboolean isEmpty();
  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 ::java::util::Set * entrySet();
  virtual void clear();
  virtual jboolean containsValue(::java::lang::Object *);
  virtual ::java::util::Set * keySet();
  virtual void putAll(::java::util::Map *);
  virtual ::java::util::Collection * values();
private:
  static const jint DEFAULT_CAPACITY = 11;
  static jfloat DEFAULT_LOAD_FACTOR;
public: // actually package-private
  static ::java::lang::Object * NULL_KEY;
private:
  ::java::lang::ref::ReferenceQueue * __attribute__((aligned(__alignof__( ::java::util::AbstractMap)))) queue;
public: // actually package-private
  jint size__;
private:
  jfloat loadFactor;
  jint threshold;
public: // actually package-private
  jint modCount;
private:
  ::gnu::java::util::WeakIdentityHashMap$WeakEntrySet * theEntrySet;
public: // actually package-private
  JArray< ::gnu::java::util::WeakIdentityHashMap$WeakBucket * > * buckets;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_util_WeakIdentityHashMap__
