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

#ifndef __gnu_xml_transform_Bindings__
#define __gnu_xml_transform_Bindings__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace transform
      {
          class Bindings;
          class Stylesheet;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace namespace$
      {
          class QName;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class Node;
      }
    }
  }
}

class gnu::xml::transform::Bindings : public ::java::lang::Object
{

public: // actually package-private
  Bindings(::gnu::xml::transform::Stylesheet *);
public:
  virtual ::java::lang::Object * clone();
public: // actually package-private
  virtual void push(jint);
  virtual void pop(jint);
public:
  virtual jboolean containsKey(::javax::xml::namespace$::QName *, jint);
  virtual ::java::lang::Object * get(::javax::xml::namespace$::QName *, ::org::w3c::dom::Node *, jint, jint);
public: // actually package-private
  virtual void set(::javax::xml::namespace$::QName *, ::java::lang::Object *, jint);
public:
  virtual ::java::lang::Object * resolveVariable(::javax::xml::namespace$::QName *);
  virtual ::java::lang::String * toString();
public: // actually package-private
  static const jint VARIABLE = 0;
  static const jint PARAM = 1;
  static const jint WITH_PARAM = 2;
  ::gnu::xml::transform::Stylesheet * __attribute__((aligned(__alignof__( ::java::lang::Object)))) stylesheet;
  ::java::util::LinkedList * variables;
  ::java::util::LinkedList * parameters;
  ::java::util::LinkedList * withParameters;
  jboolean global;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_transform_Bindings__
