Changeset d3e4d6c for src/libcfa/stdlib.c
- Timestamp:
- Aug 23, 2017, 6:22:07 PM (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:
- 87e08e24, cb811ac
- Parents:
- 9f07232 (diff), bd37119 (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
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/stdlib.c
r9f07232 rd3e4d6c 32 32 if ( nlen > olen ) { // larger ? 33 33 memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage 34 } // 34 } // 35 35 return (T *)nptr; 36 36 } // alloc 37 37 38 38 // allocation/deallocation and constructor/destructor, non-array types 39 forall( dtype T | sized(T), ttype Params | { void ?{}( T *, Params ); } )39 forall( dtype T | sized(T), ttype Params | { void ?{}( T &, Params ); } ) 40 40 T * new( Params p ) { 41 return (malloc()){ p }; // run constructor41 return &(*malloc()){ p }; // run constructor 42 42 } // new 43 43 44 forall( dtype T | { void ^?{}( T *); } )44 forall( dtype T | sized(T) | { void ^?{}( T & ); } ) 45 45 void delete( T * ptr ) { 46 46 if ( ptr ) { // ignore null 47 ^ ptr{}; // run destructor47 ^(*ptr){}; // run destructor 48 48 free( ptr ); 49 49 } // if 50 50 } // delete 51 51 52 forall( dtype T, ttype Params | { void ^?{}( T *); void delete( Params ); } )52 forall( dtype T, ttype Params | sized(T) | { void ^?{}( T & ); void delete( Params ); } ) 53 53 void delete( T * ptr, Params rest ) { 54 54 if ( ptr ) { // ignore null 55 ^ ptr{}; // run destructor55 ^(*ptr){}; // run destructor 56 56 free( ptr ); 57 57 } // if … … 61 61 62 62 // allocation/deallocation and constructor/destructor, array types 63 forall( dtype T | sized(T), ttype Params | { void ?{}( T *, Params ); } )63 forall( dtype T | sized(T), ttype Params | { void ?{}( T &, Params ); } ) 64 64 T * anew( size_t dim, Params p ) { 65 65 T *arr = alloc( dim ); 66 66 for ( unsigned int i = 0; i < dim; i += 1 ) { 67 ( &arr[i]){ p }; // run constructor67 (arr[i]){ p }; // run constructor 68 68 } // for 69 69 return arr; 70 70 } // anew 71 71 72 forall( dtype T | sized(T) | { void ^?{}( T *); } )72 forall( dtype T | sized(T) | { void ^?{}( T & ); } ) 73 73 void adelete( size_t dim, T arr[] ) { 74 74 if ( arr ) { // ignore null 75 75 for ( int i = dim - 1; i >= 0; i -= 1 ) { // reverse allocation order, must be unsigned 76 ^( &arr[i]){}; // run destructor76 ^(arr[i]){}; // run destructor 77 77 } // for 78 78 free( arr ); … … 80 80 } // adelete 81 81 82 forall( dtype T | sized(T) | { void ^?{}( T *); }, ttype Params | { void adelete( Params ); } )82 forall( dtype T | sized(T) | { void ^?{}( T & ); }, ttype Params | { void adelete( Params ); } ) 83 83 void adelete( size_t dim, T arr[], Params rest ) { 84 84 if ( arr ) { // ignore null 85 85 for ( int i = dim - 1; i >= 0; i -= 1 ) { // reverse allocation order, must be unsigned 86 ^( &arr[i]){}; // run destructor86 ^(arr[i]){}; // run destructor 87 87 } // for 88 88 free( arr );
Note:
See TracChangeset
for help on using the changeset viewer.