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

#ifndef __java_util_TreeMap$SubMap$NavigableKeySet__
#define __java_util_TreeMap$SubMap$NavigableKeySet__

#pragma interface

#include <java/util/TreeMap$SubMap$KeySet.h>

class java::util::TreeMap$SubMap$NavigableKeySet : public ::java::util::TreeMap$SubMap$KeySet
{

  TreeMap$SubMap$NavigableKeySet(::java::util::TreeMap$SubMap *);
public:
  ::java::lang::Object * ceiling(::java::lang::Object *);
  ::java::util::Comparator * comparator();
  ::java::util::Iterator * descendingIterator();
  ::java::util::NavigableSet * descendingSet();
  ::java::lang::Object * first();
  ::java::lang::Object * floor(::java::lang::Object *);
  ::java::util::SortedSet * headSet(::java::lang::Object *);
  ::java::util::NavigableSet * headSet(::java::lang::Object *, jboolean);
  ::java::lang::Object * higher(::java::lang::Object *);
  ::java::lang::Object * last();
  ::java::lang::Object * lower(::java::lang::Object *);
  ::java::lang::Object * pollFirst();
  ::java::lang::Object * pollLast();
  ::java::util::SortedSet * subSet(::java::lang::Object *, ::java::lang::Object *);
  ::java::util::NavigableSet * subSet(::java::lang::Object *, jboolean, ::java::lang::Object *, jboolean);
  ::java::util::SortedSet * tailSet(::java::lang::Object *);
  ::java::util::NavigableSet * tailSet(::java::lang::Object *, jboolean);
public: // actually package-private
  TreeMap$SubMap$NavigableKeySet(::java::util::TreeMap$SubMap *, ::java::util::TreeMap$SubMap$NavigableKeySet *);
  ::java::util::TreeMap$SubMap * __attribute__((aligned(__alignof__( ::java::util::TreeMap$SubMap$KeySet)))) this$1;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_TreeMap$SubMap$NavigableKeySet__
