Mir 1.0
Mir application programming interface

Data Structures

struct  mirkl_bitarr_t_
 Structure of bit array. More...
 

Macros

#define mirkl_bitarr_len(arr)   ((arr)->num_of_bits)
 Get length of bit array.
 
#define mirkl_bitset64_wrd(pos)   ((pos) >> 6)
 
#define mirkl_bitset64_idx(pos)   ((pos) & 63)
 
#define mirkl_bitsetX_wrd(wrdbits, pos)   ((pos) / (wrdbits))
 
#define mirkl_bitsetX_idx(wrdbits, pos)   ((pos) % (wrdbits))
 
#define _TYPESHIFT(arr, word, shift)    ((__typeof(*(arr)))((__typeof(*(arr)))(word) << (shift)))
 
#define mirkl_bitset2_get(arr, wrd, idx)   (((arr)[wrd] >> (idx)) & 0x1)
 
#define mirkl_bitset2_set(arr, wrd, idx)   ((arr)[wrd] |= _TYPESHIFT(arr,1,idx))
 
#define mirkl_bitset2_del(arr, wrd, idx)   ((arr)[wrd] &=~ _TYPESHIFT(arr,1,idx))
 
#define mirkl_bitset2_tgl(arr, wrd, idx)   ((arr)[wrd] ^= _TYPESHIFT(arr,1,idx))
 
#define mirkl_bitset2_or(arr, wrd, idx, bit)   ((arr)[wrd] |= _TYPESHIFT(arr,bit,idx))
 
#define mirkl_bitset2_xor(arr, wrd, idx, bit)   ((arr)[wrd] = ~((arr)[wrd] ^ (~_TYPESHIFT(arr,bit,idx))))
 
#define mirkl_bitset2_and(arr, wrd, idx, bit)   ((arr)[wrd] &= (_TYPESHIFT(arr,bit,idx) | ~_TYPESHIFT(arr,1,idx)))
 
#define mirkl_bitset2_cpy(arr, wrd, idx, bit)   ((arr)[wrd] = ((arr)[wrd] &~ _TYPESHIFT(arr,1,idx)) | _TYPESHIFT(arr,bit,idx))
 
#define mirkl_bitset_wrd(arr, pos)   mirkl_bitsetX_wrd(sizeof(*(arr))*8,pos)
 
#define mirkl_bitset_idx(arr, pos)   mirkl_bitsetX_idx(sizeof(*(arr))*8,pos)
 
#define mirkl_bitset_op(func, arr, pos)   func(arr, mirkl_bitset_wrd(arr,pos), mirkl_bitset_idx(arr,pos))
 
#define mirkl_bitset_op2(func, arr, pos, bit)   func(arr, mirkl_bitset_wrd(arr,pos), mirkl_bitset_idx(arr,pos), bit)
 
#define mirkl_bitset_get(arr, pos)   mirkl_bitset_op(mirkl_bitset2_get, arr, pos)
 
#define mirkl_bitset_set(arr, pos)   mirkl_bitset_op(mirkl_bitset2_set, arr, pos)
 
#define mirkl_bitset_del(arr, pos)   mirkl_bitset_op(mirkl_bitset2_del, arr, pos)
 
#define mirkl_bitset_tgl(arr, pos)   mirkl_bitset_op(mirkl_bitset2_tgl, arr, pos)
 
#define mirkl_bitset_or(arr, pos, bit)   mirkl_bitset_op2(mirkl_bitset2_or, arr, pos, bit)
 
#define mirkl_bitset_xor(arr, pos, bit)   mirkl_bitset_op2(mirkl_bitset2_xor, arr, pos, bit)
 
#define mirkl_bitset_and(arr, pos, bit)   mirkl_bitset_op2(mirkl_bitset2_and, arr, pos, bit)
 
#define mirkl_bitset_cpy(arr, pos, bit)   mirkl_bitset_op2(mirkl_bitset2_cpy, arr, pos, bit)
 

Typedefs

typedef struct mirkl_bitarr_t_ mirkl_bitarr_t
 Structure of bit array. More...
 

