Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.hfa

    rcafb687 rd6b03b7  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct 20 22:57:33 2019
    13 // Update Count     : 390
     12// Last Modified On : Tue Jul 23 14:14:59 2019
     13// Update Count     : 373
    1414//
    1515
     
    2525        void * memset( void * dest, int fill, size_t size ); // string.h
    2626        void * memcpy( void * dest, const void * src, size_t size ); // string.h
    27     void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ); // CFA heap
     27    void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ); // CFA
    2828} // extern "C"
    2929
     
    5252        T * realloc( T * ptr, size_t size ) {
    5353                if ( unlikely( ptr == 0 ) ) return malloc();
    54                 return (T *)(void *)realloc( (void *)ptr, size ); // C realloc
     54                return (T *)(void *)realloc( (void *)ptr, size );
    5555        } // realloc
    5656
    5757        T * memalign( size_t align ) {
    58                 return (T *)memalign( align, sizeof(T) );               // C memalign
     58                return (T *)memalign( align, sizeof(T) );
    5959        } // memalign
    6060
    6161        T * aligned_alloc( size_t align ) {
    62                 return (T *)aligned_alloc( align, sizeof(T) );  // C aligned_alloc
     62                return (T *)aligned_alloc( align, sizeof(T) );
    6363        } // aligned_alloc
    6464
     
    6767        } // posix_memalign
    6868
     69
    6970        // Cforall dynamic allocation
    7071
     
    7374        } // alloc
    7475
     76        T * alloc( char fill ) {
     77                T * ptr;
     78                if ( _Alignof(T) <= libAlign() ) ptr = (T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
     79                else ptr = (T *)memalign( _Alignof(T), sizeof(T) );
     80                return (T *)memset( ptr, (int)fill, sizeof(T) ); // initialize with fill value
     81        } // alloc
     82
    7583        T * alloc( size_t dim ) {
    76                 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)malloc( dim * (size_t)sizeof(T) );
     84                if ( _Alignof(T) <= libAlign() ) return (T *)(void *)malloc( dim * (size_t)sizeof(T) ); // C malloc
    7785                else return (T *)memalign( _Alignof(T), dim * sizeof(T) );
    7886        } // alloc
    7987
    80         T * alloc( T ptr[], size_t dim ) {                                      // realloc
     88        T * alloc( size_t dim, char fill ) {
     89                return (T *)memset( (T *)alloc( dim ), (int)fill, dim * sizeof(T) ); // initialize with fill value
     90        } // alloc
     91
     92        T * alloc( T ptr[], size_t dim ) {
    8193                return realloc( ptr, dim * sizeof(T) );
    8294        } // alloc
    83 
    84         T * alloc_set( char fill ) {
    85                 return (T *)memset( (T *)alloc(), (int)fill, sizeof(T) ); // initialize with fill value
    86         } // alloc
    87 
    88         T * alloc_set( T fill ) {
    89                 return (T *)memcpy( (T *)alloc(), &fill, sizeof(T) ); // initialize with fill value
    90         } // alloc
    91 
    92         T * alloc_set( size_t dim, char fill ) {
    93                 return (T *)memset( (T *)alloc( dim ), (int)fill, dim * sizeof(T) ); // initialize with fill value
    94         } // alloc
    95 
    96         T * alloc_set( size_t dim, T fill ) {
    97                 T * r = (T *)alloc( dim );
    98                 for ( i; dim ) { memcpy( &r[i], &fill, sizeof(T) ); } // initialize with fill value
    99                 return r;
    100         } // alloc
    101 
    102         T * alloc_set( size_t dim, const T fill[] ) {
    103                 return (T *)memcpy( (T *)alloc( dim ), fill, dim * sizeof(T) ); // initialize with fill value
    104         } // alloc
    105 } // distribution
    106 
    107 forall( dtype T | sized(T) ) {
    108         T * alloc_set( T ptr[], size_t dim, char fill );        // realloc array with fill
    109 } // distribution
    110 
    111 static inline forall( dtype T | sized(T) ) {
    112         T * alloc_align( size_t align ) {
     95} // distribution
     96
     97
     98static inline forall( dtype T | sized(T) ) {
     99        T * align_alloc( size_t align ) {
    113100                return (T *)memalign( align, sizeof(T) );
    114         } // alloc_align
    115 
    116         T * alloc_align( size_t align, size_t dim ) {
     101        } // align_alloc
     102
     103        T * align_alloc( size_t align, char fill ) {
     104                T * ptr = (T *)memalign( align, sizeof(T) );
     105                return (T *)memset( ptr, (int)fill, sizeof(T) );
     106        } // align_alloc
     107
     108        T * align_alloc( size_t align, size_t dim ) {
    117109                return (T *)memalign( align, dim * sizeof(T) );
    118         } // alloc_align
    119 
    120         T * alloc_align_set( size_t align, char fill ) {
    121                 return (T *)memset( (T *)alloc_align( align ), (int)fill, sizeof(T) ); // initialize with fill value
    122         } // alloc_align
    123 
    124         T * alloc_align_set( size_t align, T fill ) {
    125                 return (T *)memcpy( (T *)alloc_align( align ), &fill, sizeof(T) ); // initialize with fill value
    126         } // alloc_align
    127 
    128         T * alloc_align_set( size_t align, size_t dim, char fill ) {
    129                 return (T *)memset( (T *)alloc_align( align, dim ), (int)fill, dim * sizeof(T) ); // initialize with fill value
    130         } // alloc_align
    131 
    132         T * alloc_align_set( size_t align, size_t dim, T fill ) {
    133                 T * r = (T *)alloc_align( align, dim );
    134                 for ( i; dim ) { memcpy( &r[i], &fill, sizeof(T) ); } // initialize with fill value
    135                 return r;
    136         } // alloc_align
    137 
    138         T * alloc_align_set( size_t align, size_t dim, const T fill[] ) {
    139                 return (T *)memcpy( (T *)alloc_align( align, dim ), fill, dim * sizeof(T) );
    140         } // alloc_align
    141 } // distribution
    142 
    143 forall( dtype T | sized(T) ) {
    144         T * alloc_align( T ptr[], size_t align );                       // realign
    145         T * alloc_align( T ptr[], size_t align, size_t dim ); // aligned realloc array
    146         T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ); // aligned realloc array with fill
    147 } // distribution
     110        } // align_alloc
     111
     112        T * align_alloc( size_t align, size_t dim, char fill ) {
     113                if ( fill == '\0' ) {
     114                        return (T *)cmemalign( align, dim, sizeof(T) );
     115                } else {
     116                        return (T *)memset( (T *)memalign( align, dim * sizeof(T) ), (int)fill, dim * sizeof(T) );
     117                } // if
     118        } // align_alloc
     119} // distribution
     120
     121forall( dtype T | sized(T) ) T * alloc( T ptr[], size_t dim, char fill );
     122
    148123
    149124static inline forall( dtype T | sized(T) ) {
    150125        // data, non-array types
     126
    151127        T * memset( T * dest, char fill ) {
    152128                return (T *)memset( dest, fill, sizeof(T) );
     
    160136static inline forall( dtype T | sized(T) ) {
    161137        // data, array types
     138
    162139        T * amemset( T dest[], char fill, size_t dim ) {
    163140                return (T *)(void *)memset( dest, fill, dim * sizeof(T) ); // C memset
Note: See TracChangeset for help on using the changeset viewer.