Changeset b1e63ac5 for src/libcfa/stdlib.c
- Timestamp:
- Jul 4, 2017, 9:40:16 AM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 208e5be
- Parents:
- 9c951e3 (diff), f7cb0bc (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/libcfa/stdlib.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/stdlib.c
r9c951e3 rb1e63ac5 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue May 9 08:43:00201713 // Update Count : 19112 // Last Modified On : Thu Jun 1 21:52:57 2017 13 // Update Count : 280 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 set23 #include <string.h> // memcpy, memset 24 24 #include <malloc.h> // malloc_usable_size 25 25 #include <math.h> // fabsf, fabs, fabsl … … 27 27 } // extern "C" 28 28 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 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 ); } ) 78 42 T * new( Params p ) { 79 return ( (T *)malloc()){ p };43 return (malloc()){ p }; // run constructor 80 44 } // new 81 45 82 forall( dtype T | { void ^?{}( T *); } ) // delete46 forall( dtype T | { void ^?{}( T * ); } ) 83 47 void delete( T * ptr ) { 84 if ( ptr ) { 85 ^ptr{}; 48 if ( ptr ) { // ignore null 49 ^ptr{}; // run destructor 86 50 free( ptr ); 87 } 51 } // if 88 52 } // delete 89 53 90 forall( dtype T, ttype Params | { void ^?{}( T *); void delete(Params); } )54 forall( dtype T, ttype Params | { void ^?{}( T * ); void delete( Params ); } ) 91 55 void delete( T * ptr, Params rest ) { 92 if ( ptr ) { 93 ^ptr{}; 56 if ( ptr ) { // ignore null 57 ^ptr{}; // run destructor 94 58 free( ptr ); 95 } 59 } // if 96 60 delete( rest ); 97 61 } // delete 62 63 64 // allocation/deallocation and constructor/destructor, array types 65 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 constructor 70 } // for 71 return arr; 72 } // anew 73 74 forall( dtype T | sized(T) | { void ^?{}( T * ); } ) 75 void adelete( size_t dim, T arr[] ) { 76 if ( arr ) { // ignore null 77 for ( int i = dim - 1; i >= 0; i -= 1 ) { // reverse allocation order, must be unsigned 78 ^(&arr[i]){}; // run destructor 79 } // for 80 free( arr ); 81 } // if 82 } // adelete 83 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 null 87 for ( int i = dim - 1; i >= 0; i -= 1 ) { // reverse allocation order, must be unsigned 88 ^(&arr[i]){}; // run destructor 89 } // for 90 free( arr ); 91 } // if 92 adelete( rest ); 93 } // adelete 98 94 99 95 //--------------------------------------- … … 242 238 243 239 forall( otype T | { int ?<?( T, T ); } ) 244 T * bsearch( T key, const T * arr, size_t dim ension) {240 T * bsearch( T key, const T * arr, size_t dim ) { 245 241 int comp( const void * t1, const void * t2 ) { return *(T *)t1 < *(T *)t2 ? -1 : *(T *)t2 < *(T *)t1 ? 1 : 0; } 246 return (T *)bsearch( &key, arr, dim ension, sizeof(T), comp );242 return (T *)bsearch( &key, arr, dim, sizeof(T), comp ); 247 243 } // bsearch 248 244 249 245 forall( otype T | { int ?<?( T, T ); } ) 250 unsigned int bsearch( T key, const T * arr, size_t dim ension) {251 T *result = bsearch( key, arr, dim ension);252 return result ? result - arr : dim ension;// pointer subtraction includes sizeof(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) 253 249 } // bsearch 254 250 255 251 forall( otype T | { int ?<?( T, T ); } ) 256 void qsort( const T * arr, size_t dim ension) {252 void qsort( const T * arr, size_t dim ) { 257 253 int comp( const void * t1, const void * t2 ) { return *(T *)t1 < *(T *)t2 ? -1 : *(T *)t2 < *(T *)t1 ? 1 : 0; } 258 qsort( arr, dim ension, sizeof(T), comp );254 qsort( arr, dim, sizeof(T), comp ); 259 255 } // qsort 260 256 … … 279 275 280 276 void rand48seed( long int s ) { srand48( s ); } 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 lrand48287 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); }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 lrand48 283 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); } 291 287 292 288 //---------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.