21#ifndef ABC__misc__vec__vecFlt_h
22#define ABC__misc__vec__vecFlt_h
54#define Vec_FltForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_FltSize(vVec)) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ )
56#define Vec_FltForEachEntryStart( vVec, Entry, i, Start ) \
57 for ( i = Start; (i < Vec_FltSize(vVec)) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ )
58#define Vec_FltForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \
59 for ( i = Start; (i < Stop) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ )
60#define Vec_FltForEachEntryReverse( vVec, pEntry, i ) \
61 for ( i = Vec_FltSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_FltEntry(vVec, i)), 1); i-- )
78static inline Vec_Flt_t * Vec_FltAlloc(
int nCap )
82 if ( nCap > 0 && nCap < 16 )
89static inline Vec_Flt_t * Vec_FltAllocExact(
int nCap )
111static inline Vec_Flt_t * Vec_FltStart(
int nSize )
114 p = Vec_FltAlloc( nSize );
116 memset(
p->pArray, 0,
sizeof(
float) * (
size_t)nSize );
119static inline Vec_Flt_t * Vec_FltStartFull(
int nSize )
122 p = Vec_FltAlloc( nSize );
124 memset(
p->pArray, 0xFF,
sizeof(
float) * (
size_t)nSize );
139static inline Vec_Flt_t * Vec_FltAllocArray(
float * pArray,
int nSize )
160static inline Vec_Flt_t * Vec_FltAllocArrayCopy(
float * pArray,
int nSize )
167 memcpy(
p->pArray, pArray,
sizeof(
float) * (
size_t)nSize );
186 p->nSize = pVec->nSize;
187 p->nCap = pVec->nCap;
188 p->pArray =
p->nCap?
ABC_ALLOC(
float,
p->nCap ) : NULL;
189 memcpy(
p->pArray, pVec->pArray,
sizeof(
float) * (
size_t)pVec->nSize );
208 p->nSize = pVec->nSize;
209 p->nCap = pVec->nCap;
210 p->pArray = pVec->pArray;
228static inline void Vec_FltZero(
Vec_Flt_t *
p )
234static inline void Vec_FltErase(
Vec_Flt_t *
p )
240static inline void Vec_FltFree(
Vec_Flt_t *
p )
257static inline void Vec_FltFreeP(
Vec_Flt_t **
p )
276static inline float * Vec_FltReleaseArray(
Vec_Flt_t *
p )
278 float * pArray =
p->pArray;
296static inline float * Vec_FltArray(
Vec_Flt_t *
p )
300static inline float ** Vec_FltArrayP(
Vec_Flt_t *
p )
348static inline double Vec_FltMemory(
Vec_Flt_t *
p )
350 return !
p ? 0.0 : 1.0 *
sizeof(float) * (
size_t)
p->nCap +
sizeof(
Vec_Flt_t);
364static inline float Vec_FltEntry(
Vec_Flt_t *
p,
int i )
366 assert( i >= 0 && i < p->nSize );
369static inline float * Vec_FltEntryP(
Vec_Flt_t *
p,
int i )
371 assert( i >= 0 && i < p->nSize );
372 return p->pArray + i;
386static inline void Vec_FltWriteEntry(
Vec_Flt_t *
p,
int i,
float Entry )
388 assert( i >= 0 && i < p->nSize );
389 p->pArray[i] = Entry;
403static inline void Vec_FltAddToEntry(
Vec_Flt_t *
p,
int i,
float Addition )
405 assert( i >= 0 && i < p->nSize );
406 p->pArray[i] += Addition;
420static inline void Vec_FltUpdateEntry(
Vec_Flt_t *
p,
int i,
float Value )
422 if ( Vec_FltEntry(
p, i ) < Value )
423 Vec_FltWriteEntry(
p, i, Value );
437static inline float Vec_FltEntryLast(
Vec_Flt_t *
p )
439 return p->pArray[
p->nSize-1];
453static inline void Vec_FltGrow(
Vec_Flt_t *
p,
int nCapMin )
455 if (
p->nCap >= nCapMin )
473static inline void Vec_FltFill(
Vec_Flt_t *
p,
int nSize,
float Entry )
476 Vec_FltGrow(
p, nSize );
477 for ( i = 0; i < nSize; i++ )
478 p->pArray[i] = Entry;
493static inline void Vec_FltFillExtra(
Vec_Flt_t *
p,
int nSize,
float Fill )
496 if ( nSize <= p->nSize )
498 if ( nSize > 2 *
p->nCap )
499 Vec_FltGrow(
p, nSize );
500 else if ( nSize >
p->nCap )
502 for ( i =
p->nSize; i < nSize; i++ )
518static inline void Vec_FltShrink(
Vec_Flt_t *
p,
int nSizeNew )
520 assert(
p->nSize >= nSizeNew );
535static inline void Vec_FltClear(
Vec_Flt_t *
p )
551static inline void Vec_FltPush(
Vec_Flt_t *
p,
float Entry )
553 if (
p->nSize ==
p->nCap )
556 Vec_FltGrow(
p, 16 );
560 p->pArray[
p->nSize++] = Entry;
574static inline void Vec_FltPushOrder(
Vec_Flt_t *
p,
float Entry )
577 if (
p->nSize ==
p->nCap )
580 Vec_FltGrow(
p, 16 );
585 for ( i =
p->nSize-2; i >= 0; i-- )
586 if (
p->pArray[i] > Entry )
587 p->pArray[i+1] =
p->pArray[i];
590 p->pArray[i+1] = Entry;
604static inline int Vec_FltPushUnique(
Vec_Flt_t *
p,
float Entry )
607 for ( i = 0; i <
p->nSize; i++ )
608 if (
p->pArray[i] == Entry )
610 Vec_FltPush(
p, Entry );
625static inline float Vec_FltPop(
Vec_Flt_t *
p )
628 return p->pArray[--
p->nSize];
642static inline int Vec_FltFind(
Vec_Flt_t *
p,
float Entry )
645 for ( i = 0; i <
p->nSize; i++ )
646 if (
p->pArray[i] == Entry )
662static inline int Vec_FltRemove(
Vec_Flt_t *
p,
float Entry )
665 for ( i = 0; i <
p->nSize; i++ )
666 if (
p->pArray[i] == Entry )
671 for ( i++; i <
p->nSize; i++ )
672 p->pArray[i-1] =
p->pArray[i];
688static inline float Vec_FltFindMax(
Vec_Flt_t *
p )
695 for ( i = 1; i <
p->nSize; i++ )
696 if ( Best < p->pArray[i] )
700static inline float Vec_FltFindMin(
Vec_Flt_t *
p )
707 for ( i = 1; i <
p->nSize; i++ )
708 if ( Best >
p->pArray[i] )
727 if ( p1->nSize != p2->nSize )
729 for ( i = 0; i < p1->nSize; i++ )
730 if ( p1->pArray[i] != p2->pArray[i] )
746static inline void Vec_FltPrint(
Vec_Flt_t * vVec )
749 printf(
"Vector has %d entries: {", Vec_FltSize(vVec) );
751 printf(
" %f", Entry );
766static int Vec_FltSortCompare1(
float * pp1,
float * pp2 )
787static int Vec_FltSortCompare2(
float * pp1,
float * pp2 )
808static inline void Vec_FltSort(
Vec_Flt_t *
p,
int fReverse )
811 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
float),
812 (int (*)(
const void *,
const void *)) Vec_FltSortCompare2 );
814 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
float),
815 (int (*)(
const void *,
const void *)) Vec_FltSortCompare1 );
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define Vec_FltForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.