ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vecFlt.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__vec__vecFlt_h
22#define ABC__misc__vec__vecFlt_h
23
24
28
29#include <stdio.h>
30
32
33
37
41
42typedef struct Vec_Flt_t_ Vec_Flt_t;
44{
45 int nCap;
46 int nSize;
47 float * pArray;
48};
49
53
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-- )
62
66
78static inline Vec_Flt_t * Vec_FltAlloc( int nCap )
79{
80 Vec_Flt_t * p;
81 p = ABC_ALLOC( Vec_Flt_t, 1 );
82 if ( nCap > 0 && nCap < 16 )
83 nCap = 16;
84 p->nSize = 0;
85 p->nCap = nCap;
86 p->pArray = p->nCap? ABC_ALLOC( float, p->nCap ) : NULL;
87 return p;
88}
89static inline Vec_Flt_t * Vec_FltAllocExact( int nCap )
90{
91 Vec_Flt_t * p;
92 assert( nCap >= 0 );
93 p = ABC_ALLOC( Vec_Flt_t, 1 );
94 p->nSize = 0;
95 p->nCap = nCap;
96 p->pArray = p->nCap? ABC_ALLOC( float, p->nCap ) : NULL;
97 return p;
98}
99
111static inline Vec_Flt_t * Vec_FltStart( int nSize )
112{
113 Vec_Flt_t * p;
114 p = Vec_FltAlloc( nSize );
115 p->nSize = nSize;
116 memset( p->pArray, 0, sizeof(float) * (size_t)nSize );
117 return p;
118}
119static inline Vec_Flt_t * Vec_FltStartFull( int nSize )
120{
121 Vec_Flt_t * p;
122 p = Vec_FltAlloc( nSize );
123 p->nSize = nSize;
124 memset( p->pArray, 0xFF, sizeof(float) * (size_t)nSize );
125 return p;
126}
127
139static inline Vec_Flt_t * Vec_FltAllocArray( float * pArray, int nSize )
140{
141 Vec_Flt_t * p;
142 p = ABC_ALLOC( Vec_Flt_t, 1 );
143 p->nSize = nSize;
144 p->nCap = nSize;
145 p->pArray = pArray;
146 return p;
147}
148
160static inline Vec_Flt_t * Vec_FltAllocArrayCopy( float * pArray, int nSize )
161{
162 Vec_Flt_t * p;
163 p = ABC_ALLOC( Vec_Flt_t, 1 );
164 p->nSize = nSize;
165 p->nCap = nSize;
166 p->pArray = ABC_ALLOC( float, nSize );
167 memcpy( p->pArray, pArray, sizeof(float) * (size_t)nSize );
168 return p;
169}
170
182static inline Vec_Flt_t * Vec_FltDup( Vec_Flt_t * pVec )
183{
184 Vec_Flt_t * p;
185 p = ABC_ALLOC( Vec_Flt_t, 1 );
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 );
190 return p;
191}
192
204static inline Vec_Flt_t * Vec_FltDupArray( Vec_Flt_t * pVec )
205{
206 Vec_Flt_t * p;
207 p = ABC_ALLOC( Vec_Flt_t, 1 );
208 p->nSize = pVec->nSize;
209 p->nCap = pVec->nCap;
210 p->pArray = pVec->pArray;
211 pVec->nSize = 0;
212 pVec->nCap = 0;
213 pVec->pArray = NULL;
214 return p;
215}
216
228static inline void Vec_FltZero( Vec_Flt_t * p )
229{
230 p->pArray = NULL;
231 p->nSize = 0;
232 p->nCap = 0;
233}
234static inline void Vec_FltErase( Vec_Flt_t * p )
235{
236 ABC_FREE( p->pArray );
237 p->nSize = 0;
238 p->nCap = 0;
239}
240static inline void Vec_FltFree( Vec_Flt_t * p )
241{
242 ABC_FREE( p->pArray );
243 ABC_FREE( p );
244}
245
257static inline void Vec_FltFreeP( Vec_Flt_t ** p )
258{
259 if ( *p == NULL )
260 return;
261 ABC_FREE( (*p)->pArray );
262 ABC_FREE( (*p) );
263}
264
276static inline float * Vec_FltReleaseArray( Vec_Flt_t * p )
277{
278 float * pArray = p->pArray;
279 p->nCap = 0;
280 p->nSize = 0;
281 p->pArray = NULL;
282 return pArray;
283}
284
296static inline float * Vec_FltArray( Vec_Flt_t * p )
297{
298 return p->pArray;
299}
300static inline float ** Vec_FltArrayP( Vec_Flt_t * p )
301{
302 return &p->pArray;
303}
304
316static inline int Vec_FltSize( Vec_Flt_t * p )
317{
318 return p->nSize;
319}
320
332static inline int Vec_FltCap( Vec_Flt_t * p )
333{
334 return p->nCap;
335}
336
348static inline double Vec_FltMemory( Vec_Flt_t * p )
349{
350 return !p ? 0.0 : 1.0 * sizeof(float) * (size_t)p->nCap + sizeof(Vec_Flt_t);
351}
352
364static inline float Vec_FltEntry( Vec_Flt_t * p, int i )
365{
366 assert( i >= 0 && i < p->nSize );
367 return p->pArray[i];
368}
369static inline float * Vec_FltEntryP( Vec_Flt_t * p, int i )
370{
371 assert( i >= 0 && i < p->nSize );
372 return p->pArray + i;
373}
374
386static inline void Vec_FltWriteEntry( Vec_Flt_t * p, int i, float Entry )
387{
388 assert( i >= 0 && i < p->nSize );
389 p->pArray[i] = Entry;
390}
391
403static inline void Vec_FltAddToEntry( Vec_Flt_t * p, int i, float Addition )
404{
405 assert( i >= 0 && i < p->nSize );
406 p->pArray[i] += Addition;
407}
408
420static inline void Vec_FltUpdateEntry( Vec_Flt_t * p, int i, float Value )
421{
422 if ( Vec_FltEntry( p, i ) < Value )
423 Vec_FltWriteEntry( p, i, Value );
424}
425
437static inline float Vec_FltEntryLast( Vec_Flt_t * p )
438{
439 return p->pArray[p->nSize-1];
440}
441
453static inline void Vec_FltGrow( Vec_Flt_t * p, int nCapMin )
454{
455 if ( p->nCap >= nCapMin )
456 return;
457 assert( p->nCap < ABC_INT_MAX );
458 p->pArray = ABC_REALLOC( float, p->pArray, nCapMin );
459 p->nCap = nCapMin;
460}
461
473static inline void Vec_FltFill( Vec_Flt_t * p, int nSize, float Entry )
474{
475 int i;
476 Vec_FltGrow( p, nSize );
477 for ( i = 0; i < nSize; i++ )
478 p->pArray[i] = Entry;
479 p->nSize = nSize;
480}
481
493static inline void Vec_FltFillExtra( Vec_Flt_t * p, int nSize, float Fill )
494{
495 int i;
496 if ( nSize <= p->nSize )
497 return;
498 if ( nSize > 2 * p->nCap )
499 Vec_FltGrow( p, nSize );
500 else if ( nSize > p->nCap )
501 Vec_FltGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
502 for ( i = p->nSize; i < nSize; i++ )
503 p->pArray[i] = Fill;
504 p->nSize = nSize;
505}
506
518static inline void Vec_FltShrink( Vec_Flt_t * p, int nSizeNew )
519{
520 assert( p->nSize >= nSizeNew );
521 p->nSize = nSizeNew;
522}
523
535static inline void Vec_FltClear( Vec_Flt_t * p )
536{
537 p->nSize = 0;
538}
539
551static inline void Vec_FltPush( Vec_Flt_t * p, float Entry )
552{
553 if ( p->nSize == p->nCap )
554 {
555 if ( p->nCap < 16 )
556 Vec_FltGrow( p, 16 );
557 else
558 Vec_FltGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
559 }
560 p->pArray[p->nSize++] = Entry;
561}
562
574static inline void Vec_FltPushOrder( Vec_Flt_t * p, float Entry )
575{
576 int i;
577 if ( p->nSize == p->nCap )
578 {
579 if ( p->nCap < 16 )
580 Vec_FltGrow( p, 16 );
581 else
582 Vec_FltGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
583 }
584 p->nSize++;
585 for ( i = p->nSize-2; i >= 0; i-- )
586 if ( p->pArray[i] > Entry )
587 p->pArray[i+1] = p->pArray[i];
588 else
589 break;
590 p->pArray[i+1] = Entry;
591}
592
604static inline int Vec_FltPushUnique( Vec_Flt_t * p, float Entry )
605{
606 int i;
607 for ( i = 0; i < p->nSize; i++ )
608 if ( p->pArray[i] == Entry )
609 return 1;
610 Vec_FltPush( p, Entry );
611 return 0;
612}
613
625static inline float Vec_FltPop( Vec_Flt_t * p )
626{
627 assert( p->nSize > 0 );
628 return p->pArray[--p->nSize];
629}
630
642static inline int Vec_FltFind( Vec_Flt_t * p, float Entry )
643{
644 int i;
645 for ( i = 0; i < p->nSize; i++ )
646 if ( p->pArray[i] == Entry )
647 return i;
648 return -1;
649}
650
662static inline int Vec_FltRemove( Vec_Flt_t * p, float Entry )
663{
664 int i;
665 for ( i = 0; i < p->nSize; i++ )
666 if ( p->pArray[i] == Entry )
667 break;
668 if ( i == p->nSize )
669 return 0;
670 assert( i < p->nSize );
671 for ( i++; i < p->nSize; i++ )
672 p->pArray[i-1] = p->pArray[i];
673 p->nSize--;
674 return 1;
675}
676
688static inline float Vec_FltFindMax( Vec_Flt_t * p )
689{
690 int i;
691 float Best;
692 if ( p->nSize == 0 )
693 return 0;
694 Best = p->pArray[0];
695 for ( i = 1; i < p->nSize; i++ )
696 if ( Best < p->pArray[i] )
697 Best = p->pArray[i];
698 return Best;
699}
700static inline float Vec_FltFindMin( Vec_Flt_t * p )
701{
702 int i;
703 float Best;
704 if ( p->nSize == 0 )
705 return 0;
706 Best = p->pArray[0];
707 for ( i = 1; i < p->nSize; i++ )
708 if ( Best > p->pArray[i] )
709 Best = p->pArray[i];
710 return Best;
711}
712
724static inline int Vec_FltEqual( Vec_Flt_t * p1, Vec_Flt_t * p2 )
725{
726 int i;
727 if ( p1->nSize != p2->nSize )
728 return 0;
729 for ( i = 0; i < p1->nSize; i++ )
730 if ( p1->pArray[i] != p2->pArray[i] )
731 return 0;
732 return 1;
733}
734
746static inline void Vec_FltPrint( Vec_Flt_t * vVec )
747{
748 int i; float Entry;
749 printf( "Vector has %d entries: {", Vec_FltSize(vVec) );
750 Vec_FltForEachEntry( vVec, Entry, i )
751 printf( " %f", Entry );
752 printf( " }\n" );
753}
754
766static int Vec_FltSortCompare1( float * pp1, float * pp2 )
767{
768 // for some reason commenting out lines (as shown) led to crashing of the release version
769 if ( *pp1 < *pp2 )
770 return -1;
771 if ( *pp1 > *pp2 ) //
772 return 1;
773 return 0; //
774}
775
787static int Vec_FltSortCompare2( float * pp1, float * pp2 )
788{
789 // for some reason commenting out lines (as shown) led to crashing of the release version
790 if ( *pp1 > *pp2 )
791 return -1;
792 if ( *pp1 < *pp2 ) //
793 return 1;
794 return 0; //
795}
796
808static inline void Vec_FltSort( Vec_Flt_t * p, int fReverse )
809{
810 if ( fReverse )
811 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(float),
812 (int (*)(const void *, const void *)) Vec_FltSortCompare2 );
813 else
814 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(float),
815 (int (*)(const void *, const void *)) Vec_FltSortCompare1 );
816}
817
821
822
823
825
826#endif
827
#define ABC_INT_MAX
Definition abc_global.h:251
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
Cube * p
Definition exorList.c:222
int nSize
Definition vecFlt.h:46
float * pArray
Definition vecFlt.h:47
int nCap
Definition vecFlt.h:45
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()
#define Vec_FltForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecFlt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
Definition vecFlt.h:42