// // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo // // The contents of this file are covered under the licence agreement in the // file "LICENCE" distributed with Cforall. // // algorithm.c -- // // Author : Peter A. Buhr // Created On : Thu Jan 28 17:10:29 2016 // Last Modified By : Peter A. Buhr // Last Modified On : Tue May 30 09:07:56 2017 // Update Count : 237 // #include "stdlib" //--------------------------------------- extern "C" { #define _XOPEN_SOURCE 600 // posix_memalign, *rand48 #include // malloc, free, calloc, realloc, memalign, posix_memalign, bsearch #include // memcpy, memset #include // malloc_usable_size #include // fabsf, fabs, fabsl #include // _Complex_I } // extern "C" // resize, non-array types forall( dtype T | sized(T) ) T * realloc( T * ptr, size_t size, char fill ) { // alternative realloc with fill value //printf( "X6\n" ); size_t olen = malloc_usable_size( ptr ); // current allocation char * nptr = (void *)realloc( (void *)ptr, size ); // C realloc size_t nlen = malloc_usable_size( nptr ); // new allocation if ( nlen > olen ) { // larger ? memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage } // return (T *)nptr; } // realloc // allocation/deallocation and constructor/destructor forall( dtype T, ttype Params | sized(T) | { void ?{}( T *, Params ); } ) T * new( Params p ) { return ((T *)malloc()){ p }; } // new forall( dtype T | { void ^?{}( T * ); } ) void delete( T * ptr ) { if ( ptr ) { ^ptr{}; // run destructor free( ptr ); } // if } // delete forall( dtype T, ttype Params | { void ^?{}( T * ); void delete( Params ); } ) void delete( T * ptr, Params rest ) { if ( ptr ) { ^ptr{}; // run destructor free( ptr ); } // if delete( rest ); } // delete //--------------------------------------- int ato( const char * ptr ) { int i; if ( sscanf( ptr, "%d", &i ) == EOF ) {} return i; } // ato unsigned int ato( const char * ptr ) { unsigned int ui; if ( sscanf( ptr, "%u", &ui ) == EOF ) {} return ui; } // ato long int ato( const char * ptr ) { long int li; if ( sscanf( ptr, "%ld", &li ) == EOF ) {} return li; } // ato unsigned long int ato( const char * ptr ) { unsigned long int uli; if ( sscanf( ptr, "%lu", &uli ) == EOF ) {} return uli; } // ato long long int ato( const char * ptr ) { long long int lli; if ( sscanf( ptr, "%lld", &lli ) == EOF ) {} return lli; } // ato unsigned long long int ato( const char * ptr ) { unsigned long long int ulli; if ( sscanf( ptr, "%llu", &ulli ) == EOF ) {} return ulli; } // ato float ato( const char * ptr ) { float f; if ( sscanf( ptr, "%f", &f ) == EOF ) {} return f; } // ato double ato( const char * ptr ) { double d; if ( sscanf( ptr, "%lf", &d ) == EOF ) {} return d; } // ato long double ato( const char * ptr ) { long double ld; if ( sscanf( ptr, "%Lf", &ld ) == EOF ) {} return ld; } // ato float _Complex ato( const char * ptr ) { float re, im; if ( sscanf( ptr, "%g%gi", &re, &im ) == EOF ) {} return re + im * _Complex_I; } // ato double _Complex ato( const char * ptr ) { double re, im; if ( sscanf( ptr, "%lf%lfi", &re, &im ) == EOF ) {} return re + im * _Complex_I; } // ato long double _Complex ato( const char * ptr ) { long double re, im; if ( sscanf( ptr, "%Lf%Lfi", &re, &im ) == EOF ) {} return re + im * _Complex_I; } // ato int strto( const char * sptr, char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); } // strto unsigned int strto( const char * sptr, char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); } // strto long int strto( const char * sptr, char ** eptr, int base ) { return strtol( sptr, eptr, base ); } // strto unsigned long int strto( const char * sptr, char ** eptr, int base ) { return strtoul( sptr, eptr, base ); } // strto long long int strto( const char * sptr, char ** eptr, int base ) { return strtoll( sptr, eptr, base ); } // strto unsigned long long int strto( const char * sptr, char ** eptr, int base ) { return strtoull( sptr, eptr, base ); } // strto float strto( const char * sptr, char ** eptr ) { return strtof( sptr, eptr ); } // strto double strto( const char * sptr, char ** eptr ) { return strtod( sptr, eptr ); } // strto long double strto( const char * sptr, char ** eptr ) { return strtold( sptr, eptr ); } // strto float _Complex strto( const char * sptr, char ** eptr ) { float re, im; re = strtof( sptr, eptr ); if ( sptr == *eptr ) return 0.0; im = strtof( sptr, eptr ); if ( sptr == *eptr ) return 0.0; return re + im * _Complex_I; } // strto double _Complex strto( const char * sptr, char ** eptr ) { double re, im; re = strtod( sptr, eptr ); if ( sptr == *eptr ) return 0.0; im = strtod( sptr, eptr ); if ( sptr == *eptr ) return 0.0; return re + im * _Complex_I; } // strto long double _Complex strto( const char * sptr, char ** eptr ) { long double re, im; re = strtold( sptr, eptr ); if ( sptr == *eptr ) return 0.0; im = strtold( sptr, eptr ); if ( sptr == *eptr ) return 0.0; return re + im * _Complex_I; } // strto //--------------------------------------- forall( otype T | { int ??( T, T ); } ) T max( T t1, T t2 ) { return t1 > t2 ? t1 : t2; } // max forall( otype T | { T min( T, T ); T max( T, T ); } ) T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); } // clamp forall( otype T ) void swap( T * t1, T * t2 ) { T temp = *t1; *t1 = *t2; *t2 = temp; } // swap // Local Variables: // // tab-width: 4 // // End: //