Changes in src/libcfa/stdlib.c [f3fc631f:6065b3aa]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/stdlib.c
rf3fc631f r6065b3aa 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 30 09:07:56201713 // Update Count : 2 3712 // Last Modified On : Thu Jun 1 21:52:57 2017 13 // Update Count : 280 14 14 // 15 15 … … 28 28 29 29 // resize, non-array types 30 forall( dtype T | sized(T) ) T * realloc( T * ptr, size_t size, char fill ) { // alternative realloc with fill value 31 //printf( "X6\n" ); 30 forall( dtype T | sized(T) ) T * alloc( T ptr[], size_t dim, char fill ) { 32 31 size_t olen = malloc_usable_size( ptr ); // current allocation 33 char * nptr = (void *)realloc( (void *)ptr, size );// C realloc32 char * nptr = (void *)realloc( (void *)ptr, dim * (size_t)sizeof(T) ); // C realloc 34 33 size_t nlen = malloc_usable_size( nptr ); // new allocation 35 34 if ( nlen > olen ) { // larger ? … … 37 36 } // 38 37 return (T *)nptr; 39 } // realloc40 41 // allocation/deallocation and constructor/destructor 42 forall( dtype T , ttype Params | sized(T)| { void ?{}( T *, Params ); } )38 } // alloc 39 40 // allocation/deallocation and constructor/destructor, non-array types 41 forall( dtype T | sized(T), ttype Params | { void ?{}( T *, Params ); } ) 43 42 T * new( Params p ) { 44 return ( (T *)malloc()){ p };43 return (malloc()){ p }; // run constructor 45 44 } // new 46 45 47 46 forall( dtype T | { void ^?{}( T * ); } ) 48 47 void delete( T * ptr ) { 49 if ( ptr ) { 48 if ( ptr ) { // ignore null 50 49 ^ptr{}; // run destructor 51 50 free( ptr ); … … 55 54 forall( dtype T, ttype Params | { void ^?{}( T * ); void delete( Params ); } ) 56 55 void delete( T * ptr, Params rest ) { 57 if ( ptr ) { 56 if ( ptr ) { // ignore null 58 57 ^ptr{}; // run destructor 59 58 free( ptr ); … … 61 60 delete( rest ); 62 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 63 94 64 95 //---------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.