/*************************************************************************
*									 *
*	 YAP Prolog 	%W% %G%
*									 *
*	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
*									 *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
*									 *
**************************************************************************
*									 *
* File:		index.h							 *
* Last rev:								 *
* mods:									 *
* comments:	indexation info						 *
*									 *
*************************************************************************/

/* allowed types for clauses */
typedef enum clause_type_enum {
  pair_clause = 0x01,
  struct_clause = 0x02,
  atom_clause = 0x04,
  int_clause = 0x08,
  flt_clause = 0x10,
  lgint_clause = 0x20,
  dbref_clause = 0x40
} clause_type;

/* Four types of Clauses */
#define MaxOptions 4

/* Minimum number of clauses needed to build an hash table */
/* must be a power of two */
#define MIN_HASH_ENTRIES 4

#define HASH_SHIFT 6

/* Intermediate Data structures,
   used to build the indexing code */

/* Used to store all important information about a clause */
typedef struct StructClauseDef {

  Term Tag;           /* if nonvar or nonlist, first argument */
  yamop *Code;        /* start of code for clause */
  yamop *CurrentCode; /* start of code for clause */
  union {
    yamop *WorkPC; /* start of code for clause */
    Term t_ptr;
    CELL *c_sreg;
  } ucd;
} ClauseDef;

/* Relevant information for groups */
typedef struct {
  ClauseDef *FirstClause;
  ClauseDef *LastClause;
  UInt VarClauses;
  UInt AtomClauses;
  UInt PairClauses;
  UInt StructClauses;
  UInt TestClauses;
} GroupDef;

/* switch_on_cons */
typedef struct {
  Term Tag;
  union {
    UInt Label;
    yamop *labp;
  } u_a;
} AtomSwiEntry;

/* switch_on_func */
typedef struct {
  Functor Tag;
  union {
    UInt Label;
    yamop *labp;
  } u_f;
} FuncSwiEntry;

/* switch_on_type */
typedef struct {
  UInt PairEntry;
  UInt ConstEntry;
  UInt FuncEntry;
  UInt VarEntry;
} TypeSwitch;

#define MAX_REG_COPIES 32

typedef struct {
  Int pos;
  Term val;
  Term extra;
} istack_entry;

typedef enum { pc_entry, block_entry } add2index_entries;

typedef struct {
  add2index_entries flag;
  union {
    struct {
      yamop **pi_pc;
      yamop *code, *current_code, *work_pc;
      Term tag;
    } pce;
    struct {
      ClauseUnion *block;
      yamop **entry_code;
    } cle;
  } uip;
} path_stack_entry;

#define MAX_ISTACK_DEPTH 32

typedef enum { REFRESH, RECORDA, RECORDZ } expand_values;