1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */
/* ====================================================================
* Copyright (c) 2015 Carnegie Mellon University. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* This work was supported in part by funding from the Defense Advanced
* Research Projects Agency and the National Science Foundation of the
* United States of America, and the CMU Sphinx Speech Consortium.
*
* THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND
* ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY
* NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ====================================================================
*
*/
#ifndef _LIBUTIL_BITARR_H_
#define _LIBUTIL_BITARR_H_
#include <string.h>
#include <sphinxbase/prim_type.h>
/* Win32/WinCE DLL gunk */
#include <sphinxbase/sphinxbase_export.h>
/**
* @file bitarr.h
* @brief An implementation bit array - memory efficient storage for digit int and float data.
*
* Implementation of basic operations of read/write digits consuming as little space as possible.
*/
#ifdef __cplusplus
extern "C" {
#endif
#if 0
/* Fool Emacs. */
}
#endif
/**
* Structure that specifies bits required to efficiently store certain data
*/
typedef struct bitarr_mask_s {
uint8 bits;
uint32 mask;
} bitarr_mask_t;
/**
* Structure that stores address of certain value in bit array
*/
typedef struct bitarr_address_s {
void *base;
uint32 offset;
} bitarr_address_t;
/**
* Read uint64 value from bit array.
* Assumes mask == (1 << length) - 1 where length <= 57
* @param address to read from
* @param length number of bits for value
* @param mask of read value
* @return uint64 value that was read
*/
SPHINXBASE_EXPORT
uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask);
/**
* Write specified value into bit array.
* Assumes value < (1 << length) and length <= 57.
* Assumes the memory is zero initially.
* @param address to write to
* @param length amount of active bytes in value to write
* @param value integer to write
*/
SPHINXBASE_EXPORT
void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value);
/**
* Read uint32 value from bit array.
* Assumes mask == (1 << length) - 1 where length <= 25
* @param address to read from
* @param length number of bits for value
* @param mask of read value
* @return uint32 value that was read
*/
SPHINXBASE_EXPORT
uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask);
/**
* Write specified value into bit array.
* Assumes value < (1 << length) and length <= 25.
* Assumes the memory is zero initially.
* @param address in bit array ti write to
* @param length amount of active bytes in value to write
* @param value integer to write
*/
SPHINXBASE_EXPORT
void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value);
/**
* Fills mask for certain int range according to provided max value
* @param bit_mask mask that is filled
* @param max_value bigest integer that is going to be stored using this mask
*/
SPHINXBASE_EXPORT
void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value);
/**
* Computes amount of bits required ti store integers upto value provided.
* @param max_value bigest integer that going to be stored using this amount of bits
* @return amount of bits required to store integers from range with maximum provided
*/
SPHINXBASE_EXPORT
uint8 bitarr_required_bits(uint32 max_value);
#ifdef __cplusplus
}
#endif
#endif /* _LIBUTIL_BITARR_H_ */
|