mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 05:01:54 +00:00

* Make GIT_INLINE an internal definition so it cannot be used in public headers * Fix language in CONTRIBUTING * Make index caps API use signed instead of unsigned values
76 lines
1.7 KiB
C
76 lines
1.7 KiB
C
/*
|
|
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
*
|
|
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
* a Linking Exception. For full terms see the included COPYING file.
|
|
*/
|
|
#ifndef INCLUDE_bitvec_h__
|
|
#define INCLUDE_bitvec_h__
|
|
|
|
#include "common.h"
|
|
|
|
/*
|
|
* This is a silly little fixed length bit vector type that will store
|
|
* vectors of 64 bits or less directly in the structure and allocate
|
|
* memory for vectors longer than 64 bits. You can use the two versions
|
|
* transparently through the API and avoid heap allocation completely when
|
|
* using a short bit vector as a result.
|
|
*/
|
|
typedef struct {
|
|
size_t length;
|
|
union {
|
|
uint64_t *words;
|
|
uint64_t bits;
|
|
} u;
|
|
} git_bitvec;
|
|
|
|
GIT_INLINE(int) git_bitvec_init(git_bitvec *bv, size_t capacity)
|
|
{
|
|
memset(bv, 0x0, sizeof(*bv));
|
|
|
|
if (capacity >= 64) {
|
|
bv->length = (capacity / 64) + 1;
|
|
bv->u.words = git__calloc(bv->length, sizeof(uint64_t));
|
|
if (!bv->u.words)
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define GIT_BITVEC_MASK(BIT) ((uint64_t)1 << (BIT % 64))
|
|
#define GIT_BITVEC_WORD(BV, BIT) (BV->length ? &BV->u.words[BIT / 64] : &BV->u.bits)
|
|
|
|
GIT_INLINE(void) git_bitvec_set(git_bitvec *bv, size_t bit, bool on)
|
|
{
|
|
uint64_t *word = GIT_BITVEC_WORD(bv, bit);
|
|
uint64_t mask = GIT_BITVEC_MASK(bit);
|
|
|
|
if (on)
|
|
*word |= mask;
|
|
else
|
|
*word &= ~mask;
|
|
}
|
|
|
|
GIT_INLINE(bool) git_bitvec_get(git_bitvec *bv, size_t bit)
|
|
{
|
|
uint64_t *word = GIT_BITVEC_WORD(bv, bit);
|
|
return (*word & GIT_BITVEC_MASK(bit)) != 0;
|
|
}
|
|
|
|
GIT_INLINE(void) git_bitvec_clear(git_bitvec *bv)
|
|
{
|
|
if (!bv->length)
|
|
bv->u.bits = 0;
|
|
else
|
|
memset(bv->u.words, 0x0, bv->length * sizeof(uint64_t));
|
|
}
|
|
|
|
GIT_INLINE(void) git_bitvec_free(git_bitvec *bv)
|
|
{
|
|
if (bv->length)
|
|
git__free(bv->u.words);
|
|
}
|
|
|
|
#endif
|