1 /*****************************************************************************
2 *
3 * Copyright (c) 2008-2010, CoreCodec, Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of CoreCodec, Inc. nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 ****************************************************************************/
29
30 #ifndef __ARRAY_H
31 #define __ARRAY_H
32
33 #include "corec/corec.h"
34 #include "corec/memheap.h"
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 #if defined(ARRAY_EXPORTS)
41 #define ARRAY_DLL DLLEXPORT
42 #elif defined(ARRAY_IMPORTS)
43 #define ARRAY_DLL DLLIMPORT
44 #else
45 #define ARRAY_DLL
46 #endif
47
48 #define Data_Var(type,name,len) struct { size_t n; type p[len]; } __##name; type* name = (__##name.n = sizeof(__##name.p),__##name.p)
49 ARRAY_DLL bool_t Data_ReAlloc(uint8_t** a,size_t n);
50 ARRAY_DLL size_t Data_Size(const uint8_t* a);
51 ARRAY_DLL void Data_Release(uint8_t** a);
52 ARRAY_DLL void Data_Clear(uint8_t** a); // release memory, but keep heap reference
53 ARRAY_DLL bool_t Data_Set(uint8_t** a,const uint8_t* b,size_t pos,size_t len);
54
55 typedef struct array
56 {
57 // these are private members, use ARRAY macros to access them
58 uint8_t* _Begin;
59 uint8_t* _End;
60
61 } array;
62
63 typedef int (*arraycmp)(const void* Param, const void* a,const void* b);
64
65 #define ARRAY_AUTO_COUNT ((size_t)-1)
66
ArrayInit(array * p)67 static INLINE void ArrayInit(array* p) { p->_Begin = NULL; p->_End = NULL; }
68 ARRAY_DLL void ArrayInitEx(array*,const cc_memheap*);
69 ARRAY_DLL void ArrayClear(array*);
70 ARRAY_DLL void ArrayDrop(array*);
71 ARRAY_DLL size_t ArraySize(const array*);
72 ARRAY_DLL bool_t ArrayEq(const array* a, const array* b);
73 ARRAY_DLL bool_t ArrayCopy(array*,const array* In);
74 ARRAY_DLL bool_t ArrayResize(array*,size_t Size,size_t Align);
75 ARRAY_DLL void ArrayZero(array*);
76 ARRAY_DLL intptr_t ArrayFindEx(const array* p, size_t Count, size_t Width, const void* Data, arraycmp Cmp, const void* CmpParam, bool_t* Found);
77 ARRAY_DLL bool_t ArrayAlloc(array* p,size_t Total,size_t Align);
78 ARRAY_DLL bool_t ArrayAppend(array* p, const void* Ptr, size_t Length, size_t Align);
79 ARRAY_DLL bool_t ArrayAppendStr(array* p, const tchar_t* Ptr, bool_t Merge, size_t Align);
80 ARRAY_DLL void ArrayShrink(array* p, size_t Length);
81 ARRAY_DLL intptr_t ArrayAddEx(array* p, size_t Count, size_t Width, const void* Data, arraycmp Cmp, const void* CmpParam, size_t Align);
82 ARRAY_DLL bool_t ArrayRemoveEx(array* p, size_t Count, size_t Width, const void* Data, arraycmp Cmp, const void* CmpParam);
83 ARRAY_DLL void ArraySortEx(array* p, size_t Count, size_t Width, arraycmp Cmp, const void* CmpParam, bool_t Unique);
84 ARRAY_DLL bool_t ArrayInsert(array* p, size_t Ofs, const void* Ptr, size_t Length, size_t Align);
85 ARRAY_DLL void ArrayDelete(array* p, size_t Ofs, size_t Length);
86 ARRAY_DLL void ArrayRandomize(array* Array,size_t Width,uint32_t RndSeed);
87
88 #define ArrayAdd(p,type,Data,Cmp,CmpParam,Align) ArrayAddEx(p,ARRAYCOUNT(*p,type),sizeof(type),Data,Cmp,CmpParam,Align)
89 #define ArrayRemove(p,type,Data,Cmp,CmpParam) ArrayRemoveEx(p,ARRAYCOUNT(*p,type),sizeof(type),Data,Cmp,CmpParam)
90 #define ArrayFind(p,type,Data,Cmp,CmpParam,Found) ArrayFindEx(p,ARRAYCOUNT(*p,type),sizeof(type),Data,Cmp,CmpParam,Found)
91 #define ArraySort(p,type,Cmp,CmpParam,Unique) ArraySortEx(p,ARRAYCOUNT(*p,type),sizeof(type),Cmp,CmpParam,Unique)
92
93 #ifdef CONFIG_DEBUGCHECKS
94 #define ARRAYBEGIN(Array,Type) (assert(&(Array)!=NULL),(Type*)((Array)._Begin))
95 #define ARRAYEND(Array,Type) (assert(&(Array)!=NULL),(Type*)((Array)._End))
96 #define ARRAYEMPTY(Array) (assert(&(Array)!=NULL),(Array)._Begin==(Array)._End)
97 #else
98 #define ARRAYBEGIN(Array,Type) ((Type*)((Array)._Begin))
99 #define ARRAYEND(Array,Type) ((Type*)((Array)._End))
100 #define ARRAYEMPTY(Array) ((Array)._Begin==(Array)._End)
101 #endif
102 #define ARRAYCOUNT(Array,Type) ((size_t)(ARRAYEND(Array,Type)-ARRAYBEGIN(Array,Type)))
103
104 // TODO: move this to base/mem and depend on "mem" platform dependently(?)
105 typedef struct block
106 {
107 const uint8_t* Ptr;
108 uintptr_t Id;
109
110 } block;
111 //end TODO
112
113 #ifdef TARGET_PALMOS
114
115 typedef struct arrayblock
116 {
117 array Array;
118 block Block;
119
120 } arrayblock;
121
122 ARRAY_DLL void ArrayBlockClear(arrayblock*);
123 ARRAY_DLL void ArrayBlockLock(arrayblock*);
124
125 #else
126
127 typedef struct arrayblock
128 {
129 array Array;
130
131 } arrayblock;
132
133 #define ArrayBlockClear(a) ArrayClear(&(a)->Array)
134 #define ArrayBlockLock(a) {}
135
136 #endif
137
138 #define SAFETAIL 256
139
140 typedef struct cc_fifo
141 {
142 // private members
143 array _Base;
144 uint8_t* _Read;
145
146 } cc_fifo;
147
Fifo_Init(cc_fifo * p)148 static INLINE void Fifo_Init(cc_fifo* p) { ArrayInit(&p->_Base); p->_Read = NULL; }
149 ARRAY_DLL void Fifo_Clear(cc_fifo*);
150 ARRAY_DLL void Fifo_Drop(cc_fifo*);
151 ARRAY_DLL bool_t Fifo_Alloc(cc_fifo* p, size_t Size, size_t Align);
152 ARRAY_DLL uint8_t* Fifo_Write(cc_fifo*, const void* Ptr, size_t Length, size_t Align);
153
Fifo_Readed(cc_fifo * p,size_t Length)154 static INLINE void Fifo_Readed(cc_fifo* p, size_t Length)
155 {
156 p->_Read += Length;
157 }
158
159 #define FIFO_SIZE(p) (ARRAYEND((p)._Base,uint8_t)-(p)._Read)
160 #define FIFO_BEGIN(p) ((p)._Read)
161 #define FIFO_END(p) ARRAYEND((p)._Base,uint8_t)
162
163 #ifdef __cplusplus
164 }
165 #endif
166
167 #endif
168