File: bitarr.h

package info (click to toggle)
sphinxtrain 5.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 32,572 kB
  • sloc: ansic: 94,052; perl: 8,939; python: 6,702; cpp: 2,044; makefile: 6
file content (142 lines) | stat: -rw-r--r-- 4,706 bytes parent folder | download | duplicates (5)
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_ */