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

#ifndef __gnu_xml_xpath_Selector__
#define __gnu_xml_xpath_Selector__

#pragma interface

#include <gnu/xml/xpath/Path.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace xpath
      {
          class Expr;
          class Selector;
          class Test;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace namespace
      {
          class QName;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class Node;
      }
    }
  }
}

class gnu::xml::xpath::Selector : public ::gnu::xml::xpath::Path
{

public:
  Selector(jint, ::java::util::List *);
  JArray< ::gnu::xml::xpath::Test * > * getTests();
  jboolean matches(::org::w3c::dom::Node *);
public: // actually package-private
  jboolean matches(::org::w3c::dom::Node *, jint, jint);
private:
  jint getContextPosition(::org::w3c::dom::Node *);
  jint getContextSize(::org::w3c::dom::Node *);
public:
  ::java::lang::Object * evaluate(::org::w3c::dom::Node *, jint, jint);
public: // actually package-private
  ::java::util::Collection * evaluate(::org::w3c::dom::Node *, ::java::util::Collection *);
  ::java::util::List * filterCandidates(::java::util::List *, jboolean);
  void addCandidates(::org::w3c::dom::Node *, ::java::util::Collection *);
  void addChildNodes(::org::w3c::dom::Node *, ::java::util::Collection *, jboolean);
  void addParentNode(::org::w3c::dom::Node *, ::java::util::Collection *, jboolean);
  void addFollowingNodes(::org::w3c::dom::Node *, ::java::util::Collection *, jboolean);
  void addPrecedingNodes(::org::w3c::dom::Node *, ::java::util::Collection *, jboolean);
  void addAttributes(::org::w3c::dom::Node *, ::java::util::Collection *);
  void addNamespaceAttributes(::org::w3c::dom::Node *, ::java::util::Collection *);
  jboolean isNamespaceAttribute(::org::w3c::dom::Node *);
public:
  ::gnu::xml::xpath::Expr * clone(::java::lang::Object *);
  jboolean references(::javax::xml::namespace::QName *);
  ::java::lang::String * toString();
  static const jint ANCESTOR = 0;
  static const jint ANCESTOR_OR_SELF = 1;
  static const jint ATTRIBUTE = 2;
  static const jint CHILD = 3;
  static const jint DESCENDANT = 4;
  static const jint DESCENDANT_OR_SELF = 5;
  static const jint FOLLOWING = 6;
  static const jint FOLLOWING_SIBLING = 7;
  static const jint NAMESPACE = 8;
  static const jint PARENT = 9;
  static const jint PRECEDING = 10;
  static const jint PRECEDING_SIBLING = 11;
  static const jint SELF = 12;
public: // actually package-private
  jint __attribute__((aligned(__alignof__( ::gnu::xml::xpath::Path)))) axis;
  JArray< ::gnu::xml::xpath::Test * > * tests;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_xpath_Selector__
