typedef unsigned long IPaddress;
typedef int codomain;

#define MTBDD_NODE_VALUE -1
#define MTBDD_UNDEFINED_VALUE -1
#define MTBDD_NOT_ENOUGH_BITS -2

typedef union _mtbdd
{
  int value;
  struct mtbdd_node
  {
    int node_value;
    union _mtbdd *subtrees[2];
  } node;
} MTBDD;

#define MTBDD_ERR_DUPLICATE

MTBDD* const mtbdd_empty;

extern int mtbdd_malloced_blocks;

MTBDD* mtbdd_add(MTBDD *bdd, IPaddress key, int netmask, int value);
int mtbdd_find(MTBDD *bdd, IPaddress key, int netmask);
void mtbdd_print(FILE *fp, char *buffer, int size, int i, MTBDD *bdd);
int mtbdd_size(MTBDD *bdd);
void mtbdd_delete(MTBDD *bdd);
int mtbdd_save(const char *filename, const MTBDD *bdd);
MTBDD *mtbdd_read(const char *filename);
