7df6e18265341f87a69fba808aa1f92f8ebca841 markd Wed Apr 15 13:39:42 2026 -0700 move copy of htslib diff --git src/htslib/htslib/kbitset.h src/htslib/htslib/kbitset.h deleted file mode 100644 index 22fb34d7585..00000000000 --- src/htslib/htslib/kbitset.h +++ /dev/null @@ -1,160 +0,0 @@ -/* The MIT License - - Copyright (C) 2015 Genome Research Ltd. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -#ifndef KBITSET_H -#define KBITSET_H - -/* Example of using kbitset_t, which represents a subset of {0,..., N-1}, - where N is the size specified in kbs_init(). - - kbitset_t *bset = kbs_init(100); - kbs_insert(bset, 5); - kbs_insert(bset, 68); - kbs_delete(bset, 37); - // ... - - if (kbs_exists(bset, 68)) printf("68 present\n"); - - kbitset_iter itr; - int i; - kbs_start(&itr); - while ((i = kbs_next(bset, &itr)) >= 0) - printf("%d present\n", i); - - kbs_destroy(bset); - - Example of declaring a kbitset_t-using function in a header file, so that - only source files that actually use process() need to include <kbitset.h>: - - struct kbitset_t; - void process(struct kbitset_t *bset); -*/ - -#include <limits.h> -#include <stdlib.h> -#include <string.h> - -#define KBS_ELTBITS (CHAR_BIT * sizeof (unsigned long)) -#define KBS_ELT(i) ((i) / KBS_ELTBITS) -#define KBS_MASK(i) (1UL << ((i) % KBS_ELTBITS)) - -typedef struct kbitset_t { - size_t n; - unsigned long b[1]; -} kbitset_t; - -// Initialise a bit set capable of holding ni integers, 0 <= i < ni. -// The set returned is empty if fill == 0, or all of [0,ni) otherwise. -static inline kbitset_t *kbs_init2(size_t ni, int fill) -{ - size_t n = (ni + KBS_ELTBITS-1) / KBS_ELTBITS; - kbitset_t *bs = - (kbitset_t *) malloc(sizeof(kbitset_t) + n * sizeof(unsigned long)); - if (bs == NULL) return NULL; - bs->n = n; - memset(bs->b, fill? ~0 : 0, n * sizeof (unsigned long)); - bs->b[n] = ~0UL; - return bs; -} - -// Initialise an empty bit set capable of holding ni integers, 0 <= i < ni. -static inline kbitset_t *kbs_init(size_t ni) -{ - return kbs_init2(ni, 0); -} - -// Destroy a bit set. -static inline void kbs_destroy(kbitset_t *bs) -{ - free(bs); -} - -// Reset the bit set to empty. -static inline void kbs_clear(kbitset_t *bs) -{ - memset(bs->b, 0, bs->n * sizeof (unsigned long)); -} - -// Reset the bit set to all of [0,ni). -static inline void kbs_insert_all(kbitset_t *bs) -{ - memset(bs->b, ~0, bs->n * sizeof (unsigned long)); -} - -// Insert an element into the bit set. -static inline void kbs_insert(kbitset_t *bs, int i) -{ - bs->b[KBS_ELT(i)] |= KBS_MASK(i); -} - -// Remove an element from the bit set. -static inline void kbs_delete(kbitset_t *bs, int i) -{ - bs->b[KBS_ELT(i)] &= ~KBS_MASK(i); -} - -// Test whether the bit set contains the element. -static inline int kbs_exists(const kbitset_t *bs, int i) -{ - return (bs->b[KBS_ELT(i)] & KBS_MASK(i)) != 0; -} - -typedef struct kbitset_iter_t { - unsigned long mask; - size_t elt; - int i; -} kbitset_iter_t; - -// Initialise or reset a bit set iterator. -static inline void kbs_start(kbitset_iter_t *itr) -{ - itr->mask = 1; - itr->elt = 0; - itr->i = 0; -} - -// Return the next element contained in the bit set, or -1 if there are no more. -static inline int kbs_next(const kbitset_t *bs, kbitset_iter_t *itr) -{ - unsigned long b = bs->b[itr->elt]; - - for (;;) { - if (itr->mask == 0) { - while ((b = bs->b[++itr->elt]) == 0) itr->i += KBS_ELTBITS; - if (itr->elt == bs->n) return -1; - itr->mask = 1; - } - - if (b & itr->mask) break; - - itr->i++; - itr->mask <<= 1; - } - - itr->mask <<= 1; - return itr->i++; -} - -#endif