JLChen
2021-08-02 38f4fb064df09f344fc3237409c76a9fba2a8a9e
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*****************************************************************************
 * 
 * Copyright (c) 2008-2010, CoreCodec, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of CoreCodec, Inc. nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY
 * EXPRESS 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 CoreCodec, Inc. 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 __ARRAY_H
#define __ARRAY_H
 
#include "corec/corec.h"
#include "corec/memheap.h"
 
#ifdef __cplusplus
extern "C" {
#endif
 
#if defined(ARRAY_EXPORTS)
#define ARRAY_DLL DLLEXPORT
#elif defined(ARRAY_IMPORTS)
#define ARRAY_DLL DLLIMPORT
#else
#define ARRAY_DLL
#endif
 
#define Data_Var(type,name,len)  struct { size_t n; type p[len]; } __##name; type* name = (__##name.n = sizeof(__##name.p),__##name.p)
ARRAY_DLL bool_t Data_ReAlloc(uint8_t** a,size_t n);
ARRAY_DLL size_t Data_Size(const uint8_t* a);
ARRAY_DLL void Data_Release(uint8_t** a);
ARRAY_DLL void Data_Clear(uint8_t** a); // release memory, but keep heap reference
ARRAY_DLL bool_t Data_Set(uint8_t** a,const uint8_t* b,size_t pos,size_t len);
 
typedef struct array
{
    // these are private members, use ARRAY macros to access them
    uint8_t* _Begin;
    uint8_t* _End;
 
} array;
 
typedef    int (*arraycmp)(const void* Param, const void* a,const void* b);
 
#define ARRAY_AUTO_COUNT    ((size_t)-1)
 
static INLINE void ArrayInit(array* p) { p->_Begin = NULL; p->_End = NULL; }
ARRAY_DLL void ArrayInitEx(array*,const cc_memheap*);
ARRAY_DLL void ArrayClear(array*);
ARRAY_DLL void ArrayDrop(array*);
ARRAY_DLL size_t ArraySize(const array*);
ARRAY_DLL bool_t ArrayEq(const array* a, const array* b);
ARRAY_DLL bool_t ArrayCopy(array*,const array* In);
ARRAY_DLL bool_t ArrayResize(array*,size_t Size,size_t Align);
ARRAY_DLL void ArrayZero(array*);
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);
ARRAY_DLL bool_t ArrayAlloc(array* p,size_t Total,size_t Align);
ARRAY_DLL bool_t ArrayAppend(array* p, const void* Ptr, size_t Length, size_t Align);
ARRAY_DLL bool_t ArrayAppendStr(array* p, const tchar_t* Ptr, bool_t Merge, size_t Align);
ARRAY_DLL void ArrayShrink(array* p, size_t Length);
ARRAY_DLL intptr_t ArrayAddEx(array* p, size_t Count, size_t Width, const void* Data, arraycmp Cmp, const void* CmpParam, size_t Align);
ARRAY_DLL bool_t ArrayRemoveEx(array* p, size_t Count, size_t Width, const void* Data, arraycmp Cmp, const void* CmpParam);
ARRAY_DLL void ArraySortEx(array* p, size_t Count, size_t Width, arraycmp Cmp, const void* CmpParam, bool_t Unique);
ARRAY_DLL bool_t ArrayInsert(array* p, size_t Ofs, const void* Ptr, size_t Length, size_t Align);
ARRAY_DLL void ArrayDelete(array* p, size_t Ofs,  size_t Length);
ARRAY_DLL void ArrayRandomize(array* Array,size_t Width,uint32_t RndSeed);
 
#define ArrayAdd(p,type,Data,Cmp,CmpParam,Align)  ArrayAddEx(p,ARRAYCOUNT(*p,type),sizeof(type),Data,Cmp,CmpParam,Align)
#define ArrayRemove(p,type,Data,Cmp,CmpParam)     ArrayRemoveEx(p,ARRAYCOUNT(*p,type),sizeof(type),Data,Cmp,CmpParam)
#define ArrayFind(p,type,Data,Cmp,CmpParam,Found) ArrayFindEx(p,ARRAYCOUNT(*p,type),sizeof(type),Data,Cmp,CmpParam,Found)
#define ArraySort(p,type,Cmp,CmpParam,Unique)     ArraySortEx(p,ARRAYCOUNT(*p,type),sizeof(type),Cmp,CmpParam,Unique)
 
#ifdef CONFIG_DEBUGCHECKS
#define ARRAYBEGIN(Array,Type)        (assert(&(Array)!=NULL),(Type*)((Array)._Begin))
#define ARRAYEND(Array,Type)        (assert(&(Array)!=NULL),(Type*)((Array)._End))
#define ARRAYEMPTY(Array)            (assert(&(Array)!=NULL),(Array)._Begin==(Array)._End)
#else
#define ARRAYBEGIN(Array,Type)        ((Type*)((Array)._Begin))
#define ARRAYEND(Array,Type)        ((Type*)((Array)._End))
#define ARRAYEMPTY(Array)            ((Array)._Begin==(Array)._End)
#endif
#define ARRAYCOUNT(Array,Type)        ((size_t)(ARRAYEND(Array,Type)-ARRAYBEGIN(Array,Type)))
 
// TODO: move this to base/mem and depend on "mem" platform dependently(?)
typedef struct block
{
    const uint8_t* Ptr;
    uintptr_t Id;
 
} block;
//end TODO
 
#ifdef TARGET_PALMOS
 
typedef struct arrayblock
{
    array Array;
    block Block;
 
} arrayblock;
 
ARRAY_DLL void ArrayBlockClear(arrayblock*);
ARRAY_DLL void ArrayBlockLock(arrayblock*);
 
#else
 
typedef struct arrayblock
{
    array Array;
 
} arrayblock;
 
#define ArrayBlockClear(a) ArrayClear(&(a)->Array)
#define ArrayBlockLock(a) {}
 
#endif
 
#define SAFETAIL    256
 
typedef struct cc_fifo
{
    // private members
    array _Base;
    uint8_t* _Read;
 
} cc_fifo;
 
static INLINE void Fifo_Init(cc_fifo* p) { ArrayInit(&p->_Base); p->_Read = NULL; }
ARRAY_DLL void Fifo_Clear(cc_fifo*);
ARRAY_DLL void Fifo_Drop(cc_fifo*);
ARRAY_DLL bool_t Fifo_Alloc(cc_fifo* p, size_t Size, size_t Align);
ARRAY_DLL uint8_t* Fifo_Write(cc_fifo*, const void* Ptr, size_t Length, size_t Align);
 
static INLINE void Fifo_Readed(cc_fifo* p, size_t Length) 
    p->_Read += Length; 
}
 
#define FIFO_SIZE(p)  (ARRAYEND((p)._Base,uint8_t)-(p)._Read)
#define FIFO_BEGIN(p) ((p)._Read)
#define FIFO_END(p)   ARRAYEND((p)._Base,uint8_t)
 
#ifdef __cplusplus
}
#endif
 
#endif