Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.hfa

    r0fe07be rd4264e8  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Apr 22 23:23:58 2024
    13 // Update Count     : 958
     12// Last Modified On : Fri Apr 19 09:47:55 2024
     13// Update Count     : 826
    1414//
    1515
     
    121121
    122122/*
    123         FIX ME : fix alloc interface after Ticker Number 214 is resolved, define and add union to S_fill. Then, modify
    124         postfix-fill functions to support T * with nmemb, char, and T object of any size. Finally, change alloc_internal.
     123        FIX ME : fix alloc interface after Ticker Number 214 is resolved, define and add union to S_fill. Then, modify postfix-fill functions to support T * with nmemb, char, and T object of any size. Finally, change alloc_internal.
    125124        Or, just follow the instructions below for that.
    126125
     
    166165*/
    167166
    168 #pragma GCC diagnostic push
    169 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
    170 #pragma GCC diagnostic ignored "-Wuninitialized"
    171 
    172 struct T_align { size_t align; };
    173 struct T_resize { void * addr; };
    174 struct T_realloc { void * addr; };
    175 forall( T & ) struct T_fill {
    176         // 'N' => no fill, 'c' => fill with character c, 'a' => fill first N array elements from another array,
    177         // 'A' => fill all array elements from another array, 'T' => fill using a T value.
    178         char tag;
    179         size_t nelem;   // number of elements copied from "at" (used with tag 'a')
    180 //      union {
    181                 char c;
    182                 T * at;
    183                 char t[64]; // T t;
    184 //      };
    185 };
    186 
    187 #pragma GCC diagnostic pop
    188 
    189 static inline {
    190         T_align ?`align( size_t a ) { return (T_align){ a }; }
    191         T_resize ?`resize( void * a ) { return (T_resize){ a }; }
    192         T_realloc ?`realloc( void * a ) { return (T_realloc){ a }; }
     167typedef struct S_align { inline size_t;  } T_align;
     168typedef struct S_resize { inline void *;  }     T_resize;
     169
     170forall( T & ) {
     171        struct S_fill { char tag; char c; size_t size; T * at; char t[50]; };
     172        struct S_realloc { inline T *; };
    193173}
    194174
     175static inline T_align ?`align( size_t a ) { return (T_align){a}; }
     176static inline T_resize ?`resize( void * a )     { return (T_resize){a}; }
     177
    195178static inline forall( T & | sized(T) ) {
    196         T_fill(T) ?`fill( char c ) { return (T_fill(T)){ 'c', 0, c }; }
    197         T_fill(T) ?`fill( T t ) {
    198                 T_fill(T) ret = { 'T' };
     179        S_fill(T) ?`fill( T t ) {
     180                S_fill(T) ret = { 't' };
    199181                size_t size = sizeof(T);
    200182                if ( size > sizeof(ret.t) ) {
     
    204186                return ret;
    205187        }
    206         T_fill(T) ?`fill( T a[] ) { return (T_fill(T)){ 'A', 0, '\0', a }; } // FIX ME: remove this once ticket 214 is resolved
    207         T_fill(T) ?`fill( T a[], size_t nelem ) { return (T_fill(T)){ 'a', nelem * sizeof(T), '\0', a }; }
    208 
    209         // private interface
    210         T * alloc_internal$( size_t Dim, T_resize Resize, T_realloc Realloc, size_t Align, T_fill(T) Fill ) {
    211                 T * ptr;
    212                 size_t tsize = sizeof(T);
     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 }; }
     192
     193        S_realloc(T) ?`realloc ( T * a ) { return (S_realloc(T)){a}; }
     194
     195        T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill ) {
     196                T * ptr = NULL;
     197                size_t size = sizeof(T);
    213198                size_t copy_end = 0;
    214199
    215                 if ( Resize.addr ) {
    216                         ptr = (T *)(void *)resize( Resize.addr, Align, Dim * tsize );
    217                 } else if ( Realloc.addr ) {
    218                         if ( Fill.tag != 'N' ) copy_end = min(malloc_size( Realloc.addr ), Dim * tsize );
    219                         ptr = (T *)(void *)realloc( Realloc.addr, Align, Dim * tsize );
     200                if ( Resize ) {
     201                        ptr = (T*)(void *)resize( (void *)Resize, Align, Dim * size );
     202                } else if ( Realloc ) {
     203                        if ( Fill.tag != '0' ) copy_end = min(malloc_size( Realloc ), Dim * size );
     204                        ptr = (T *)(void *)realloc( (void *)Realloc, Align, Dim * size );
    220205                } else {
    221                         ptr = (T *)(void *)memalign( Align, Dim * tsize );
    222                 } // if
     206                        ptr = (T *)(void *) memalign( Align, Dim * size );
     207                }
    223208
    224209                if ( Fill.tag == 'c' ) {
    225                         memset( (char *)ptr + copy_end, (int)Fill.c, Dim * tsize - copy_end );
     210                        memset( (char *)ptr + copy_end, (int)Fill.c, Dim * size - copy_end );
     211                } else if ( Fill.tag == 't' ) {
     212                        for ( i; copy_end ~ Dim * size ~ size ) {
     213                                #pragma GCC diagnostic push
     214                                #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
     215                                assert( size <= sizeof(Fill.t) );
     216                                memcpy( (char *)ptr + i, &Fill.t, size );
     217                                #pragma GCC diagnostic pop
     218                        }
     219                } else if ( Fill.tag == 'a' ) {
     220                        memcpy( (char *)ptr + copy_end, Fill.at, min(Dim * size - copy_end, Fill.size) );
    226221                } else if ( Fill.tag == 'T' ) {
    227                         for ( i; copy_end ~ Dim * tsize ~ tsize ) {
    228                                 assert( tsize <= sizeof(Fill.t) );
    229                                 memcpy( (char *)ptr + i, &Fill.t, tsize );
    230                         } // for
    231                 } else if ( Fill.tag == 'a' ) {
    232                         memcpy( (char *)ptr + copy_end, Fill.at, min( Dim * tsize - copy_end, Fill.nelem ) );
    233                 } else if ( Fill.tag == 'A' ) {
    234                         memcpy( (char *)ptr + copy_end, Fill.at, Dim * tsize );
    235                 } // if
     222                        memcpy( (char *)ptr + copy_end, Fill.at, Dim * size );
     223                }
     224
    236225                return ptr;
    237226        } // alloc_internal$
    238227
    239         // Dim is a fixed (optional first) parameter, and hence is not set using a postfix function. A dummy parameter is
    240         // being overwritten by the postfix argument in the ttype.
    241         forall( List ... | { T * alloc_internal$( size_t Dim, T_resize Resize, T_realloc Realloc, size_t Align, T_fill(T) Fill, List ); } ) {
    242                 // middle interface
    243                 T * alloc_internal$( size_t Dim, T_resize dummy, T_realloc Realloc, size_t Align, T_fill(T) Fill, T_resize Resize, List rest ) {
    244                 return alloc_internal$( Dim, Resize, (T_realloc){0p}, Align, Fill, rest );
    245                 }
    246                 T * alloc_internal$( size_t Dim, T_resize Resize, T_realloc dummy, size_t Align, T_fill(T) Fill, T_realloc Realloc, List rest ) {
    247                 return alloc_internal$( Dim, (T_resize){0p}, Realloc, Align, Fill, rest );
    248                 }
    249                 T * alloc_internal$( size_t Dim, T_resize Resize, T_realloc Realloc, size_t dummy, T_fill(T) Fill, T_align Align, List rest ) {
    250                 return alloc_internal$( Dim, Resize, Realloc, Align.align, Fill, rest );
    251                 }
    252                 T * alloc_internal$( size_t Dim, T_resize Resize, T_realloc Realloc, size_t Align, T_fill(T) dummy, T_fill(T) Fill, List rest ) {
    253                 return alloc_internal$( Dim, Resize, Realloc, Align, Fill, rest );
    254                 }
    255                 // public interface
    256             T * alloc( List rest ) {
    257                 return alloc_internal$( (size_t)1, (T_resize){0p}, (T_realloc){0p}, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (T_fill(T)){'N'}, 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 ) {
     230                return alloc_internal$( Resize, (T*)0p, Align, Dim, Fill, rest);
     231                }
     232
     233                T * alloc_internal$( void *, T *, size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, List rest ) {
     234                return alloc_internal$( (void*)0p, Realloc, Align, Dim, Fill, rest);
     235                }
     236
     237                T * alloc_internal$( void * Resize, T * Realloc, size_t, size_t Dim, S_fill(T) Fill, T_align Align, List rest ) {
     238                return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest);
     239                }
     240
     241                T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T), S_fill(T) Fill, List rest ) {
     242                return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest );
     243                }
     244
     245            T * alloc( List all ) {
     246                return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (size_t)1, (S_fill(T)){'0'}, all );
    258247            }
    259             T * alloc( size_t Dim, List rest ) {
    260                 return alloc_internal$( Dim, (T_resize){0p}, (T_realloc){0p}, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (T_fill(T)){'N'}, rest );
     248
     249            T * alloc( size_t dim, List all ) {
     250                return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), dim, (S_fill(T)){'0'}, all );
    261251            }
    262252        } // distribution List
Note: See TracChangeset for help on using the changeset viewer.