/*****************************************************************************
|
*
|
* 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
|