/stp-0.1/src/extlib-abc/vecFlt.h

# · C Header · 630 lines · 243 code · 40 blank · 347 comment · 42 complexity · c0110cfc0e5554792a75d69281c5ad81 MD5 · raw file

  1. /**CFile****************************************************************
  2. FileName [vecFlt.h]
  3. SystemName [ABC: Logic synthesis and verification system.]
  4. PackageName [Resizable arrays.]
  5. Synopsis [Resizable arrays of floats.]
  6. Author [Aaron P. Hurst]
  7. Affiliation [UC Berkeley]
  8. Date [Ver. 1.0. Started - June 20, 2005.]
  9. Revision [$Id: vecInt.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
  10. ***********************************************************************/
  11. #ifndef __VEC_FLT_H__
  12. #define __VEC_FLT_H__
  13. ////////////////////////////////////////////////////////////////////////
  14. /// INCLUDES ///
  15. ////////////////////////////////////////////////////////////////////////
  16. #include <stdio.h>
  17. ////////////////////////////////////////////////////////////////////////
  18. /// PARAMETERS ///
  19. ////////////////////////////////////////////////////////////////////////
  20. ////////////////////////////////////////////////////////////////////////
  21. /// BASIC TYPES ///
  22. ////////////////////////////////////////////////////////////////////////
  23. typedef struct Vec_Flt_t_ Vec_Flt_t;
  24. struct Vec_Flt_t_
  25. {
  26. int nCap;
  27. int nSize;
  28. float * pArray;
  29. };
  30. ////////////////////////////////////////////////////////////////////////
  31. /// MACRO DEFINITIONS ///
  32. ////////////////////////////////////////////////////////////////////////
  33. #define Vec_FltForEachEntry( vVec, Entry, i ) \
  34. for ( i = 0; (i < Vec_FltSize(vVec)) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ )
  35. #define Vec_FltForEachEntryStart( vVec, Entry, i, Start ) \
  36. for ( i = Start; (i < Vec_FltSize(vVec)) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ )
  37. #define Vec_FltForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \
  38. for ( i = Start; (i < Stop) && (((Entry) = Vec_FltEntry(vVec, i)), 1); i++ )
  39. #define Vec_FltForEachEntryReverse( vVec, pEntry, i ) \
  40. for ( i = Vec_FltSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_FltEntry(vVec, i)), 1); i-- )
  41. ////////////////////////////////////////////////////////////////////////
  42. /// FUNCTION DEFINITIONS ///
  43. ////////////////////////////////////////////////////////////////////////
  44. /**Function*************************************************************
  45. Synopsis [Allocates a vector with the given capacity.]
  46. Description []
  47. SideEffects []
  48. SeeAlso []
  49. ***********************************************************************/
  50. static inline Vec_Flt_t * Vec_FltAlloc( int nCap )
  51. {
  52. Vec_Flt_t * p;
  53. p = ALLOC( Vec_Flt_t, 1 );
  54. if ( nCap > 0 && nCap < 16 )
  55. nCap = 16;
  56. p->nSize = 0;
  57. p->nCap = nCap;
  58. p->pArray = p->nCap? ALLOC( float, p->nCap ) : NULL;
  59. return p;
  60. }
  61. /**Function*************************************************************
  62. Synopsis [Allocates a vector with the given size and cleans it.]
  63. Description []
  64. SideEffects []
  65. SeeAlso []
  66. ***********************************************************************/
  67. static inline Vec_Flt_t * Vec_FltStart( int nSize )
  68. {
  69. Vec_Flt_t * p;
  70. p = Vec_FltAlloc( nSize );
  71. p->nSize = nSize;
  72. memset( p->pArray, 0, sizeof(float) * nSize );
  73. return p;
  74. }
  75. /**Function*************************************************************
  76. Synopsis [Creates the vector from a float array of the given size.]
  77. Description []
  78. SideEffects []
  79. SeeAlso []
  80. ***********************************************************************/
  81. static inline Vec_Flt_t * Vec_FltAllocArray( float * pArray, int nSize )
  82. {
  83. Vec_Flt_t * p;
  84. p = ALLOC( Vec_Flt_t, 1 );
  85. p->nSize = nSize;
  86. p->nCap = nSize;
  87. p->pArray = pArray;
  88. return p;
  89. }
  90. /**Function*************************************************************
  91. Synopsis [Creates the vector from a float array of the given size.]
  92. Description []
  93. SideEffects []
  94. SeeAlso []
  95. ***********************************************************************/
  96. static inline Vec_Flt_t * Vec_FltAllocArrayCopy( float * pArray, int nSize )
  97. {
  98. Vec_Flt_t * p;
  99. p = ALLOC( Vec_Flt_t, 1 );
  100. p->nSize = nSize;
  101. p->nCap = nSize;
  102. p->pArray = ALLOC( float, nSize );
  103. memcpy( p->pArray, pArray, sizeof(float) * nSize );
  104. return p;
  105. }
  106. /**Function*************************************************************
  107. Synopsis [Duplicates the float array.]
  108. Description []
  109. SideEffects []
  110. SeeAlso []
  111. ***********************************************************************/
  112. static inline Vec_Flt_t * Vec_FltDup( Vec_Flt_t * pVec )
  113. {
  114. Vec_Flt_t * p;
  115. p = ALLOC( Vec_Flt_t, 1 );
  116. p->nSize = pVec->nSize;
  117. p->nCap = pVec->nCap;
  118. p->pArray = p->nCap? ALLOC( float, p->nCap ) : NULL;
  119. memcpy( p->pArray, pVec->pArray, sizeof(float) * pVec->nSize );
  120. return p;
  121. }
  122. /**Function*************************************************************
  123. Synopsis [Transfers the array into another vector.]
  124. Description []
  125. SideEffects []
  126. SeeAlso []
  127. ***********************************************************************/
  128. static inline Vec_Flt_t * Vec_FltDupArray( Vec_Flt_t * pVec )
  129. {
  130. Vec_Flt_t * p;
  131. p = ALLOC( Vec_Flt_t, 1 );
  132. p->nSize = pVec->nSize;
  133. p->nCap = pVec->nCap;
  134. p->pArray = pVec->pArray;
  135. pVec->nSize = 0;
  136. pVec->nCap = 0;
  137. pVec->pArray = NULL;
  138. return p;
  139. }
  140. /**Function*************************************************************
  141. Synopsis []
  142. Description []
  143. SideEffects []
  144. SeeAlso []
  145. ***********************************************************************/
  146. static inline void Vec_FltFree( Vec_Flt_t * p )
  147. {
  148. FREE( p->pArray );
  149. FREE( p );
  150. }
  151. /**Function*************************************************************
  152. Synopsis []
  153. Description []
  154. SideEffects []
  155. SeeAlso []
  156. ***********************************************************************/
  157. static inline float * Vec_FltReleaseArray( Vec_Flt_t * p )
  158. {
  159. float * pArray = p->pArray;
  160. p->nCap = 0;
  161. p->nSize = 0;
  162. p->pArray = NULL;
  163. return pArray;
  164. }
  165. /**Function*************************************************************
  166. Synopsis []
  167. Description []
  168. SideEffects []
  169. SeeAlso []
  170. ***********************************************************************/
  171. static inline float * Vec_FltArray( Vec_Flt_t * p )
  172. {
  173. return p->pArray;
  174. }
  175. /**Function*************************************************************
  176. Synopsis []
  177. Description []
  178. SideEffects []
  179. SeeAlso []
  180. ***********************************************************************/
  181. static inline int Vec_FltSize( Vec_Flt_t * p )
  182. {
  183. return p->nSize;
  184. }
  185. /**Function*************************************************************
  186. Synopsis []
  187. Description []
  188. SideEffects []
  189. SeeAlso []
  190. ***********************************************************************/
  191. static inline float Vec_FltEntry( Vec_Flt_t * p, int i )
  192. {
  193. assert( i >= 0 && i < p->nSize );
  194. return p->pArray[i];
  195. }
  196. /**Function*************************************************************
  197. Synopsis []
  198. Description []
  199. SideEffects []
  200. SeeAlso []
  201. ***********************************************************************/
  202. static inline void Vec_FltWriteEntry( Vec_Flt_t * p, int i, float Entry )
  203. {
  204. assert( i >= 0 && i < p->nSize );
  205. p->pArray[i] = Entry;
  206. }
  207. /**Function*************************************************************
  208. Synopsis []
  209. Description []
  210. SideEffects []
  211. SeeAlso []
  212. ***********************************************************************/
  213. static inline void Vec_FltAddToEntry( Vec_Flt_t * p, int i, float Addition )
  214. {
  215. assert( i >= 0 && i < p->nSize );
  216. p->pArray[i] += Addition;
  217. }
  218. /**Function*************************************************************
  219. Synopsis []
  220. Description []
  221. SideEffects []
  222. SeeAlso []
  223. ***********************************************************************/
  224. static inline float Vec_FltEntryLast( Vec_Flt_t * p )
  225. {
  226. return p->pArray[p->nSize-1];
  227. }
  228. /**Function*************************************************************
  229. Synopsis [Resizes the vector to the given capacity.]
  230. Description []
  231. SideEffects []
  232. SeeAlso []
  233. ***********************************************************************/
  234. static inline void Vec_FltGrow( Vec_Flt_t * p, int nCapMin )
  235. {
  236. if ( p->nCap >= nCapMin )
  237. return;
  238. p->pArray = REALLOC( float, p->pArray, nCapMin );
  239. p->nCap = nCapMin;
  240. }
  241. /**Function*************************************************************
  242. Synopsis [Fills the vector with given number of entries.]
  243. Description []
  244. SideEffects []
  245. SeeAlso []
  246. ***********************************************************************/
  247. static inline void Vec_FltFill( Vec_Flt_t * p, int nSize, float Entry )
  248. {
  249. int i;
  250. Vec_FltGrow( p, nSize );
  251. for ( i = 0; i < nSize; i++ )
  252. p->pArray[i] = Entry;
  253. p->nSize = nSize;
  254. }
  255. /**Function*************************************************************
  256. Synopsis [Fills the vector with given number of entries.]
  257. Description []
  258. SideEffects []
  259. SeeAlso []
  260. ***********************************************************************/
  261. static inline void Vec_FltFillExtra( Vec_Flt_t * p, int nSize, float Entry )
  262. {
  263. int i;
  264. if ( p->nSize >= nSize )
  265. return;
  266. Vec_FltGrow( p, nSize );
  267. for ( i = p->nSize; i < nSize; i++ )
  268. p->pArray[i] = Entry;
  269. p->nSize = nSize;
  270. }
  271. /**Function*************************************************************
  272. Synopsis []
  273. Description []
  274. SideEffects []
  275. SeeAlso []
  276. ***********************************************************************/
  277. static inline void Vec_FltShrink( Vec_Flt_t * p, int nSizeNew )
  278. {
  279. assert( p->nSize >= nSizeNew );
  280. p->nSize = nSizeNew;
  281. }
  282. /**Function*************************************************************
  283. Synopsis []
  284. Description []
  285. SideEffects []
  286. SeeAlso []
  287. ***********************************************************************/
  288. static inline void Vec_FltClear( Vec_Flt_t * p )
  289. {
  290. p->nSize = 0;
  291. }
  292. /**Function*************************************************************
  293. Synopsis []
  294. Description []
  295. SideEffects []
  296. SeeAlso []
  297. ***********************************************************************/
  298. static inline void Vec_FltPush( Vec_Flt_t * p, float Entry )
  299. {
  300. if ( p->nSize == p->nCap )
  301. {
  302. if ( p->nCap < 16 )
  303. Vec_FltGrow( p, 16 );
  304. else
  305. Vec_FltGrow( p, 2 * p->nCap );
  306. }
  307. p->pArray[p->nSize++] = Entry;
  308. }
  309. /**Function*************************************************************
  310. Synopsis []
  311. Description []
  312. SideEffects []
  313. SeeAlso []
  314. ***********************************************************************/
  315. static inline void Vec_FltPushOrder( Vec_Flt_t * p, float Entry )
  316. {
  317. int i;
  318. if ( p->nSize == p->nCap )
  319. {
  320. if ( p->nCap < 16 )
  321. Vec_FltGrow( p, 16 );
  322. else
  323. Vec_FltGrow( p, 2 * p->nCap );
  324. }
  325. p->nSize++;
  326. for ( i = p->nSize-2; i >= 0; i-- )
  327. if ( p->pArray[i] > Entry )
  328. p->pArray[i+1] = p->pArray[i];
  329. else
  330. break;
  331. p->pArray[i+1] = Entry;
  332. }
  333. /**Function*************************************************************
  334. Synopsis []
  335. Description []
  336. SideEffects []
  337. SeeAlso []
  338. ***********************************************************************/
  339. static inline int Vec_FltPushUnique( Vec_Flt_t * p, float Entry )
  340. {
  341. int i;
  342. for ( i = 0; i < p->nSize; i++ )
  343. if ( p->pArray[i] == Entry )
  344. return 1;
  345. Vec_FltPush( p, Entry );
  346. return 0;
  347. }
  348. /**Function*************************************************************
  349. Synopsis [Returns the last entry and removes it from the list.]
  350. Description []
  351. SideEffects []
  352. SeeAlso []
  353. ***********************************************************************/
  354. static inline float Vec_FltPop( Vec_Flt_t * p )
  355. {
  356. assert( p->nSize > 0 );
  357. return p->pArray[--p->nSize];
  358. }
  359. /**Function*************************************************************
  360. Synopsis [Find entry.]
  361. Description []
  362. SideEffects []
  363. SeeAlso []
  364. ***********************************************************************/
  365. static inline int Vec_FltFind( Vec_Flt_t * p, float Entry )
  366. {
  367. int i;
  368. for ( i = 0; i < p->nSize; i++ )
  369. if ( p->pArray[i] == Entry )
  370. return i;
  371. return -1;
  372. }
  373. /**Function*************************************************************
  374. Synopsis []
  375. Description []
  376. SideEffects []
  377. SeeAlso []
  378. ***********************************************************************/
  379. static inline int Vec_FltRemove( Vec_Flt_t * p, float Entry )
  380. {
  381. int i;
  382. for ( i = 0; i < p->nSize; i++ )
  383. if ( p->pArray[i] == Entry )
  384. break;
  385. if ( i == p->nSize )
  386. return 0;
  387. assert( i < p->nSize );
  388. for ( i++; i < p->nSize; i++ )
  389. p->pArray[i-1] = p->pArray[i];
  390. p->nSize--;
  391. return 1;
  392. }
  393. /**Function*************************************************************
  394. Synopsis [Comparison procedure for two floats.]
  395. Description []
  396. SideEffects []
  397. SeeAlso []
  398. ***********************************************************************/
  399. static inline int Vec_FltSortCompare1( float * pp1, float * pp2 )
  400. {
  401. // for some reason commenting out lines (as shown) led to crashing of the release version
  402. if ( *pp1 < *pp2 )
  403. return -1;
  404. if ( *pp1 > *pp2 ) //
  405. return 1;
  406. return 0; //
  407. }
  408. /**Function*************************************************************
  409. Synopsis [Comparison procedure for two floats.]
  410. Description []
  411. SideEffects []
  412. SeeAlso []
  413. ***********************************************************************/
  414. static inline int Vec_FltSortCompare2( float * pp1, float * pp2 )
  415. {
  416. // for some reason commenting out lines (as shown) led to crashing of the release version
  417. if ( *pp1 > *pp2 )
  418. return -1;
  419. if ( *pp1 < *pp2 ) //
  420. return 1;
  421. return 0; //
  422. }
  423. /**Function*************************************************************
  424. Synopsis [Sorting the entries by their value.]
  425. Description []
  426. SideEffects []
  427. SeeAlso []
  428. ***********************************************************************/
  429. static inline void Vec_FltSort( Vec_Flt_t * p, int fReverse )
  430. {
  431. if ( fReverse )
  432. qsort( (void *)p->pArray, p->nSize, sizeof(float),
  433. (int (*)(const void *, const void *)) Vec_FltSortCompare2 );
  434. else
  435. qsort( (void *)p->pArray, p->nSize, sizeof(float),
  436. (int (*)(const void *, const void *)) Vec_FltSortCompare1 );
  437. }
  438. ////////////////////////////////////////////////////////////////////////
  439. /// END OF FILE ///
  440. ////////////////////////////////////////////////////////////////////////
  441. #endif