⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 set.h

📁 compiler
💻 H
字号:
/*@A (C) 1992 Allen I. Holub                                                */
#ifndef __SET_H
#define __SET_H
#include <tools/debug.h>

typedef unsigned short     _SETTYPE ;		   /* one cell in bit map   */

#define _BITS_IN_WORD      16
#define _BYTES_IN_ARRAY(x) (x << 1)		   /* # of bytes in bit map */
#define _DIV_WSIZE(x)      ((unsigned)(x) >> 4)
#define _MOD_WSIZE(x)      ((x) & 0x0f	      )
#define _DEFWORDS  8				 /* elements in default set */
#define _DEFBITS    (_DEFWORDS * _BITS_IN_WORD)	 /* bits in default set	    */
#define _ROUND(bit) (((_DIV_WSIZE(bit) + 8) >>3 ) <<3 )

typedef struct _set_
{
    unsigned char nwords ;		/* Number of words in map	  */
    unsigned char compl	 ;		/* is a negative true set if true */
    unsigned	  nbits  ;		/* Number of bits in map	  */
    _SETTYPE      *map   ;		/* Pointer to the map		  */
    _SETTYPE      defmap[ _DEFWORDS ];	/* The map itself		  */

} SET;


typedef int	(*pset_t)	P(( void* param, char *fmt, int val ));
extern	int	 _addset	P(( SET* , int		 	 ));
extern	void	 delset		P(( SET*			 ));
extern  SET	 *dupset	P(( SET*			 ));
extern  void	 invert		P(( SET*			 ));
extern	SET	 *newset	P(( void			 ));
extern	int	 next_member	P(( SET *			 ));
extern	int	 num_ele	P(( SET*		   	 ));
extern	void	 pset		P(( SET*, pset_t, void* 	 ));
extern	void	 _set_op	P(( int,	SET*, SET* 	 ));
extern	int	 _set_test	P(( SET*, SET*		 	 ));
extern  int	 setcmp		P(( SET*, SET*		 	 ));
extern  unsigned sethash	P(( SET*			 ));
extern	int	 subset		P(( SET*, SET*		 	 ));
extern  void	 truncate	P(( SET*			 ));

				/* Op argument passed to _set_op */
#define _UNION		0	/* x is in s1 or s2		*/
#define _INTERSECT	1	/* x is in s1 and s2		*/
#define _DIFFERENCE	2	/* (x in s1) && (x not in s2)	*/
#define _ASSIGN		4	/* s1 = s2			*/

#define UNION(d,s)         _set_op( _UNION,	 d, s )
#define INTERSECT(d,s)     _set_op( _INTERSECT,  d, s )
#define DIFFERENCE(d,s)    _set_op( _DIFFERENCE, d, s )
#define ASSIGN(d,s)	   _set_op( _ASSIGN,     d, s )

#define CLEAR(s) 	memset( (s)->map,  0, (s)->nwords * sizeof(_SETTYPE))
#define FILL(s)  	memset( (s)->map, ~0, (s)->nwords * sizeof(_SETTYPE))
#define COMPLEMENT(s)	( (s)->compl = ~(s)->compl )
#define INVERT(s)	invert(s)

#define _SET_EQUIV	0      /* Value returned from _set_test, equivalent   */
#define _SET_DISJ	1      /*				 disjoint     */
#define _SET_INTER	2      /*				 intersecting */

#define IS_DISJOINT(s1,s2)     ( _set_test(s1,s2) == _SET_DISJ 	)
#define IS_INTERSECTING(s1,s2) ( _set_test(s1,s2) == _SET_INTER	)
#define IS_EQUIVALENT(a,b)     ( setcmp((a),(b))  == 0		)
#define IS_EMPTY(s)	       ( num_ele(s) 	  == 0		)

/* All of the following have heavy-duty side-effects. Be careful. */

#define _GBIT(s,x,op) ( ((s)->map)[_DIV_WSIZE(x)] op (1 << _MOD_WSIZE(x)) )

#define REMOVE(s,x)  (((x) >= (s)->nbits) ? 0		 : _GBIT(s,x,&= ~) )
#define ADD(s,x)     (((x) >= (s)->nbits) ? _addset(s,x) : _GBIT(s,x,|=  ) )
#define MEMBER(s,x)  (((x) >= (s)->nbits) ? 0		 : _GBIT(s,x,&   ) )
#define TEST(s,x)    (( MEMBER(s,x) )     ? !(s)->compl	 : (s)->compl 	   )

#endif /* __SET_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -