Skip to content
Snippets Groups Projects
sets.h 2.14 KiB
#ifndef _H_sets
#define _H_sets

#include <stdio.h>
#include <stdlib.h>

/* Les deux segmets initiaux pour stocker le cardinal et la taille. */
#define SEGMARGIN 2


typedef unsigned int TYPESEG; /* Type d'un segment. */
typedef TYPESEG *SET; /* Un ensemble. */

extern int Cardinal[];

/*
 * Prototypes.
 */

SET allocSet(int);
void copySet(SET, SET);
SET makeSet(int *S, int nb, SET E);
int nCommuns(SET , SET );
int nFaitsCommunsInSet(SET s1, SET s2);
void freeSet(SET);
char setsIntersect(SET, SET);
void addSet(SET, SET);
int isSubSet(SET, SET);
int isSupSet(SET, SET);
void clearSet(SET);
void FillSet(SET s, int n);
void FactsLevelToSet(int * F, int nf, SET S);


/*
 * Macros.
 */

#define SIZESEG 32

#define CARD(s) *(s)
#define TAILLE(s) *((s)+1) /* Nombre de segments. */

#define IS_EMPTY(s) (*(s) == 0)

#define IN(e,s) ((*((s)+(e)/SIZESEG+SEGMARGIN)&((TYPESEG) 1)<<((e)%SIZESEG)) != ((TYPESEG) 0))
#define ADDe(e,s) if (!IN((e),(s))) {*((s)+(e)/SIZESEG+SEGMARGIN) |= (TYPESEG) (((TYPESEG) 1)<<((e)%SIZESEG)); (CARD(s))++;}
#define RETe(e,s) if (IN((e),(s))) {*((s)+(e)/SIZESEG+SEGMARGIN) ^= ((TYPESEG) 1)<<((e)%SIZESEG); (CARD(s))--;}
#define CALCARD(s) {\
  int iCALCARD,nCALCARD;\
  unsigned char *pCALCARD;\
  for (iCALCARD=0, pCALCARD=(unsigned char *) ((s)+SEGMARGIN), nCALCARD=0; iCALCARD < TAILLE(s); pCALCARD+=4, iCALCARD++)\
     nCALCARD+=Cardinal[*pCALCARD]+Cardinal[*(pCALCARD+1)]+Cardinal[*(pCALCARD+2)]+Cardinal[*(pCALCARD+3)];\
  CARD(s) = nCALCARD;\
}

#define ADDs(s1,s2) {\
 int iADDs;\
 for (iADDs=SEGMARGIN; iADDs < TAILLE(s2)+SEGMARGIN; iADDs++)\
 *((s2)+iADDs) |= *((s1)+iADDs);\
 CALCARD(s2)\
 }
#define RETs(s1,s2) {\
 int iRETs;\
 for (iRETs=SEGMARGIN; iRETs < TAILLE(s2)+SEGMARGIN; iRETs++)\
 *((s2)+iRETs) &= ~*((s1)+iRETs);\
 CALCARD(s2)\
 }
#define INTERs(s1,s2) {\
    int iINTERs;					\
    for (iINTERs=SEGMARGIN; iINTERs < TAILLE(s2)+SEGMARGIN; iINTERs++)	\
      *((s2)+iINTERs) &= *((s1)+iINTERs);		\
    CALCARD(s2)						\
      }

#define AFFSET(s) {\
 int iAFFSET;\
 printf("[%ld/%ld]  ",CARD(s),TAILLE(s));\
 for (iAFFSET=0; iAFFSET<TAILLE(s)*SIZESEG; iAFFSET++)\
 if IN(iAFFSET,s)\
 printf("%5ld",iAFFSET);\
 printf("\n");\
 }
#endif