#ifndef TA_MEMORY_H
#define TA_MEMORY_H
#if !defined( _MANAGED ) && !defined( _JAVA )
#ifndef TA_COMMON_H
#include "ta_common.h"
#endif
#include <stdlib.h>
#define TA_Malloc(a) malloc(a)
#define TA_Realloc(a,b) realloc((a),(b))
#define TA_Free(a) free(a)
#define FREE_IF_NOT_NULL(x) { if((x)!=NULL) {TA_Free((void *)(x)); (x)=NULL;} }
#endif
#if defined( _MANAGED ) && defined( USE_SUBARRAY )
#define ARRAY_VTYPE_REF(type,name) SubArray<type>^ name
#define ARRAY_VTYPE_LOCAL(type,name,size) SubArray<type>^ name = gcnew SubArrayFrom1D<type>(gcnew cli::array<type>(size),0)
#define ARRAY_VTYPE_ALLOC(type,name,size) name = gcnew SubArrayFrom1D<type>(gcnew cli::array<type>(size),0)
#define ARRAY_VTYPE_COPY(type,dest,src,size) SubArray<type>::Copy( src, 0, dest, 0, size )
#define ARRAY_VTYPE_MEMMOVE(type,dest,destIdx,src,srcIdx,size) SubArray<type>::Copy( src, srcIdx, dest, destIdx, size )
#define ARRAY_VTYPE_FREE(type,name)
#define ARRAY_VTYPE_FREE_COND(type,cond,name)
#elif defined( _MANAGED )
#define ARRAY_VTYPE_REF(type,name) cli::array<type>^ name
#define ARRAY_VTYPE_LOCAL(type,name,size) cli::array<type>^ name = gcnew cli::array<type>(size)
#define ARRAY_VTYPE_ALLOC(type,name,size) name = gcnew cli::array<type>(size)
#define ARRAY_VTYPE_COPY(type,dest,src,size) cli::array<type>::Copy( src, 0, dest, 0, size )
#define ARRAY_VTYPE_MEMMOVE(type,dest,destIdx,src,srcIdx,size) cli::array<type>::Copy( src, srcIdx, dest, destIdx, size )
#define ARRAY_VTYPE_FREE(type,name)
#define ARRAY_VTYPE_FREE_COND(type,cond,name)
#elif defined( _JAVA )
#define ARRAY_VTYPE_REF(type,name) type []name
#define ARRAY_VTYPE_LOCAL(type,name,size) type []name = new type[size]
#define ARRAY_VTYPE_ALLOC(type,name,size) name = new type[size]
#define ARRAY_VTYPE_COPY(type,dest,src,size) System.arraycopy(src,0,dest,0,size)
#define ARRAY_VTYPE_MEMMOVE(type,dest,destIdx,src,srcIdx,size) System.arraycopy(src,srcIdx,dest,destIdx,size)
#define ARRAY_VTYPE_FREE(type,name)
#define ARRAY_VTYPE_FREE_COND(type,cond,name)
#else
#define ARRAY_VTYPE_REF(type,name) type *name
#define ARRAY_VTYPE_LOCAL(type,name,size) type name[size]
#define ARRAY_VTYPE_ALLOC(type,name,size) name = (type *)TA_Malloc( sizeof(type)*(size))
#define ARRAY_VTYPE_COPY(type,dest,src,size) memcpy(dest,src,sizeof(type)*(size))
#define ARRAY_VTYPE_MEMMOVE(type,dest,destIdx,src,srcIdx,size) memmove( &dest[destIdx], &src[srcIdx], (size)*sizeof(type) )
#define ARRAY_VTYPE_FREE(type,name) TA_Free(name)
#define ARRAY_VTYPE_FREE_COND(type,cond,name) if( cond ){ TA_Free(name); }
#endif
#define ARRAY_REF(name) ARRAY_VTYPE_REF(double,name)
#define ARRAY_LOCAL(name,size) ARRAY_VTYPE_LOCAL(double,name,size)
#define ARRAY_ALLOC(name,size) ARRAY_VTYPE_ALLOC(double,name,size)
#define ARRAY_COPY(dest,src,size) ARRAY_VTYPE_COPY(double,dest,src,size)
#define ARRAY_MEMMOVE(dest,destIdx,src,srcIdx,size) ARRAY_VTYPE_MEMMOVE(double,dest,destIdx,src,srcIdx,size)
#define ARRAY_FREE(name) ARRAY_VTYPE_FREE(double,name)
#define ARRAY_FREE_COND(cond,name) ARRAY_VTYPE_FREE_COND(double,cond,name)
#define ARRAY_INT_REF(name) ARRAY_VTYPE_REF(int,name)
#define ARRAY_INT_LOCAL(name,size) ARRAY_VTYPE_LOCAL(int,name,size)
#define ARRAY_INT_ALLOC(name,size) ARRAY_VTYPE_ALLOC(int,name,size)
#define ARRAY_INT_COPY(dest,src,size) ARRAY_VTYPE_COPY(int,dest,src,size)
#define ARRAY_INT_MEMMOVE(dest,destIdx,src,srcIdx,size) ARRAY_VTYPE_MEMMOVE(int,dest,destIdx,src,srcIdx,size)
#define ARRAY_INT_FREE(name) ARRAY_VTYPE_FREE(int,name)
#define ARRAY_INT_FREE_COND(cond,name) ARRAY_VTYPE_FREE_COND(int,cond,name)
#define ARRAY_MEMMOVEMIX_VAR int mmmixi, mmmixdestIdx, mmmixsrcIdx
#define ARRAY_MEMMOVEMIX(dest,destIdx,src,srcIdx,size) { \
for( mmmixi=0, mmmixdestIdx=destIdx, mmmixsrcIdx=srcIdx; \
mmmixi < size; \
mmmixi++, mmmixdestIdx++, mmmixsrcIdx++ ) \
{ \
dest[mmmixdestIdx] = src[mmmixsrcIdx]; \
} \
}
#if defined( _MANAGED )
#define TA_GLOBALS_UNSTABLE_PERIOD(x,y) (Globals->unstablePeriod[(int)(FuncUnstId::y)])
#define TA_GLOBALS_COMPATIBILITY (Globals->compatibility)
#elif defined( _JAVA )
#define TA_GLOBALS_UNSTABLE_PERIOD(x,y) (this.unstablePeriod[FuncUnstId.y.ordinal()])
#define TA_GLOBALS_COMPATIBILITY (this.compatibility)
#else
#define TA_GLOBALS_UNSTABLE_PERIOD(x,y) (TA_Globals->unstablePeriod[x])
#define TA_GLOBALS_COMPATIBILITY (TA_Globals->compatibility)
#endif
#if defined( _MANAGED )
#define CIRCBUF_PROLOG(Id,Type,Size) int Id##_Idx = 0; \
cli::array<Type>^ Id; \
int maxIdx_##Id = (Size-1)
#define CIRCBUF_PROLOG_CLASS(Id,Type,Size) int Id##_Idx = 0; \
cli::array<Type^>^ Id; \
int maxIdx_##Id = (Size-1)
#define CIRCBUF_INIT(Id,Type,Size) \
{ \
if( Size <= 0 ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
Id = gcnew cli::array<Type>(Size); \
if( !Id ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
maxIdx_##Id = (Size-1); \
}
#define CIRCBUF_INIT_CLASS(Id,Type,Size) \
{ \
if( Size <= 0 ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
Id = gcnew cli::array<Type^>(Size); \
for( int _##Id##_index=0; _##Id##_index<Id->Length; _##Id##_index++) \
{ \
Id[_##Id##_index]=gcnew Type(); \
} \
if( !Id ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
maxIdx_##Id = (Size-1); \
}
#define CIRCBUF_INIT_LOCAL_ONLY(Id,Type) \
{ \
Id = gcnew cli::array<Type>(maxIdx_##Id+1); \
if( !Id ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
}
#define CIRCBUF_DESTROY(Id)
#define CIRCBUF_REF(x) (x)->
#elif defined(_JAVA)
#define CIRCBUF_PROLOG(Id,Type,Size) int Id##_Idx = 0; \
Type []Id; \
int maxIdx_##Id = (Size-1)
#define CIRCBUF_PROLOG_CLASS(Id,Type,Size) int Id##_Idx = 0; \
Type []Id; \
int maxIdx_##Id = (Size-1)
#define CIRCBUF_INIT(Id,Type,Size) \
{ \
if( Size <= 0 ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
Id = new Type[Size]; \
maxIdx_##Id = (Size-1); \
}
#define CIRCBUF_INIT_CLASS(Id,Type,Size) \
{ \
if( Size <= 0 ) \
return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); \
Id = new Type[Size]; \
for( int _##Id##_index=0; _##Id##_index<Id.length; _##Id##_index++) \
{ \
Id[_##Id##_index]=new Type(); \
} \
maxIdx_##Id = (Size-1); \
}
#define CIRCBUF_INIT_LOCAL_ONLY(Id,Type) \
{ \
Id = new Type[maxIdx_##Id+1]; \
}
#define CIRCBUF_DESTROY(Id)
#define CIRCBUF_REF(x) (x).
#else
#define CIRCBUF_PROLOG(Id,Type,Size) Type local_##Id[Size]; \
int Id##_Idx; \
Type *Id; \
int maxIdx_##Id
#define CIRCBUF_PROLOG_CLASS(Id,Type,Size) CIRCBUF_PROLOG(Id,Type,Size)
#define CIRCBUF_INIT(Id,Type,Size) \
{ \
if( Size < 1 ) \
return TA_INTERNAL_ERROR(137); \
if( (int)Size > (int)(sizeof(local_##Id)/sizeof(Type)) ) \
{ \
Id = TA_Malloc( sizeof(Type)*Size ); \
if( !Id ) \
return TA_ALLOC_ERR; \
} \
else \
Id = &local_##Id[0]; \
maxIdx_##Id = (Size-1); \
Id##_Idx = 0; \
}
#define CIRCBUF_INIT_CLASS(Id,Type,Size) CIRCBUF_INIT(Id,Type,Size)
#define CIRCBUF_INIT_LOCAL_ONLY(Id,Type) \
{ \
Id = &local_##Id[0]; \
maxIdx_##Id = (int)(sizeof(local_##Id)/sizeof(Type))-1; \
Id##_Idx = 0; \
}
#define CIRCBUF_DESTROY(Id) \
{ \
if( Id != &local_##Id[0] ) \
TA_Free( Id ); \
}
#define CIRCBUF_REF(x) (x).
#endif
#define CIRCBUF_NEXT(Id) \
{ \
Id##_Idx++; \
if( Id##_Idx > maxIdx_##Id ) \
Id##_Idx = 0; \
}
#endif