File size: 4,824 Bytes
37a92a9 | 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 143 144 145 146 147 148 149 150 | /* ====================================================================
* Copyright (c) 1999-2004 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 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.
*
* ====================================================================
*
*/
/*
* blkarray_list.h -- array-based list structure, for memory and access
* efficiency.
*
* HISTORY
*
* $Log: blkarray_list.h,v $
* Revision 1.1.1.1 2006/05/23 18:45:02 dhuggins
* re-importation
*
* Revision 1.2 2004/12/10 16:48:58 rkm
* Added continuous density acoustic model handling
*
* Revision 1.1 2004/07/16 00:57:12 egouvea
* Added Ravi's implementation of FSG support.
*
* Revision 1.2 2004/05/27 14:22:57 rkm
* FSG cross-word triphones completed (but for single-phone words)
*
* Revision 1.1.1.1 2004/03/01 14:30:31 rkm
*
*
* Revision 1.1 2004/02/26 01:14:48 rkm
* *** empty log message ***
*
*
* 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon
* Started.
*/
#ifndef __S2_BLKARRAY_LIST_H__
#define __S2_BLKARRAY_LIST_H__
#include <pocketsphinx/prim_type.h>
#ifdef __cplusplus
extern "C" {
#endif
#if 0
}
#endif
/*
* For maintaining a (conceptual) "list" of pointers to arbitrary data.
* The application is responsible for knowing the true data type.
* Use an array instead of a true list for efficiency (both memory and
* speed). But use a blocked (2-D) array to allow dynamic resizing at a
* coarse grain. An entire block is allocated or freed, as appropriate.
*/
typedef struct blkarray_list_s {
void ***ptr; /* ptr[][] is the user-supplied ptr */
int32 maxblks; /* size of ptr (#rows) */
int32 blksize; /* size of ptr[] (#cols, ie, size of each row) */
int32 n_valid; /* # entries actually stored in the list */
int32 cur_row; /* The current row being that has empty entry */
int32 cur_row_free; /* First entry valid within the current row */
} blkarray_list_t;
/* Access macros */
#define blkarray_list_ptr(l,r,c) ((l)->ptr[r][c])
#define blkarray_list_maxblks(l) ((l)->maxblks)
#define blkarray_list_blksize(l) ((l)->blksize)
#define blkarray_list_n_valid(l) ((l)->n_valid)
#define blkarray_list_cur_row(l) ((l)->cur_row)
#define blkarray_list_cur_row_free(l) ((l)->cur_row_free)
/*
* Initialize and return a new blkarray_list containing an empty list
* (i.e., 0 length). Sized for the given values of maxblks and blksize.
* NOTE: (maxblks * blksize) should not overflow int32, but this is not
* checked.
* Return the allocated entry if successful, NULL if any error.
*/
blkarray_list_t *_blkarray_list_init (int32 maxblks, int32 blksize);
/*
* Like _blkarray_list_init() above, but for some default values of
* maxblks and blksize.
*/
blkarray_list_t *blkarray_list_init ( void );
/**
* Completely finalize a blkarray_list.
*/
void blkarray_list_free(blkarray_list_t *bl);
/*
* Append the given new entry (data) to the end of the list.
* Return the index of the entry if successful, -1 if any error.
* The returned indices are guaranteed to be successive integers (i.e.,
* 0, 1, 2...) for successive append operations, until the list is reset,
* when they resume from 0.
*/
int32 blkarray_list_append (blkarray_list_t *, void *data);
/*
* Free all the entries in the list (using ckd_free) and reset the
* list length to 0.
*/
void blkarray_list_reset (blkarray_list_t *);
/* Gets n-th element of the array list */
void * blkarray_list_get(blkarray_list_t *, int32 n);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif
|