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

#ifndef __java_util_concurrent_ConcurrentSkipListMap__
#define __java_util_concurrent_ConcurrentSkipListMap__

#pragma interface

#include <java/util/AbstractMap.h>

class java::util::concurrent::ConcurrentSkipListMap : public ::java::util::AbstractMap
{

public: // actually package-private
  virtual void initialize();
private:
  jboolean casHead(::java::util::concurrent::ConcurrentSkipListMap$HeadIndex *, ::java::util::concurrent::ConcurrentSkipListMap$HeadIndex *);
  ::java::lang::Comparable * comparable(::java::lang::Object *);
public: // actually package-private
  virtual jint compare(::java::lang::Object *, ::java::lang::Object *);
  virtual jboolean inHalfOpenRange(::java::lang::Object *, ::java::lang::Object *, ::java::lang::Object *);
  virtual jboolean inOpenRange(::java::lang::Object *, ::java::lang::Object *, ::java::lang::Object *);
private:
  ::java::util::concurrent::ConcurrentSkipListMap$Node * findPredecessor(::java::lang::Comparable *);
  ::java::util::concurrent::ConcurrentSkipListMap$Node * findNode(::java::lang::Comparable *);
  ::java::lang::Object * doGet(::java::lang::Object *);
  ::java::lang::Object * getUsingFindNode(::java::lang::Comparable *);
  ::java::lang::Object * doPut(::java::lang::Object *, ::java::lang::Object *, jboolean);
  jint randomLevel();
  void insertIndex(::java::util::concurrent::ConcurrentSkipListMap$Node *, jint);
  void addIndex(::java::util::concurrent::ConcurrentSkipListMap$Index *, ::java::util::concurrent::ConcurrentSkipListMap$HeadIndex *, jint);
public: // actually package-private
  virtual ::java::lang::Object * doRemove(::java::lang::Object *, ::java::lang::Object *);
private:
  void tryReduceLevel();
public: // actually package-private
  virtual ::java::util::concurrent::ConcurrentSkipListMap$Node * findFirst();
  virtual ::java::util::Map$Entry * doRemoveFirstEntry();
private:
  void clearIndexToFirst();
public: // actually package-private
  virtual ::java::util::concurrent::ConcurrentSkipListMap$Node * findLast();
private:
  ::java::util::concurrent::ConcurrentSkipListMap$Node * findPredecessorOfLast();
public: // actually package-private
  virtual ::java::util::Map$Entry * doRemoveLastEntry();
  virtual ::java::util::concurrent::ConcurrentSkipListMap$Node * findNear(::java::lang::Object *, jint);
  virtual ::java::util::AbstractMap$SimpleImmutableEntry * getNear(::java::lang::Object *, jint);
public:
  ConcurrentSkipListMap();
  ConcurrentSkipListMap(::java::util::Comparator *);
  ConcurrentSkipListMap(::java::util::Map *);
  ConcurrentSkipListMap(::java::util::SortedMap *);
  virtual ::java::util::concurrent::ConcurrentSkipListMap * ConcurrentSkipListMap$clone();
private:
  void buildFromSorted(::java::util::SortedMap *);
  void writeObject(::java::io::ObjectOutputStream *);
  void readObject(::java::io::ObjectInputStream *);
public:
  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 jboolean containsValue(::java::lang::Object *);
  virtual jint size();
  virtual jboolean isEmpty();
  virtual void clear();
  virtual ::java::util::NavigableSet * ConcurrentSkipListMap$keySet();
  virtual ::java::util::NavigableSet * navigableKeySet();
  virtual ::java::util::Collection * values();
  virtual ::java::util::Set * entrySet();
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$descendingMap();
  virtual ::java::util::NavigableSet * descendingKeySet();
  virtual jboolean equals(::java::lang::Object *);
  virtual ::java::lang::Object * putIfAbsent(::java::lang::Object *, ::java::lang::Object *);
  virtual jboolean remove(::java::lang::Object *, ::java::lang::Object *);
  virtual jboolean replace(::java::lang::Object *, ::java::lang::Object *, ::java::lang::Object *);
  virtual ::java::lang::Object * replace(::java::lang::Object *, ::java::lang::Object *);
  virtual ::java::util::Comparator * comparator();
  virtual ::java::lang::Object * firstKey();
  virtual ::java::lang::Object * lastKey();
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$subMap(::java::lang::Object *, jboolean, ::java::lang::Object *, jboolean);
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$headMap(::java::lang::Object *, jboolean);
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$tailMap(::java::lang::Object *, jboolean);
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$subMap(::java::lang::Object *, ::java::lang::Object *);
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$headMap(::java::lang::Object *);
  virtual ::java::util::concurrent::ConcurrentNavigableMap * ConcurrentSkipListMap$tailMap(::java::lang::Object *);
  virtual ::java::util::Map$Entry * lowerEntry(::java::lang::Object *);
  virtual ::java::lang::Object * lowerKey(::java::lang::Object *);
  virtual ::java::util::Map$Entry * floorEntry(::java::lang::Object *);
  virtual ::java::lang::Object * floorKey(::java::lang::Object *);
  virtual ::java::util::Map$Entry * ceilingEntry(::java::lang::Object *);
  virtual ::java::lang::Object * ceilingKey(::java::lang::Object *);
  virtual ::java::util::Map$Entry * higherEntry(::java::lang::Object *);
  virtual ::java::lang::Object * higherKey(::java::lang::Object *);
  virtual ::java::util::Map$Entry * firstEntry();
  virtual ::java::util::Map$Entry * lastEntry();
  virtual ::java::util::Map$Entry * pollFirstEntry();
  virtual ::java::util::Map$Entry * pollLastEntry();
public: // actually package-private
  virtual ::java::util::Iterator * keyIterator();
  virtual ::java::util::Iterator * valueIterator();
  virtual ::java::util::Iterator * entryIterator();
  static ::java::util::List * toList(::java::util::Collection *);
public:
  virtual ::java::util::SortedMap * subMap(::java::lang::Object *, ::java::lang::Object *);
  virtual ::java::util::NavigableMap * subMap(::java::lang::Object *, jboolean, ::java::lang::Object *, jboolean);
  virtual ::java::lang::Object * clone();
  virtual ::java::util::SortedMap * tailMap(::java::lang::Object *);
  virtual ::java::util::NavigableMap * tailMap(::java::lang::Object *, jboolean);
  virtual ::java::util::SortedMap * headMap(::java::lang::Object *);
  virtual ::java::util::NavigableMap * headMap(::java::lang::Object *, jboolean);
  virtual ::java::util::Set * keySet();
  virtual ::java::util::NavigableMap * descendingMap();
public: // actually package-private
  static ::java::lang::Object * access$9();
private:
  static const jlong serialVersionUID = -8627078645895051609LL;
  static ::java::util::Random * seedGenerator;
  static ::java::lang::Object * BASE_HEADER;
  ::java::util::concurrent::ConcurrentSkipListMap$HeadIndex * volatile __attribute__((aligned(__alignof__( ::java::util::AbstractMap)))) head;
  ::java::util::Comparator * comparator__;
  jint randomSeed;
  ::java::util::concurrent::ConcurrentSkipListMap$KeySet * keySet__;
  ::java::util::concurrent::ConcurrentSkipListMap$EntrySet * entrySet__;
  ::java::util::concurrent::ConcurrentSkipListMap$Values * values__;
  ::java::util::concurrent::ConcurrentNavigableMap * descendingMap__;
  static ::java::util::concurrent::atomic::AtomicReferenceFieldUpdater * headUpdater;
  static const jint EQ = 1;
  static const jint LT = 2;
  static const jint GT = 0;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_ConcurrentSkipListMap__
