source: src/libcfa/stdlib@ ecae5860

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum with_gc
Last change on this file since ecae5860 was ecae5860, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

more push/pop updates

  • Property mode set to 100644
File size: 11.9 KB
RevLine 
[bd85400]1//
2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[bb82c03]7// stdlib --
[bd85400]8//
9// Author : Peter A. Buhr
10// Created On : Thu Jan 28 17:12:35 2016
11// Last Modified By : Peter A. Buhr
[ecae5860]12// Last Modified On : Fri Jun 1 19:52:52 2018
13// Update Count : 302
[bd85400]14//
15
[53a6c2a]16#pragma once
[17e5e2b]17
[e672372]18#include <stdlib.h> // strto*, *abs
19
[bd85400]20//---------------------------------------
21
[45161b4d]22#ifndef EXIT_FAILURE
23#define EXIT_FAILURE 1 // failing exit status
24#define EXIT_SUCCESS 0 // successful exit status
25#endif // ! EXIT_FAILURE
26
27//---------------------------------------
28
[74b19fb]29// C dynamic allocation
30static inline forall( dtype T | sized(T) ) {
31 T * malloc( void ) {
32 // printf( "* malloc\n" );
33 return (T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
34 } // malloc
35
36 // T & malloc( void ) {
37 // int & p = *(T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
38 // printf( "& malloc %p\n", &p );
39 // return p;
40 // // return (T &)*(T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
41 // } // malloc
42
43 T * calloc( size_t dim ) {
44 //printf( "X2\n" );
45 return (T *)(void *)calloc( dim, sizeof(T) ); // C calloc
46 } // calloc
47
48 T * realloc( T * ptr, size_t size ) {
49 //printf( "X3\n" );
50 return (T *)(void *)realloc( (void *)ptr, size );
51 } // realloc
52
53 extern "C" { void * memalign( size_t align, size_t size ); } // use default C routine for void *
54 T * memalign( size_t align ) {
55 //printf( "X4\n" );
56 return (T *)memalign( align, sizeof(T) );
57 } // memalign
58
59 extern "C" { void * aligned_alloc( size_t align, size_t size ); } // use default C routine for void *
60 T * aligned_alloc( size_t align ) {
61 //printf( "X5\n" );
62 return (T *)aligned_alloc( align, sizeof(T) );
63 } // aligned_alloc
64
65 int posix_memalign( T ** ptr, size_t align ) {
66 //printf( "X6\n" );
67 return posix_memalign( (void **)ptr, align, sizeof(T) ); // C posix_memalign
68 } // posix_memalign
[ecae5860]69} // distribution
[74b19fb]70
[ecae5860]71// Cforall dynamic allocation
72static inline forall( dtype T | sized(T) ) {
[74b19fb]73 extern "C" { void * memset( void * dest, int c, size_t size ); } // use default C routine for void *
74
75 T * alloc( void ) {
76 //printf( "X7\n" );
77 return (T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
78 } // alloc
79
80 T * alloc( char fill ) {
81 //printf( "X8\n" );
82 T * ptr = (T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
83 return (T *)memset( ptr, (int)fill, sizeof(T) ); // initial with fill value
84 } // alloc
85
86 T * alloc( size_t dim ) {
87 //printf( "X9\n" );
88 return (T *)(void *)malloc( dim * (size_t)sizeof(T) ); // C malloc
89 } // alloc
90
91 T * alloc( size_t dim, char fill ) {
92 //printf( "X10\n" );
93 T * ptr = (T *)(void *)malloc( dim * (size_t)sizeof(T) ); // C malloc
94 return (T *)memset( ptr, (int)fill, dim * sizeof(T) ); // initial with fill value
95 } // alloc
96
97 T * alloc( T ptr[], size_t dim ) {
98 //printf( "X11\n" );
99 return (T *)(void *)realloc( (void *)ptr, dim * (size_t)sizeof(T) ); // C realloc
100 } // alloc
101} // distribution
[6065b3aa]102
[f3fc631f]103
[6065b3aa]104forall( dtype T | sized(T) ) T * alloc( T ptr[], size_t dim, char fill );
105
106static inline forall( dtype T | sized(T) ) T * align_alloc( size_t align ) {
[f3fc631f]107 //printf( "X13\n" );
[6065b3aa]108 return (T *)memalign( align, sizeof(T) );
109} // align_alloc
110static inline forall( dtype T | sized(T) ) T * align_alloc( size_t align, char fill ) {
[f3fc631f]111 //printf( "X14\n" );
[6065b3aa]112 T * ptr = (T *)memalign( align, sizeof(T) );
[cdbfab0]113 return (T *)memset( ptr, (int)fill, sizeof(T) );
[6065b3aa]114} // align_alloc
[f3fc631f]115
[6065b3aa]116static inline forall( dtype T | sized(T) ) T * align_alloc( size_t align, size_t dim ) {
[f3fc631f]117 //printf( "X15\n" );
[6065b3aa]118 return (T *)memalign( align, dim * sizeof(T) );
119} // align_alloc
120static inline forall( dtype T | sized(T) ) T * align_alloc( size_t align, size_t dim, char fill ) {
[f3fc631f]121 //printf( "X16\n" );
[6065b3aa]122 T * ptr = (T *)memalign( align, dim * sizeof(T) );
[cdbfab0]123 return (T *)memset( ptr, (int)fill, dim * sizeof(T) );
[6065b3aa]124} // align_alloc
125
[f3fc631f]126
127// data, non-array types
128static inline forall( dtype T | sized(T) ) T * memset( T * dest, char c ) {
129 //printf( "X17\n" );
[cdbfab0]130 return (T *)memset( dest, c, sizeof(T) );
[f3fc631f]131} // memset
132extern "C" { void * memcpy( void * dest, const void * src, size_t size ); } // use default C routine for void *
133static inline forall( dtype T | sized(T) ) T * memcpy( T * dest, const T * src ) {
134 //printf( "X18\n" );
[cdbfab0]135 return (T *)memcpy( dest, src, sizeof(T) );
[f3fc631f]136} // memcpy
137
138// data, array types
[6065b3aa]139static inline forall( dtype T | sized(T) ) T * memset( T dest[], size_t dim, char c ) {
[f3fc631f]140 //printf( "X19\n" );
[cdbfab0]141 return (T *)(void *)memset( dest, c, dim * sizeof(T) ); // C memset
[6065b3aa]142} // memset
143static inline forall( dtype T | sized(T) ) T * memcpy( T dest[], const T src[], size_t dim ) {
[f3fc631f]144 //printf( "X20\n" );
[cdbfab0]145 return (T *)(void *)memcpy( dest, src, dim * sizeof(T) ); // C memcpy
[6065b3aa]146} // memcpy
[f3fc631f]147
[6065b3aa]148// allocation/deallocation and constructor/destructor, non-array types
[aca65621]149forall( dtype T | sized(T), ttype Params | { void ?{}( T &, Params ); } ) T * new( Params p );
[83a071f9]150forall( dtype T | sized(T) | { void ^?{}( T & ); } ) void delete( T * ptr );
151forall( dtype T, ttype Params | sized(T) | { void ^?{}( T & ); void delete( Params ); } ) void delete( T * ptr, Params rest );
[627f585]152
[6065b3aa]153// allocation/deallocation and constructor/destructor, array types
[aca65621]154forall( dtype T | sized(T), ttype Params | { void ?{}( T &, Params ); } ) T * anew( size_t dim, Params p );
155forall( dtype T | sized(T) | { void ^?{}( T & ); } ) void adelete( size_t dim, T arr[] );
156forall( dtype T | sized(T) | { void ^?{}( T & ); }, ttype Params | { void adelete( Params ); } ) void adelete( size_t dim, T arr[], Params rest );
[6065b3aa]157
[bd85400]158//---------------------------------------
159
[e672372]160static inline int strto( const char * sptr, char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); }
161static inline unsigned int strto( const char * sptr, char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); }
162static inline long int strto( const char * sptr, char ** eptr, int base ) { return strtol( sptr, eptr, base ); }
163static inline unsigned long int strto( const char * sptr, char ** eptr, int base ) { return strtoul( sptr, eptr, base ); }
164static inline long long int strto( const char * sptr, char ** eptr, int base ) { return strtoll( sptr, eptr, base ); }
165static inline unsigned long long int strto( const char * sptr, char ** eptr, int base ) { return strtoull( sptr, eptr, base ); }
166
167static inline float strto( const char * sptr, char ** eptr ) { return strtof( sptr, eptr ); }
168static inline double strto( const char * sptr, char ** eptr ) { return strtod( sptr, eptr ); }
169static inline long double strto( const char * sptr, char ** eptr ) { return strtold( sptr, eptr ); }
170
[bd85400]171float _Complex strto( const char * sptr, char ** eptr );
172double _Complex strto( const char * sptr, char ** eptr );
173long double _Complex strto( const char * sptr, char ** eptr );
174
[e672372]175static inline int ato( const char * sptr ) {return (int)strtol( sptr, 0, 10 ); }
176static inline unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0, 10 ); }
177static inline long int ato( const char * sptr ) { return strtol( sptr, 0, 10 ); }
178static inline unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0, 10 ); }
179static inline long long int ato( const char * sptr ) { return strtoll( sptr, 0, 10 ); }
180static inline unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0, 10 ); }
181
182static inline float ato( const char * sptr ) { return strtof( sptr, 0 ); }
183static inline double ato( const char * sptr ) { return strtod( sptr, 0 ); }
184static inline long double ato( const char * sptr ) { return strtold( sptr, 0 ); }
185
186static inline float _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
187static inline double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
188static inline long double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
189
[bd85400]190//---------------------------------------
191
[9c47a47]192forall( otype E | { int ?<?( E, E ); } )
[93cdd5c]193E * bsearch( E key, const E * vals, size_t dim );
[f3ddc21]194
[9c47a47]195forall( otype E | { int ?<?( E, E ); } )
[93cdd5c]196size_t bsearch( E key, const E * vals, size_t dim );
[bd85400]197
[93cdd5c]198forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } )
199E * bsearch( K key, const E * vals, size_t dim );
200
201forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } )
202size_t bsearch( K key, const E * vals, size_t dim );
203
204
205forall( otype E | { int ?<?( E, E ); } )
206E * bsearchl( E key, const E * vals, size_t dim );
207
208forall( otype E | { int ?<?( E, E ); } )
209size_t bsearchl( E key, const E * vals, size_t dim );
210
211forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } )
212E * bsearchl( K key, const E * vals, size_t dim );
213
214forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } )
215size_t bsearchl( K key, const E * vals, size_t dim );
216
217
218forall( otype E | { int ?<?( E, E ); } )
219E * bsearchu( E key, const E * vals, size_t dim );
220
221forall( otype E | { int ?<?( E, E ); } )
222size_t bsearchu( E key, const E * vals, size_t dim );
223
224forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } )
225E * bsearchu( K key, const E * vals, size_t dim );
226
227forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } )
228size_t bsearchu( K key, const E * vals, size_t dim );
[f3ddc21]229
[9c47a47]230
231forall( otype E | { int ?<?( E, E ); } )
[93cdd5c]232void qsort( E * vals, size_t dim );
[bd85400]233
234//---------------------------------------
235
[5ea26ed]236[ int, int ] div( int num, int denom );
237[ long int, long int ] div( long int num, long int denom );
238[ long long int, long long int ] div( long long int num, long long int denom );
[4040425]239forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
[5ea26ed]240[ T, T ] div( T num, T demon );
[bd85400]241
242//---------------------------------------
243
[e672372]244static inline unsigned char abs( signed char v ) { return abs( (int)v ); }
[6e991d6]245extern "C" { int abs( int ); } // use default C routine for int
[e672372]246static inline unsigned long int abs( long int v ) { return labs( v ); }
247static inline unsigned long long int abs( long long int v ) { return llabs( v ); }
248
249extern "C" {
250double fabs( double );
251float fabsf( float );
252long double fabsl( long double );
253} // extern "C"
254static inline float abs( float x ) { return fabsf( x ); }
255static inline double abs( double x ) { return fabs( x ); }
256static inline long double abs( long double x ) { return fabsl( x ); }
257
258extern "C" {
259double cabs( double _Complex );
260float cabsf( float _Complex );
261long double cabsl( long double _Complex );
262} // extern "C"
263static inline float abs( float _Complex x ) { return cabsf( x ); }
264static inline double abs( double _Complex x ) { return cabs( x ); }
265static inline long double abs( long double _Complex x ) { return cabsl( x ); }
266
[aca65621]267forall( otype T | { void ?{}( T &, zero_t ); int ?<?( T, T ); T -?( T ); } )
[f3ddc21]268T abs( T );
[53ba273]269
270//---------------------------------------
271
[54aba8d]272extern "C" { void srandom( unsigned int seed ); } // override C version
[70e4895d]273char random( void );
[e672372]274char random( char u );
[70e4895d]275char random( char l, char u );
276int random( void );
[e672372]277int random( int u );
278int random( int l, int u );
[70e4895d]279unsigned int random( void );
280unsigned int random( unsigned int u );
281unsigned int random( unsigned int l, unsigned int u );
[54aba8d]282extern "C" { long int random( void ); } // override C version
[e672372]283long int random( long int u );
284long int random( long int l, long int u );
[70e4895d]285unsigned long int random( void );
286unsigned long int random( unsigned long int u );
287unsigned long int random( unsigned long int l, unsigned long int u );
288float random( void );
289double random( void );
290float _Complex random( void );
291double _Complex random( void );
292long double _Complex random( void );
[bd85400]293
294//---------------------------------------
295
[4040425]296forall( otype T | { int ?<?( T, T ); } )
[e672372]297static inline T min( T t1, T t2 ) { return t1 < t2 ? t1 : t2; }
[bd85400]298
[4040425]299forall( otype T | { int ?>?( T, T ); } )
[e672372]300static inline T max( T t1, T t2 ) { return t1 > t2 ? t1 : t2; }
[bd85400]301
[a9f2c13]302forall( otype T | { T min( T, T ); T max( T, T ); } )
[e672372]303static inline T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); }
[a9f2c13]304
[4040425]305forall( otype T )
[e672372]306static inline void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; }
[bd85400]307
308// Local Variables: //
309// mode: c //
310// tab-width: 4 //
311// End: //
Note: See TracBrowser for help on using the repository browser.