- Timestamp:
- Apr 19, 2024, 11:30:46 AM (12 months ago)
- Branches:
- master
- Children:
- 02c80cdc
- Parents:
- 60c5b6d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified libcfa/src/stdlib.hfa ¶
r60c5b6d rd4264e8 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Apr 15 22:11:51202413 // Update Count : 8 1712 // Last Modified On : Fri Apr 19 09:47:55 2024 13 // Update Count : 826 14 14 // 15 15 … … 47 47 48 48 static inline forall( T & | sized(T) ) { 49 // CFA safe equivalents, i.e., implicit size specification 49 // CFA safe equivalents, i.e., implicit size specification, eliminate return-type cast 50 50 51 51 T * malloc( void ) { … … 64 64 } // calloc 65 65 66 T * resize( T * ptr, size_t size ) { // CFA resize67 if ( _Alignof(T) <= libAlign() ) return (T *)resize( (void *)ptr, size ); // C FAresize66 T * resize( T * ptr, size_t size ) { 67 if ( _Alignof(T) <= libAlign() ) return (T *)resize( (void *)ptr, size ); // C resize 68 68 else return (T *)resize( (void *)ptr, _Alignof(T), size ); // CFA resize 69 } // resize 70 71 T * resize( T * ptr, size_t alignment, size_t size ) { 72 return (T *)resize( (void *)ptr, alignment, size ); // CFA resize 69 73 } // resize 70 74 … … 74 78 } // realloc 75 79 80 T * realloc( T * ptr, size_t alignment, size_t size ) { 81 return (T *)realloc( (void *)ptr, alignment, size ); // CFA realloc 82 } // realloc 83 76 84 T * reallocarray( T * ptr, size_t dim ) { // CFA reallocarray 77 85 if ( _Alignof(T) <= libAlign() ) return (T *)reallocarray( (void *)ptr, dim, sizeof(T) ); // C reallocarray … … 79 87 } // realloc 80 88 89 T * reallocarray( T * ptr, size_t alignment, size_t dim ) { 90 return (T *)reallocarray( (void *)ptr, alignment, dim ); // CFA reallocarray 91 } // realloc 92 81 93 T * memalign( size_t align ) { 82 94 return (T *)memalign( align, sizeof(T) ); // C memalign … … 87 99 } // amemalign 88 100 89 T * cmemalign( size_t align, size_t dim 101 T * cmemalign( size_t align, size_t dim ) { 90 102 return (T *)cmemalign( align, dim, sizeof(T) ); // CFA cmemalign 91 103 } // cmemalign … … 164 176 static inline T_resize ?`resize( void * a ) { return (T_resize){a}; } 165 177 166 extern "C" ssize_t write(int fd, const void *buf, size_t count);167 178 static inline forall( T & | sized(T) ) { 168 S_fill(T) ?`fill 179 S_fill(T) ?`fill( T t ) { 169 180 S_fill(T) ret = { 't' }; 170 181 size_t size = sizeof(T); … … 175 186 return ret; 176 187 } 177 S_fill(T) ?`fill 178 S_fill(T) ?`fill 179 S_fill(T) ?`fill 180 S_fill(T) ?`fill 188 S_fill(T) ?`fill( zero_t ) = void; // FIX ME: remove this once ticket 214 is resolved 189 S_fill(T) ?`fill( T * a ) { return (S_fill(T)){ 'T', '0', 0, a }; } // FIX ME: remove this once ticket 214 is resolved 190 S_fill(T) ?`fill( char c ) { return (S_fill(T)){ 'c', c }; } 191 S_fill(T) ?`fill( T a[], size_t nmemb ) { return (S_fill(T)){ 'a', '0', nmemb * sizeof(T), a }; } 181 192 182 193 S_realloc(T) ?`realloc ( T * a ) { return (S_realloc(T)){a}; } … … 215 226 } // alloc_internal$ 216 227 217 forall( TT ... | { T * alloc_internal$( void *, T *, size_t, size_t, S_fill(T), TT); } ) {218 T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, T_resize Resize, TTrest ) {228 forall( List ... | { T * alloc_internal$( void *, T *, size_t, size_t, S_fill(T), List ); } ) { 229 T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, T_resize Resize, List rest ) { 219 230 return alloc_internal$( Resize, (T*)0p, Align, Dim, Fill, rest); 220 231 } 221 232 222 T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, TTrest ) {233 T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, List rest ) { 223 234 return alloc_internal$( (void*)0p, Realloc, Align, Dim, Fill, rest); 224 235 } 225 236 226 T * alloc_internal$( void * Resize, T * Realloc, size_t, size_t Dim, S_fill(T) Fill, T_align Align, TTrest ) {237 T * alloc_internal$( void * Resize, T * Realloc, size_t, size_t Dim, S_fill(T) Fill, T_align Align, List rest ) { 227 238 return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest); 228 239 } 229 240 230 T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T), S_fill(T) Fill, TTrest ) {241 T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T), S_fill(T) Fill, List rest ) { 231 242 return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest ); 232 243 } 233 244 234 T * alloc( TTall ) {245 T * alloc( List all ) { 235 246 return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (size_t)1, (S_fill(T)){'0'}, all ); 236 247 } 237 248 238 T * alloc( size_t dim, TTall ) {249 T * alloc( size_t dim, List all ) { 239 250 return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), dim, (S_fill(T)){'0'}, all ); 240 251 } 241 } // distribution TT252 } // distribution List 242 253 } // distribution T 243 254 … … 263 274 264 275 // CFA deallocation for multiple objects 265 static inline forall( T & ) // FIX ME, problems with 0p in list276 static inline forall( T & ) 266 277 void free( T * ptr ) { 267 278 free( (void *)ptr ); // C free 268 279 } // free 269 static inline forall( T &, TT ... | { void free( TT); } )270 void free( T * ptr, TTrest ) {280 static inline forall( T &, List ... | { void free( List ); } ) 281 void free( T * ptr, List rest ) { 271 282 free( ptr ); 272 283 free( rest ); … … 274 285 275 286 // CFA allocation/deallocation and constructor/destructor, non-array types 276 static inline forall( T & | sized(T), TT ... | { void ?{}( T &, TT); } )277 T * new( TTp ) {287 static inline forall( T & | sized(T), Parms ... | { void ?{}( T &, Parms ); } ) 288 T * new( Parms p ) { 278 289 return &(*(T *)malloc()){ p }; // run constructor 279 290 } // new … … 287 298 free( ptr ); // always call free 288 299 } // delete 289 static inline forall( T &, TT ... | { void ^?{}( T & ); void delete( TT); } )290 void delete( T * ptr, TTrest ) {300 static inline forall( T &, List ... | { void ^?{}( T & ); void delete( List ); } ) 301 void delete( T * ptr, List rest ) { 291 302 delete( ptr ); 292 303 delete( rest ); … … 294 305 295 306 // CFA allocation/deallocation and constructor/destructor, array types 296 forall( T & | sized(T), TT ... | { void ?{}( T &, TT ); } ) T * anew( size_t dim, TTp );307 forall( T & | sized(T), Parms ... | { void ?{}( T &, Parms ); } ) T * anew( size_t dim, Parms p ); 297 308 forall( T & | sized(T) | { void ^?{}( T & ); } ) void adelete( T arr[] ); 298 forall( T & | sized(T) | { void ^?{}( T & ); }, TT ... | { void adelete( TT ); } ) void adelete( T arr[], TT rest ); 309 forall( T & | sized(T) | { void ^?{}( T & ); }, List ... | { void adelete( List ); } ) void adelete( T arr[], List rest ); 310 299 311 //--------------------------------------- 300 312
Note: See TracChangeset
for help on using the changeset viewer.