Changes in src/libcfa/stdlib.c [6065b3aa:f3ddc21]
- File:
-
- 1 edited
-
src/libcfa/stdlib.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/stdlib.c
r6065b3aa rf3ddc21 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Jun 1 21:52:57201713 // Update Count : 28012 // Last Modified On : Tue May 9 08:43:00 2017 13 // Update Count : 191 14 14 // 15 15 … … 21 21 #define _XOPEN_SOURCE 600 // posix_memalign, *rand48 22 22 #include <stdlib.h> // malloc, free, calloc, realloc, memalign, posix_memalign, bsearch 23 #include <string.h> // mem cpy, memset23 #include <string.h> // memset 24 24 #include <malloc.h> // malloc_usable_size 25 25 #include <math.h> // fabsf, fabs, fabsl … … 27 27 } // extern "C" 28 28 29 // resize, non-array types 30 forall( dtype T | sized(T) ) T * alloc( T ptr[], size_t dim, char fill ) { 31 size_t olen = malloc_usable_size( ptr ); // current allocation 32 char * nptr = (void *)realloc( (void *)ptr, dim * (size_t)sizeof(T) ); // C realloc 33 size_t nlen = malloc_usable_size( nptr ); // new allocation 34 if ( nlen > olen ) { // larger ? 35 memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage 36 } // 37 return (T *)nptr; 38 } // alloc 39 40 // allocation/deallocation and constructor/destructor, non-array types 41 forall( dtype T | sized(T), ttype Params | { void ?{}( T *, Params ); } ) 29 forall( dtype T | sized(T) ) T * malloc( void ) { // type-safe 30 return (T *)(void *)malloc( (size_t)sizeof(T) ); 31 } // malloc 32 33 forall( dtype T | sized(T) ) T * malloc( char fill ) { // initial with fill value (like calloc) 34 T * ptr = (T *)(void *)malloc( (size_t)sizeof(T) ); 35 return memset( ptr, (int)fill, sizeof(T) ); 36 } // malloc 37 38 forall( dtype T | sized(T) ) T * malloc( T * ptr, size_t size ) { // alternative realloc 39 return (T *)realloc( ptr, size ); 40 } // malloc 41 42 forall( dtype T | sized(T) ) T * malloc( T * ptr, size_t size, unsigned char fill ) { // alternative realloc with fill value 43 return (T *)realloc( ptr, size, fill ); 44 } // malloc 45 46 47 forall( dtype T | sized(T) ) T * calloc( size_t nmemb ) { // type-safe array initialization with fill 0 48 return (T *)calloc( nmemb, sizeof(T) ); 49 } // calloc 50 51 52 forall( dtype T | sized(T) ) T * realloc( T * ptr, size_t size ) { // type-safe 53 return (T *)(void *)realloc( (void *)ptr, size ); 54 } // realloc 55 56 forall( dtype T | sized(T) ) T * realloc( T * ptr, size_t size, unsigned char fill ) { // alternative realloc with fill value 57 char * nptr = (T *)(void *)realloc( (void *)ptr, size ); 58 size_t unused = malloc_usable_size( nptr ); 59 memset( nptr + size - unused, (int)fill, unused ); // initialize any new storage 60 return nptr; 61 } // realloc 62 63 64 forall( dtype T | sized(T) ) T * aligned_alloc( size_t alignment ) { // aligned allocation 65 return (T *)memalign( alignment, sizeof(T) ); 66 } // aligned_alloc 67 68 forall( dtype T | sized(T) ) T * memalign( size_t alignment ) { 69 return (T *)memalign( alignment, sizeof(T) ); 70 } // memalign 71 72 forall( dtype T | sized(T) ) int posix_memalign( T ** ptr, size_t alignment ) { 73 return posix_memalign( (void **)ptr, alignment, sizeof(T) ); 74 } // posix_memalign 75 76 77 forall( dtype T, ttype Params | sized(T) | { void ?{}( T *, Params ); } ) // new 42 78 T * new( Params p ) { 43 return ( malloc()){ p }; // run constructor79 return ((T *)malloc()){ p }; 44 80 } // new 45 81 46 forall( dtype T | { void ^?{}( T * ); } )82 forall( dtype T | { void ^?{}(T *); } ) // delete 47 83 void delete( T * ptr ) { 48 if ( ptr ) { // ignore null49 ^ptr{}; // run destructor84 if ( ptr ) { 85 ^ptr{}; 50 86 free( ptr ); 51 } // if87 } 52 88 } // delete 53 89 54 forall( dtype T, ttype Params | { void ^?{}( T * ); void delete( Params); } )90 forall( dtype T, ttype Params | { void ^?{}(T *); void delete(Params); } ) 55 91 void delete( T * ptr, Params rest ) { 56 if ( ptr ) { // ignore null57 ^ptr{}; // run destructor92 if ( ptr ) { 93 ^ptr{}; 58 94 free( ptr ); 59 } // if95 } 60 96 delete( rest ); 61 97 } // delete 62 63 64 // allocation/deallocation and constructor/destructor, array types65 forall( dtype T | sized(T), ttype Params | { void ?{}( T *, Params ); } )66 T * anew( size_t dim, Params p ) {67 T *arr = alloc( dim );68 for ( unsigned int i = 0; i < dim; i += 1 ) {69 (&arr[i]){ p }; // run constructor70 } // for71 return arr;72 } // anew73 74 forall( dtype T | sized(T) | { void ^?{}( T * ); } )75 void adelete( size_t dim, T arr[] ) {76 if ( arr ) { // ignore null77 for ( int i = dim - 1; i >= 0; i -= 1 ) { // reverse allocation order, must be unsigned78 ^(&arr[i]){}; // run destructor79 } // for80 free( arr );81 } // if82 } // adelete83 84 forall( dtype T | sized(T) | { void ^?{}( T * ); }, ttype Params | { void adelete( Params ); } )85 void adelete( size_t dim, T arr[], Params rest ) {86 if ( arr ) { // ignore null87 for ( int i = dim - 1; i >= 0; i -= 1 ) { // reverse allocation order, must be unsigned88 ^(&arr[i]){}; // run destructor89 } // for90 free( arr );91 } // if92 adelete( rest );93 } // adelete94 98 95 99 //--------------------------------------- … … 238 242 239 243 forall( otype T | { int ?<?( T, T ); } ) 240 T * bsearch( T key, const T * arr, size_t dim ) {244 T * bsearch( T key, const T * arr, size_t dimension ) { 241 245 int comp( const void * t1, const void * t2 ) { return *(T *)t1 < *(T *)t2 ? -1 : *(T *)t2 < *(T *)t1 ? 1 : 0; } 242 return (T *)bsearch( &key, arr, dim , sizeof(T), comp );246 return (T *)bsearch( &key, arr, dimension, sizeof(T), comp ); 243 247 } // bsearch 244 248 245 249 forall( otype T | { int ?<?( T, T ); } ) 246 unsigned int bsearch( T key, const T * arr, size_t dim ) {247 T *result = bsearch( key, arr, dim );248 return result ? result - arr : dim ;// pointer subtraction includes sizeof(T)250 unsigned int bsearch( T key, const T * arr, size_t dimension ) { 251 T *result = bsearch( key, arr, dimension ); 252 return result ? result - arr : dimension; // pointer subtraction includes sizeof(T) 249 253 } // bsearch 250 254 251 255 forall( otype T | { int ?<?( T, T ); } ) 252 void qsort( const T * arr, size_t dim ) {256 void qsort( const T * arr, size_t dimension ) { 253 257 int comp( const void * t1, const void * t2 ) { return *(T *)t1 < *(T *)t2 ? -1 : *(T *)t2 < *(T *)t1 ? 1 : 0; } 254 qsort( arr, dim , sizeof(T), comp );258 qsort( arr, dimension, sizeof(T), comp ); 255 259 } // qsort 256 260 … … 275 279 276 280 void rand48seed( long int s ) { srand48( s ); } 277 char rand48( void) { return mrand48(); }278 int rand48( void) { return mrand48(); }279 unsigned int rand48( void) { return lrand48(); }280 long int rand48( void) { return mrand48(); }281 unsigned long int rand48( void) { return lrand48(); }282 float rand48( void ) { return (float)drand48(); }// otherwise float uses lrand48283 double rand48( void) { return drand48(); }284 float _Complex rand48( void) { return (float)drand48() + (float _Complex)(drand48() * _Complex_I); }285 double _Complex rand48( void) { return drand48() + (double _Complex)(drand48() * _Complex_I); }286 long double _Complex rand48( void) { return (long double)drand48() + (long double _Complex)(drand48() * _Complex_I); }281 char rand48() { return mrand48(); } 282 int rand48() { return mrand48(); } 283 unsigned int rand48() { return lrand48(); } 284 long int rand48() { return mrand48(); } 285 unsigned long int rand48() { return lrand48(); } 286 float rand48() { return (float)drand48(); } // otherwise float uses lrand48 287 double rand48() { return drand48(); } 288 float _Complex rand48() { return (float)drand48() + (float _Complex)(drand48() * _Complex_I); } 289 double _Complex rand48() { return drand48() + (double _Complex)(drand48() * _Complex_I); } 290 long double _Complex rand48() { return (long double)drand48() + (long double _Complex)(drand48() * _Complex_I); } 287 291 288 292 //---------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.