Changeset d4264e8


Ignore:
Timestamp:
Apr 19, 2024, 11:30:46 AM (3 weeks ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
02c80cdc
Parents:
60c5b6d
Message:

formatting, add CFA versions of resize, realloc, and reallocarray

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.hfa

    r60c5b6d rd4264e8  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Apr 15 22:11:51 2024
    13 // Update Count     : 817
     12// Last Modified On : Fri Apr 19 09:47:55 2024
     13// Update Count     : 826
    1414//
    1515
     
    4747
    4848static 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
    5050
    5151        T * malloc( void ) {
     
    6464        } // calloc
    6565
    66         T * resize( T * ptr, size_t size ) {                            // CFA resize
    67                 if ( _Alignof(T) <= libAlign() ) return (T *)resize( (void *)ptr, size ); // CFA resize
     66        T * resize( T * ptr, size_t size ) {
     67                if ( _Alignof(T) <= libAlign() ) return (T *)resize( (void *)ptr, size ); // C resize
    6868                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
    6973        } // resize
    7074
     
    7478        } // realloc
    7579
     80        T * realloc( T * ptr, size_t alignment, size_t size ) {
     81                return (T *)realloc( (void *)ptr, alignment, size ); // CFA realloc
     82        } // realloc
     83
    7684        T * reallocarray( T * ptr, size_t dim ) {                       // CFA reallocarray
    7785                if ( _Alignof(T) <= libAlign() ) return (T *)reallocarray( (void *)ptr, dim, sizeof(T) ); // C reallocarray
     
    7987        } // realloc
    8088
     89        T * reallocarray( T * ptr, size_t alignment, size_t dim ) {
     90                return (T *)reallocarray( (void *)ptr, alignment, dim ); // CFA reallocarray
     91        } // realloc
     92
    8193        T * memalign( size_t align ) {
    8294                return (T *)memalign( align, sizeof(T) );               // C memalign
     
    8799        } // amemalign
    88100
    89         T * cmemalign( size_t align, size_t dim  ) {
     101        T * cmemalign( size_t align, size_t dim ) {
    90102                return (T *)cmemalign( align, dim, sizeof(T) ); // CFA cmemalign
    91103        } // cmemalign
     
    164176static inline T_resize ?`resize( void * a )     { return (T_resize){a}; }
    165177
    166 extern "C" ssize_t write(int fd, const void *buf, size_t count);
    167178static inline forall( T & | sized(T) ) {
    168         S_fill(T) ?`fill ( T t ) {
     179        S_fill(T) ?`fill( T t ) {
    169180                S_fill(T) ret = { 't' };
    170181                size_t size = sizeof(T);
     
    175186                return ret;
    176187        }
    177         S_fill(T) ?`fill ( zero_t ) = void; // FIX ME: remove this once ticket 214 is resolved
    178         S_fill(T) ?`fill ( T * a ) { return (S_fill(T)){ 'T', '0', 0, a }; } // FIX ME: remove this once ticket 214 is resolved
    179         S_fill(T) ?`fill ( char c ) { return (S_fill(T)){ 'c', c };     }
    180         S_fill(T) ?`fill ( T a[], size_t nmemb ) { return (S_fill(T)){ 'a', '0', nmemb * sizeof(T), a }; }
     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 }; }
    181192
    182193        S_realloc(T) ?`realloc ( T * a ) { return (S_realloc(T)){a}; }
     
    215226        } // alloc_internal$
    216227
    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, TT rest ) {
     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 ) {
    219230                return alloc_internal$( Resize, (T*)0p, Align, Dim, Fill, rest);
    220231                }
    221232
    222                 T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, TT rest ) {
     233                T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, List rest ) {
    223234                return alloc_internal$( (void*)0p, Realloc, Align, Dim, Fill, rest);
    224235                }
    225236
    226                 T * alloc_internal$( void * Resize, T * Realloc, size_t, size_t Dim, S_fill(T) Fill, T_align Align, TT rest ) {
     237                T * alloc_internal$( void * Resize, T * Realloc, size_t, size_t Dim, S_fill(T) Fill, T_align Align, List rest ) {
    227238                return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest);
    228239                }
    229240
    230                 T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T), S_fill(T) Fill, TT rest ) {
     241                T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T), S_fill(T) Fill, List rest ) {
    231242                return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest );
    232243                }
    233244
    234             T * alloc( TT all ) {
     245            T * alloc( List all ) {
    235246                return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (size_t)1, (S_fill(T)){'0'}, all );
    236247            }
    237248
    238             T * alloc( size_t dim, TT all ) {
     249            T * alloc( size_t dim, List all ) {
    239250                return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), dim, (S_fill(T)){'0'}, all );
    240251            }
    241         } // distribution TT
     252        } // distribution List
    242253} // distribution T
    243254
     
    263274
    264275// CFA deallocation for multiple objects
    265 static inline forall( T & )                                                     // FIX ME, problems with 0p in list
     276static inline forall( T & )
    266277void free( T * ptr ) {
    267278        free( (void *)ptr );                                                            // C free
    268279} // free
    269 static inline forall( T &, TT ... | { void free( TT ); } )
    270 void free( T * ptr, TT rest ) {
     280static inline forall( T &, List ... | { void free( List ); } )
     281void free( T * ptr, List rest ) {
    271282        free( ptr );
    272283        free( rest );
     
    274285
    275286// CFA allocation/deallocation and constructor/destructor, non-array types
    276 static inline forall( T & | sized(T), TT ... | { void ?{}( T &, TT ); } )
    277 T * new( TT p ) {
     287static inline forall( T & | sized(T), Parms ... | { void ?{}( T &, Parms ); } )
     288T * new( Parms p ) {
    278289        return &(*(T *)malloc()){ p };                                          // run constructor
    279290} // new
     
    287298        free( ptr );                                                                            // always call free
    288299} // delete
    289 static inline forall( T &, TT ... | { void ^?{}( T & ); void delete( TT ); } )
    290 void delete( T * ptr, TT rest ) {
     300static inline forall( T &, List ... | { void ^?{}( T & ); void delete( List ); } )
     301void delete( T * ptr, List rest ) {
    291302        delete( ptr );
    292303        delete( rest );
     
    294305
    295306// CFA allocation/deallocation and constructor/destructor, array types
    296 forall( T & | sized(T), TT ... | { void ?{}( T &, TT ); } ) T * anew( size_t dim, TT p );
     307forall( T & | sized(T), Parms ... | { void ?{}( T &, Parms ); } ) T * anew( size_t dim, Parms p );
    297308forall( 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 );
     309forall( T & | sized(T) | { void ^?{}( T & ); }, List ... | { void adelete( List ); } ) void adelete( T arr[], List rest );
     310
    299311//---------------------------------------
    300312
Note: See TracChangeset for help on using the changeset viewer.