#ifndef RBBITBLB57_H
#define RBBITBLB57_H
#include "unicode/utypes.h"
#include "unicode/uobject.h"
#include "uvectr32.h"
#include "rbbitblb.h"
#include "rbbi57.h"
#include "rbbinode.h"
U_NAMESPACE_BEGIN
class RBBIRuleScanner57;
class RBBIRuleBuilder57;
class UVector32;
class RBBITableBuilder57 : public UMemory {
public:
RBBITableBuilder57(RBBIRuleBuilder57 *rb, RBBINode **rootNode);
~RBBITableBuilder57();
void build();
int32_t getTableSize() const; void exportTable(void *where);
private:
void calcNullable(RBBINode *n);
void calcFirstPos(RBBINode *n);
void calcLastPos(RBBINode *n);
void calcFollowPos(RBBINode *n);
void calcChainedFollowPos(RBBINode *n);
void bofFixup();
void buildStateTable();
void flagAcceptingStates();
void flagLookAheadStates();
void flagTaggedStates();
void mergeRuleStatusVals();
void addRuleRootNodes(UVector *dest, RBBINode *node);
void setAdd(UVector *dest, UVector *source);
UBool setEquals(UVector *a, UVector *b);
void sortedAdd(UVector **dest, int32_t val);
public:
#ifdef RBBI_DEBUG
void printSet(UVector *s);
void printPosSets(RBBINode *n );
void printStates();
void printRuleStatusTable();
#else
#define printSet(s)
#define printPosSets(n)
#define printStates()
#define printRuleStatusTable()
#endif
private:
RBBIRuleBuilder57 *fRB;
RBBINode *&fTree; UErrorCode *fStatus;
UVector *fDStates;
RBBITableBuilder57(const RBBITableBuilder57 &other); RBBITableBuilder57 &operator=(const RBBITableBuilder57 &other); };
U_NAMESPACE_END
#endif