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

#ifndef __java_text_RuleBasedCollator__
#define __java_text_RuleBasedCollator__

#pragma interface

#include <java/text/Collator.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace text
    {
        class CharacterIterator;
        class CollationElementIterator;
        class CollationKey;
        class RuleBasedCollator;
        class RuleBasedCollator$CollationElement;
    }
  }
}

class java::text::RuleBasedCollator : public ::java::text::Collator
{

public:
  RuleBasedCollator(::java::lang::String *);
public: // actually package-private
  static jint findPrefixLength(::java::lang::String *, ::java::lang::String *);
private:
  void mergeRules(jint, ::java::lang::String *, ::java::util::ArrayList *, ::java::util::ArrayList *);
  jint subParseString(jboolean, ::java::util::ArrayList *, jint, ::java::lang::String *);
public:
  virtual ::java::lang::Object * clone();
private:
  ::java::util::ArrayList * parseString(::java::lang::String *);
  void buildCollationVector(::java::util::ArrayList *);
  void buildPrefixAccess();
public:
  virtual jint compare(::java::lang::String *, ::java::lang::String *);
  virtual jboolean equals(::java::lang::Object *);
public: // actually package-private
  virtual ::java::text::RuleBasedCollator$CollationElement * getDefaultElement(jchar);
  virtual ::java::text::RuleBasedCollator$CollationElement * getDefaultAccentedElement(jchar);
public:
  virtual ::java::text::CollationElementIterator * getCollationElementIterator(::java::lang::String *);
  virtual ::java::text::CollationElementIterator * getCollationElementIterator(::java::text::CharacterIterator *);
  virtual ::java::text::CollationKey * getCollationKey(::java::lang::String *);
  virtual ::java::lang::String * getRules();
  virtual jint hashCode();
private:
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::text::Collator)))) rules;
  JArray< ::java::text::RuleBasedCollator$CollationElement * > * ce_table;
public: // actually package-private
  ::java::util::HashMap * prefix_tree;
private:
  jint last_primary_value;
  jint last_tertiary_value;
  jboolean inverseAccentComparison;
public: // actually package-private
  static ::java::text::RuleBasedCollator$CollationElement * SPECIAL_UNKNOWN_SEQ;
public:
  static ::java::lang::Class class$;
};

#endif // __java_text_RuleBasedCollator__
