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