Functions

mirkl_error_tmirkl_bitarr_create (mirkl_bitarr_t **ba, mirkl_uint64_t nbits)
 Creates new bit array of length nbits.
 
mirkl_error_tmirkl_bitarr_resize (mirkl_bitarr_t **ba, mirkl_uint64_t new_num_of_bits)
 Change size of a bit array. Enlarging an array will add zeros to the end of it. More...
 
mirkl_error_tmirkl_bitarr_clone (const mirkl_bitarr_t *ba, mirkl_bitarr_t **ba_out)
 Create and copy data to new bit array.
 
void mirkl_bitarr_free (mirkl_bitarr_t *ba)
 Frees memory allocated for bit array. More...
 
void mirkl_bitarr_print (const mirkl_bitarr_t *ba, FILE *fout)
 Print this array to a file stream. Prints '0's and '1'. Doesn't print newline.
 
mirkl_size_t mirkl_bitarr_tostr (const mirkl_bitarr_t *ba, char *dst, mirkl_size_t siz, char s, char c)
 
mirkl_uint64_t mirkl_bitarr_num_bits_set (const mirkl_bitarr_t *ba)
 Get number of bits set (hamming weight).
 
mirkl_uint64_t mirkl_bitarr_num_bits_cleared (const mirkl_bitarr_t *ba)
 Get number of bits NOT set (cleared).
 

Operations with all bits at once

void mirkl_bitarr_set_all (mirkl_bitarr_t *ba)
 Set all elements of array to one.
 
void mirkl_bitarr_clear_all (mirkl_bitarr_t *ba)
 set all elements of array to zero.
 
void mirkl_bitarr_toggle_all (mirkl_bitarr_t *ba)
 Set all 1 bits to 0, and all 0 bits to 1. AKA flip.
 

Logic operations and shifts

mirkl_error_tmirkl_bitarr_or (const mirkl_bitarr_t *src1, const mirkl_bitarr_t *src2, mirkl_bitarr_t **dst)
 Bitwise OR of two bit arrays.
 
mirkl_error_tmirkl_bitarr_and (const mirkl_bitarr_t *src1, const mirkl_bitarr_t *src2, mirkl_bitarr_t **dst)
 Bitwise AND of two bit arrays.
 

Macros for fast access. Beware: no bounds checking.

#define mirkl_bitarr_get(arr, i)   mirkl_bitset_get((arr)->words, i)
 Get the value of a bit (returns 0 or 1)
 
#define mirkl_bitarr_set(arr, i)   mirkl_bitset_set((arr)->words, i)
 Set a bit (to 1) at position i.
 
#define mirkl_bitarr_clear(arr, i)   mirkl_bitset_del((arr)->words, i)
 Clear a bit (to 0) at position i.
 
#define mirkl_bitarr_toggle(arr, i)   mirkl_bitset_tgl((arr)->words, i)
 Toggle a bit. If bit is 0 change to 1; if bit is 1 change to 0. Also known as complement function.
 
#define mirkl_bitarr_assign(arr, i, c)   mirkl_bitset_cpy((arr)->words,i,c)
 Assign a value to a bit. c must be 0 or 1. If c != 0 then set bit; otherwise clear bit.
 

Detailed Description

Typedef Documentation

◆ mirkl_bitarr_t

Structure of bit array.

This is a modified version of the bit array C library by Isaac Turner, see https://github.com/noporpoise/BitArray/ for original project. The purpose of the modification is to adapt the library for MirKL error handling system.

Function Documentation

◆ mirkl_bitarr_free()

void mirkl_bitarr_free ( mirkl_bitarr_t ba)

Frees memory allocated for bit array.

Note
The pointer to the bit array is not valid after this function.

◆ mirkl_bitarr_resize()

mirkl_error_t * mirkl_bitarr_resize ( mirkl_bitarr_t **  ba,
mirkl_uint64_t  new_num_of_bits 
)

Change size of a bit array. Enlarging an array will add zeros to the end of it.

Note
This function can create a new bit array if *ba is NULL on input.