1 /* Functions to support link list bitsets.
2 Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
30 /* This file implements linked-list bitsets. These bitsets can be of
31 arbitrary length and are more efficient than arrays of bits for
34 Usually if all the bits in an element are zero we remove the element
35 from the list. However, a side effect of the bit caching is that we
36 do not always notice when an element becomes zero. Hence the
37 lbitset_weed function which removes zero elements. */
40 /* Number of words to use for each element. The larger the value the
41 greater the size of the cache and the shorter the time to find a given bit
42 but the more memory wasted for sparse bitsets and the longer the time
43 to search for set bits. */
45 #define LBITSET_ELT_WORDS 2
47 typedef bitset_word lbitset_word
;
49 #define LBITSET_WORD_BITS BITSET_WORD_BITS
51 /* Number of bits stored in each element. */
52 #define LBITSET_ELT_BITS \
53 ((unsigned) (LBITSET_ELT_WORDS * LBITSET_WORD_BITS))
55 /* Lbitset element. We use an array of bits for each element.
56 These are linked together in a doubly-linked list. */
57 typedef struct lbitset_elt_struct
59 struct lbitset_elt_struct
*next
; /* Next element. */
60 struct lbitset_elt_struct
*prev
; /* Previous element. */
61 bitset_windex index
; /* bitno / BITSET_WORD_BITS. */
62 bitset_word words
[LBITSET_ELT_WORDS
]; /* Bits that are set. */
67 enum lbitset_find_mode
68 { LBITSET_FIND
, LBITSET_CREATE
, LBITSET_SUBST
};
70 static lbitset_elt lbitset_zero_elts
[3]; /* Elements of all zero bits. */
72 /* Obstack to allocate bitset elements from. */
73 static struct obstack lbitset_obstack
;
74 static bool lbitset_obstack_init
= false;
75 static lbitset_elt
*lbitset_free_list
; /* Free list of bitset elements. */
77 extern void debug_lbitset
PARAMS ((bitset
));
79 #define LBITSET_CURRENT1(X) \
80 ((lbitset_elt *) (void *) ((char *) (X) - offsetof (lbitset_elt, words)))
82 #define LBITSET_CURRENT(X) LBITSET_CURRENT1((X)->b.cdata)
84 #define LBITSET_HEAD(X) ((X)->l.head)
85 #define LBITSET_TAIL(X) ((X)->l.tail)
87 /* Allocate a lbitset element. The bits are not cleared. */
88 static inline lbitset_elt
*
89 lbitset_elt_alloc (void)
93 if (lbitset_free_list
!= 0)
95 elt
= lbitset_free_list
;
96 lbitset_free_list
= elt
->next
;
100 if (!lbitset_obstack_init
)
102 lbitset_obstack_init
= true;
104 /* Let particular systems override the size of a chunk. */
106 #ifndef OBSTACK_CHUNK_SIZE
107 #define OBSTACK_CHUNK_SIZE 0
110 /* Let them override the alloc and free routines too. */
112 #ifndef OBSTACK_CHUNK_ALLOC
113 #define OBSTACK_CHUNK_ALLOC xmalloc
116 #ifndef OBSTACK_CHUNK_FREE
117 #define OBSTACK_CHUNK_FREE free
120 #if !defined(__GNUC__) || (__GNUC__ < 2)
121 #define __alignof__(type) 0
124 obstack_specify_allocation (&lbitset_obstack
, OBSTACK_CHUNK_SIZE
,
125 __alignof__ (lbitset_elt
),
126 (void *(*)PARAMS ((long)))
128 (void (*)PARAMS ((void *)))
132 /* Perhaps we should add a number of new elements to the free
134 elt
= (lbitset_elt
*) obstack_alloc (&lbitset_obstack
,
135 sizeof (lbitset_elt
));
142 /* Allocate a lbitset element. The bits are cleared. */
143 static inline lbitset_elt
*
144 lbitset_elt_calloc (void)
148 elt
= lbitset_elt_alloc ();
149 memset (elt
->words
, 0, sizeof (elt
->words
));
155 lbitset_elt_free (lbitset_elt
*elt
)
157 elt
->next
= lbitset_free_list
;
158 lbitset_free_list
= elt
;
162 /* Unlink element ELT from bitset BSET. */
164 lbitset_elt_unlink (bitset bset
, lbitset_elt
*elt
)
166 lbitset_elt
*next
= elt
->next
;
167 lbitset_elt
*prev
= elt
->prev
;
175 if (LBITSET_HEAD (bset
) == elt
)
176 LBITSET_HEAD (bset
) = next
;
177 if (LBITSET_TAIL (bset
) == elt
)
178 LBITSET_TAIL (bset
) = prev
;
180 /* Update cache pointer. Since the first thing we try is to insert
181 before current, make current the next entry in preference to the
183 if (LBITSET_CURRENT (bset
) == elt
)
187 bset
->b
.cdata
= next
->words
;
188 bset
->b
.cindex
= next
->index
;
192 bset
->b
.cdata
= prev
->words
;
193 bset
->b
.cindex
= prev
->index
;
202 lbitset_elt_free (elt
);
206 /* Cut the chain of bitset BSET before element ELT and free the
209 lbitset_prune (bitset bset
, lbitset_elt
*elt
)
218 LBITSET_TAIL (bset
) = elt
->prev
;
219 bset
->b
.cdata
= elt
->prev
->words
;
220 bset
->b
.cindex
= elt
->prev
->index
;
225 LBITSET_HEAD (bset
) = 0;
226 LBITSET_TAIL (bset
) = 0;
231 for (; elt
; elt
= next
)
234 lbitset_elt_free (elt
);
239 /* Are all bits in an element zero? */
241 lbitset_elt_zero_p (lbitset_elt
*elt
)
245 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++)
253 /* Link the bitset element into the current bitset linked list. */
255 lbitset_elt_link (bitset bset
, lbitset_elt
*elt
)
257 bitset_windex windex
= elt
->index
;
259 lbitset_elt
*current
;
262 current
= LBITSET_CURRENT (bset
);
264 current
= LBITSET_HEAD (bset
);
266 /* If this is the first and only element, add it in. */
267 if (LBITSET_HEAD (bset
) == 0)
269 elt
->next
= elt
->prev
= 0;
270 LBITSET_HEAD (bset
) = elt
;
271 LBITSET_TAIL (bset
) = elt
;
274 /* If this index is less than that of the current element, it goes
275 somewhere before the current element. */
276 else if (windex
< bset
->b
.cindex
)
279 ptr
->prev
&& ptr
->prev
->index
> windex
; ptr
= ptr
->prev
)
283 ptr
->prev
->next
= elt
;
285 LBITSET_HEAD (bset
) = elt
;
287 elt
->prev
= ptr
->prev
;
292 /* Otherwise, it must go somewhere after the current element. */
296 ptr
->next
&& ptr
->next
->index
< windex
; ptr
= ptr
->next
)
300 ptr
->next
->prev
= elt
;
302 LBITSET_TAIL (bset
) = elt
;
304 elt
->next
= ptr
->next
;
309 /* Set up so this is the first element searched. */
310 bset
->b
.cindex
= windex
;
311 bset
->b
.csize
= LBITSET_ELT_WORDS
;
312 bset
->b
.cdata
= elt
->words
;
317 lbitset_elt_find (bitset bset
, bitset_windex windex
,
318 enum lbitset_find_mode mode
)
321 lbitset_elt
*current
;
325 current
= LBITSET_CURRENT (bset
);
326 /* Check if element is the cached element. */
327 if ((windex
- bset
->b
.cindex
) < bset
->b
.csize
)
332 current
= LBITSET_HEAD (bset
);
337 if (windex
< bset
->b
.cindex
)
340 elt
->prev
&& elt
->index
> windex
; elt
= elt
->prev
)
346 elt
->next
&& (elt
->index
+ LBITSET_ELT_WORDS
- 1) < windex
;
351 /* ELT is the nearest to the one we want. If it's not the one
352 we want, the one we want does not exist. */
353 if (elt
&& (windex
- elt
->index
) < LBITSET_ELT_WORDS
)
355 bset
->b
.cindex
= elt
->index
;
356 bset
->b
.csize
= LBITSET_ELT_WORDS
;
357 bset
->b
.cdata
= elt
->words
;
368 windex
-= windex
% LBITSET_ELT_WORDS
;
370 elt
= lbitset_elt_calloc ();
372 lbitset_elt_link (bset
, elt
);
376 return &lbitset_zero_elts
[0];
384 /* Weed out the zero elements from the list. */
386 lbitset_weed (bitset bset
)
391 for (elt
= LBITSET_HEAD (bset
); elt
; elt
= next
)
394 if (lbitset_elt_zero_p (elt
))
395 lbitset_elt_unlink (bset
, elt
);
400 /* Set all bits in the bitset to zero. */
402 lbitset_zero (bitset bset
)
406 head
= LBITSET_HEAD (bset
);
410 /* Clear a bitset by freeing the linked list at the head element. */
411 lbitset_prune (bset
, head
);
417 lbitset_equal_p (bitset dst
, bitset src
)
428 for (selt
= LBITSET_HEAD (src
), delt
= LBITSET_HEAD (dst
);
429 selt
&& delt
; selt
= selt
->next
, delt
= delt
->next
)
431 if (selt
->index
!= delt
->index
)
434 for (j
= 0; j
< LBITSET_ELT_WORDS
; j
++)
435 if (delt
->words
[j
] != selt
->words
[j
])
438 return !selt
&& !delt
;
442 /* Copy bits from bitset SRC to bitset DST. */
444 lbitset_copy (bitset dst
, bitset src
)
456 head
= LBITSET_HEAD (src
);
461 for (elt
= head
; elt
; elt
= elt
->next
)
463 tmp
= lbitset_elt_alloc ();
464 tmp
->index
= elt
->index
;
470 LBITSET_HEAD (dst
) = tmp
;
473 memcpy (tmp
->words
, elt
->words
, sizeof (elt
->words
));
475 LBITSET_TAIL (dst
) = tmp
;
477 dst
->b
.csize
= LBITSET_ELT_WORDS
;
478 dst
->b
.cdata
= LBITSET_HEAD (dst
)->words
;
479 dst
->b
.cindex
= LBITSET_HEAD (dst
)->index
;
483 /* Copy bits from bitset SRC to bitset DST. Return true if
484 bitsets different. */
486 lbitset_copy_cmp (bitset dst
, bitset src
)
491 if (!LBITSET_HEAD (dst
))
493 lbitset_copy (dst
, src
);
494 return LBITSET_HEAD (src
) != 0;
497 if (lbitset_equal_p (dst
, src
))
500 lbitset_copy (dst
, src
);
505 /* Return size in bits of bitset SRC. */
507 lbitset_size (bitset src
)
511 elt
= LBITSET_TAIL (src
);
515 /* Return current size of bitset in bits. */
516 return (elt
->index
+ LBITSET_ELT_WORDS
) * BITSET_WORD_BITS
;
520 /* Set bit BITNO in bitset DST. */
522 lbitset_set (bitset dst
, bitset_bindex bitno
)
524 bitset_windex windex
= bitno
/ BITSET_WORD_BITS
;
526 lbitset_elt_find (dst
, windex
, LBITSET_CREATE
);
528 dst
->b
.cdata
[windex
- dst
->b
.cindex
] |=
529 (bitset_word
) 1 << (bitno
% BITSET_WORD_BITS
);
533 /* Reset bit BITNO in bitset DST. */
535 lbitset_reset (bitset dst
, bitset_bindex bitno
)
537 bitset_windex windex
= bitno
/ BITSET_WORD_BITS
;
539 if (!lbitset_elt_find (dst
, windex
, LBITSET_FIND
))
542 dst
->b
.cdata
[windex
- dst
->b
.cindex
] &=
543 ~((bitset_word
) 1 << (bitno
% BITSET_WORD_BITS
));
545 /* If all the data is zero, perhaps we should unlink it now... */
549 /* Test bit BITNO in bitset SRC. */
551 lbitset_test (bitset src
, bitset_bindex bitno
)
553 bitset_windex windex
= bitno
/ BITSET_WORD_BITS
;
555 return (lbitset_elt_find (src
, windex
, LBITSET_FIND
)
556 && ((src
->b
.cdata
[windex
- src
->b
.cindex
]
557 >> (bitno
% BITSET_WORD_BITS
))
563 lbitset_free (bitset bset
)
569 /* Find list of up to NUM bits set in BSET starting from and including
570 *NEXT and store in array LIST. Return with actual number of bits
571 found and with *NEXT indicating where search stopped. */
573 lbitset_list_reverse (bitset bset
, bitset_bindex
*list
,
574 bitset_bindex num
, bitset_bindex
*next
)
576 bitset_bindex rbitno
;
579 bitset_bindex boffset
;
580 bitset_windex windex
;
584 bitset_bindex n_bits
;
586 elt
= LBITSET_TAIL (bset
);
590 n_bits
= (elt
->index
+ LBITSET_ELT_WORDS
) * BITSET_WORD_BITS
;
593 if (rbitno
>= n_bits
)
596 bitno
= n_bits
- (rbitno
+ 1);
598 windex
= bitno
/ BITSET_WORD_BITS
;
600 /* Skip back to starting element. */
601 for (; elt
&& elt
->index
> windex
; elt
= elt
->prev
)
607 if (windex
>= elt
->index
+ LBITSET_ELT_WORDS
)
609 /* We are trying to start in no-mans land so start
610 at end of current elt. */
611 bcount
= BITSET_WORD_BITS
- 1;
612 windex
= elt
->index
+ LBITSET_ELT_WORDS
- 1;
616 bcount
= bitno
% BITSET_WORD_BITS
;
620 boffset
= windex
* BITSET_WORD_BITS
;
622 /* If num is 1, we could speed things up with a binary search
623 of the word of interest. */
627 bitset_word
*srcp
= elt
->words
;
629 for (; (windex
- elt
->index
) < LBITSET_ELT_WORDS
;
630 windex
--, boffset
-= BITSET_WORD_BITS
,
631 bcount
= BITSET_WORD_BITS
- 1)
634 srcp
[windex
- elt
->index
] << (BITSET_WORD_BITS
- 1 - bcount
);
636 for (; word
; bcount
--)
638 if (word
& BITSET_MSB
)
640 list
[count
++] = boffset
+ bcount
;
643 *next
= n_bits
- (boffset
+ bcount
);
654 windex
= elt
->index
+ LBITSET_ELT_WORDS
- 1;
655 boffset
= windex
* BITSET_WORD_BITS
;
659 *next
= n_bits
- (boffset
+ 1);
664 /* Find list of up to NUM bits set in BSET starting from and including
665 *NEXT and store in array LIST. Return with actual number of bits
666 found and with *NEXT indicating where search stopped. */
668 lbitset_list (bitset bset
, bitset_bindex
*list
,
669 bitset_bindex num
, bitset_bindex
*next
)
672 bitset_windex windex
;
678 head
= LBITSET_HEAD (bset
);
687 /* This is the most common case. */
689 /* Start with the first element. */
692 bitno
= windex
* BITSET_WORD_BITS
;
696 windex
= bitno
/ BITSET_WORD_BITS
;
698 /* Skip to starting element. */
700 elt
&& (elt
->index
+ LBITSET_ELT_WORDS
- 1) < windex
;
707 if (windex
< elt
->index
)
710 bitno
= windex
* BITSET_WORD_BITS
;
714 bitset_word
*srcp
= elt
->words
;
716 /* We are starting within an element. */
718 for (; (windex
- elt
->index
) < LBITSET_ELT_WORDS
; windex
++)
720 word
= srcp
[windex
- elt
->index
] >> (bitno
% BITSET_WORD_BITS
);
722 for (; word
; bitno
++)
726 list
[count
++] = bitno
;
735 bitno
= (windex
+ 1) * BITSET_WORD_BITS
;
742 bitno
= windex
* BITSET_WORD_BITS
;
748 /* If num is 1, we could speed things up with a binary search
749 of the word of interest. */
754 bitset_word
*srcp
= elt
->words
;
756 if ((count
+ LBITSET_ELT_BITS
) < num
)
758 /* The coast is clear, plant boot! */
760 #if LBITSET_ELT_WORDS == 2
764 if (!(word
& 0xffff))
774 for (; word
; bitno
++)
777 list
[count
++] = bitno
;
782 bitno
= windex
* BITSET_WORD_BITS
;
787 if (!(word
& 0xffff))
792 for (; word
; bitno
++)
795 list
[count
++] = bitno
;
800 bitno
= windex
* BITSET_WORD_BITS
;
802 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++)
807 if (!(word
& 0xffff))
817 for (; word
; bitno
++)
820 list
[count
++] = bitno
;
825 bitno
= windex
* BITSET_WORD_BITS
;
831 /* Tread more carefully since we need to check
832 if array overflows. */
834 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++)
836 for (word
= srcp
[i
]; word
; bitno
++)
840 list
[count
++] = bitno
;
850 bitno
= windex
* BITSET_WORD_BITS
;
858 bitno
= windex
* BITSET_WORD_BITS
;
868 lbitset_empty_p (bitset dst
)
871 return !LBITSET_HEAD (dst
);
876 lbitset_ones (bitset dst
)
879 bitset_windex windex
;
882 /* This is a decidedly unfriendly operation for a linked list
883 bitset! It makes a sparse bitset become dense. An alternative
884 is to have a flag that indicates that the bitset stores the
885 complement of what it indicates. */
886 elt
= LBITSET_TAIL (dst
);
887 /* Ignore empty set. */
892 for (i
= 0; i
< windex
; i
+= LBITSET_ELT_WORDS
)
894 /* Create new elements if they cannot be found. */
895 elt
= lbitset_elt_find (dst
, i
, LBITSET_CREATE
);
896 memset (elt
->words
, -1, sizeof (elt
->words
));
902 lbitset_not (bitset dst
, bitset src
)
909 bitset_windex windex
;
911 /* This is another unfriendly operation for a linked list
913 elt
= LBITSET_TAIL (dst
);
914 /* Ignore empty set. */
919 for (i
= 0; i
< windex
; i
+= LBITSET_ELT_WORDS
)
921 /* Create new elements for dst if they cannot be found
922 or substitute zero elements if src elements not found. */
923 selt
= lbitset_elt_find (src
, i
, LBITSET_SUBST
);
924 delt
= lbitset_elt_find (dst
, i
, LBITSET_CREATE
);
926 for (j
= 0; j
< LBITSET_ELT_WORDS
; j
++)
927 delt
->words
[j
] = ~selt
->words
[j
];
934 /* Is DST == DST | SRC? */
936 lbitset_subset_p (bitset dst
, bitset src
)
942 for (selt
= LBITSET_HEAD (src
), delt
= LBITSET_HEAD (dst
);
943 selt
|| delt
; selt
= selt
->next
, delt
= delt
->next
)
946 selt
= &lbitset_zero_elts
[0];
948 delt
= &lbitset_zero_elts
[0];
949 else if (selt
->index
!= delt
->index
)
951 if (selt
->index
< delt
->index
)
953 lbitset_zero_elts
[2].next
= delt
;
954 delt
= &lbitset_zero_elts
[2];
958 lbitset_zero_elts
[1].next
= selt
;
959 selt
= &lbitset_zero_elts
[1];
963 for (j
= 0; j
< LBITSET_ELT_WORDS
; j
++)
964 if (delt
->words
[j
] != (selt
->words
[j
] | delt
->words
[j
]))
971 /* Is DST & SRC == 0? */
973 lbitset_disjoint_p (bitset dst
, bitset src
)
979 for (selt
= LBITSET_HEAD (src
), delt
= LBITSET_HEAD (dst
);
980 selt
&& delt
; selt
= selt
->next
, delt
= delt
->next
)
982 if (selt
->index
!= delt
->index
)
984 if (selt
->index
< delt
->index
)
986 lbitset_zero_elts
[2].next
= delt
;
987 delt
= &lbitset_zero_elts
[2];
991 lbitset_zero_elts
[1].next
= selt
;
992 selt
= &lbitset_zero_elts
[1];
994 /* Since the elements are different, there is no
995 intersection of these elements. */
999 for (j
= 0; j
< LBITSET_ELT_WORDS
; j
++)
1000 if (selt
->words
[j
] & delt
->words
[j
])
1008 lbitset_op3_cmp (bitset dst
, bitset src1
, bitset src2
, enum bitset_ops op
)
1010 lbitset_elt
*selt1
= LBITSET_HEAD (src1
);
1011 lbitset_elt
*selt2
= LBITSET_HEAD (src2
);
1012 lbitset_elt
*delt
= LBITSET_HEAD (dst
);
1013 bitset_windex windex1
;
1014 bitset_windex windex2
;
1015 bitset_windex windex
;
1022 bool changed
= false;
1025 LBITSET_HEAD (dst
) = 0;
1028 windex1
= (selt1
) ? selt1
->index
: BITSET_WINDEX_MAX
;
1029 windex2
= (selt2
) ? selt2
->index
: BITSET_WINDEX_MAX
;
1031 while (selt1
|| selt2
)
1033 /* Figure out whether we need to substitute zero elements for
1035 if (windex1
== windex2
)
1040 selt1
= selt1
->next
;
1041 windex1
= (selt1
) ? selt1
->index
: BITSET_WINDEX_MAX
;
1042 selt2
= selt2
->next
;
1043 windex2
= (selt2
) ? selt2
->index
: BITSET_WINDEX_MAX
;
1045 else if (windex1
< windex2
)
1049 stmp2
= &lbitset_zero_elts
[0];
1050 selt1
= selt1
->next
;
1051 windex1
= (selt1
) ? selt1
->index
: BITSET_WINDEX_MAX
;
1056 stmp1
= &lbitset_zero_elts
[0];
1058 selt2
= selt2
->next
;
1059 windex2
= (selt2
) ? selt2
->index
: BITSET_WINDEX_MAX
;
1062 /* Find the appropriate element from DST. Begin by discarding
1063 elements that we've skipped. */
1064 while (delt
&& delt
->index
< windex
)
1069 lbitset_elt_free (dtmp
);
1071 if (delt
&& delt
->index
== windex
)
1077 dtmp
= lbitset_elt_calloc ();
1079 /* Do the operation, and if any bits are set, link it into the
1081 srcp1
= stmp1
->words
;
1082 srcp2
= stmp2
->words
;
1087 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++, dstp
++)
1089 bitset_word tmp
= *srcp1
++ | *srcp2
++;
1100 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++, dstp
++)
1102 bitset_word tmp
= *srcp1
++ & *srcp2
++;
1113 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++, dstp
++)
1115 bitset_word tmp
= *srcp1
++ ^ *srcp2
++;
1125 case BITSET_OP_ANDN
:
1126 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++, dstp
++)
1128 bitset_word tmp
= *srcp1
++ & ~(*srcp2
++);
1142 if (!lbitset_elt_zero_p (dtmp
))
1144 dtmp
->index
= windex
;
1145 /* Perhaps this could be optimised... */
1146 lbitset_elt_link (dst
, dtmp
);
1150 lbitset_elt_free (dtmp
);
1154 /* If we have elements of DST left over, free them all. */
1158 lbitset_prune (dst
, delt
);
1166 lbitset_and_cmp (bitset dst
, bitset src1
, bitset src2
)
1168 lbitset_elt
*selt1
= LBITSET_HEAD (src1
);
1169 lbitset_elt
*selt2
= LBITSET_HEAD (src2
);
1175 changed
= !LBITSET_HEAD (dst
);
1182 changed
= !LBITSET_HEAD (dst
);
1186 return lbitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_AND
);
1191 lbitset_and (bitset dst
, bitset src1
, bitset src2
)
1193 lbitset_and_cmp (dst
, src1
, src2
);
1198 lbitset_andn_cmp (bitset dst
, bitset src1
, bitset src2
)
1200 lbitset_elt
*selt1
= LBITSET_HEAD (src1
);
1201 lbitset_elt
*selt2
= LBITSET_HEAD (src2
);
1206 return lbitset_copy_cmp (dst
, src1
);
1211 changed
= !LBITSET_HEAD (dst
);
1215 return lbitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_ANDN
);
1220 lbitset_andn (bitset dst
, bitset src1
, bitset src2
)
1222 lbitset_andn_cmp (dst
, src1
, src2
);
1227 lbitset_or_cmp (bitset dst
, bitset src1
, bitset src2
)
1229 lbitset_elt
*selt1
= LBITSET_HEAD (src1
);
1230 lbitset_elt
*selt2
= LBITSET_HEAD (src2
);
1234 return lbitset_copy_cmp (dst
, src1
);
1238 return lbitset_copy_cmp (dst
, src2
);
1240 return lbitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_OR
);
1245 lbitset_or (bitset dst
, bitset src1
, bitset src2
)
1247 lbitset_or_cmp (dst
, src1
, src2
);
1252 lbitset_xor_cmp (bitset dst
, bitset src1
, bitset src2
)
1254 lbitset_elt
*selt1
= LBITSET_HEAD (src1
);
1255 lbitset_elt
*selt2
= LBITSET_HEAD (src2
);
1259 return lbitset_copy_cmp (dst
, src1
);
1263 return lbitset_copy_cmp (dst
, src2
);
1265 return lbitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_XOR
);
1270 lbitset_xor (bitset dst
, bitset src1
, bitset src2
)
1272 lbitset_xor_cmp (dst
, src1
, src2
);
1277 /* Vector of operations for linked-list bitsets. */
1278 struct bitset_vtable lbitset_vtable
= {
1304 bitset_andn_or_cmp_
,
1308 lbitset_list_reverse
,
1314 /* Return size of initial structure. */
1316 lbitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED
)
1318 return sizeof (struct lbitset_struct
);
1322 /* Initialize a bitset. */
1324 lbitset_init (bitset bset
, bitset_bindex n_bits ATTRIBUTE_UNUSED
)
1326 bset
->b
.vtable
= &lbitset_vtable
;
1332 lbitset_release_memory (void)
1334 lbitset_free_list
= 0;
1335 if (lbitset_obstack_init
)
1337 lbitset_obstack_init
= false;
1338 obstack_free (&lbitset_obstack
, NULL
);
1343 /* Function to be called from debugger to debug lbitset. */
1345 debug_lbitset (bitset bset
)
1353 for (elt
= LBITSET_HEAD (bset
); elt
; elt
= elt
->next
)
1355 fprintf (stderr
, "Elt %lu\n", (unsigned long) elt
->index
);
1356 for (i
= 0; i
< LBITSET_ELT_WORDS
; i
++)
1361 word
= elt
->words
[i
];
1363 fprintf (stderr
, " Word %u:", i
);
1364 for (j
= 0; j
< LBITSET_WORD_BITS
; j
++)
1365 if ((word
& ((bitset_word
) 1 << j
)))
1366 fprintf (stderr
, " %u", j
);
1367 fprintf (stderr
, "\n");