source: libcfa/src/common.hfa @ 6d5790d

Last change on this file since 6d5790d was 76acb60, checked in by Peter A. Buhr <pabuhr@…>, 11 months ago

remove static from Exception macro

  • Property mode set to 100644
File size: 4.1 KB
Line 
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//
7// common.hfa --
8//
9// Author           : Peter A. Buhr
10// Created On       : Wed Jul 11 17:54:36 2018
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Sat Aug  5 13:05:27 2023
13// Update Count     : 32
14//
15
16#pragma once
17
18// TEMPORARY
19#define Exception( name ) exception name{}; vtable( name ) name ## _vt
20#define Throw( name ) throw (name){ &name ## _vt }
21
22//---------------------------------------
23
24[ int, int ] div( int num, int denom );
25[ long int, long int ] div( long int num, long int denom );
26[ long long int, long long int ] div( long long int num, long long int denom );
27forall( T | { T ?/?( T, T ); T ?%?( T, T ); } )
28[ T, T ] div( T num, T demon );
29
30//---------------------------------------
31
32extern "C" {
33        int abs( int );                                                                         // stdlib.h
34        long int labs( long int );
35        long long int llabs( long long int );
36} // extern "C"
37static inline __attribute__((always_inline)) {
38        unsigned char abs( signed char v ) { return (int)abs( (int)v ); }
39        // use default C routine for int
40        unsigned long int abs( long int v ) { return labs( v ); }
41        unsigned long long int abs( long long int v ) { return llabs( v ); }
42} // distribution
43
44extern "C" {
45        double fabs( double );                                                          // math.h
46        float fabsf( float );
47        long double fabsl( long double );
48} // extern "C"
49static inline __attribute__((always_inline)) {
50        float abs( float x ) { return fabsf( x ); }
51        double abs( double x ) { return fabs( x ); }
52        long double abs( long double x ) { return fabsl( x ); }
53} // distribution
54
55extern "C" {
56        double cabs( double _Complex );                                         // complex.h
57        float cabsf( float _Complex );
58        long double cabsl( long double _Complex );
59} // extern "C"
60static inline __attribute__((always_inline)) {
61        float abs( float _Complex x ) { return cabsf( x ); }
62        double abs( double _Complex x ) { return cabs( x ); }
63        long double abs( long double _Complex x ) { return cabsl( x ); }
64} // distribution
65
66forall( T | { void ?{}( T &, zero_t ); int ?<?( T, T ); T -?( T ); } )
67T abs( T );
68
69//---------------------------------------
70
71static inline __attribute__((always_inline)) {
72        forall( T | { int ?<?( T, T ); } )
73        T min( T v1, T v2 ) { return v1 < v2 ? v1 : v2; }
74
75        forall( T, Ts... | { T min( T, T ); T min( T, Ts ); } )
76        T min( T v1, T v2, Ts vs ) { return min( min( v1, v2 ), vs ); }
77
78        forall( T | { int ?>?( T, T ); } )
79        T max( T v1, T v2 ) { return v1 > v2 ? v1 : v2; }
80
81        forall( T, Ts... | { T max( T, T ); T max( T, Ts ); } )
82        T max( T v1, T v2, Ts vs ) { return max( max( v1, v2 ), vs ); }
83
84        forall( T | { T min( T, T ); T max( T, T ); } )
85        T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); }
86
87        forall( T )
88        void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; }
89
90        // Specializations
91        char min( char v1, char v2 ) { return v1 < v2 ? v1 : v2; }
92        int min( int v1, int v2 ) { return v1 < v2 ? v1 : v2; }
93        unsigned int min( unsigned int v1, unsigned int v2 ) { return v1 < v2 ? v1 : v2; }
94        long int min( long int v1, long int v2 ) { return v1 < v2 ? v1 : v2; }
95        unsigned long int min( unsigned long int v1, unsigned long int v2 ) { return v1 < v2 ? v1 : v2; }
96        long long int min( long long int v1, long long int v2 ) { return v1 < v2 ? v1 : v2; }
97        unsigned long long int min( unsigned long long int v1, unsigned long long int v2 ) { return v1 < v2 ? v1 : v2; }
98
99        char max( char v1, char v2 ) { return v1 > v2 ? v1 : v2; }
100        int max( int v1, int v2 ) { return v1 > v2 ? v1 : v2; }
101        unsigned int max( unsigned int v1, unsigned int v2 ) { return v1 > v2 ? v1 : v2; }
102        long int max( long int v1, long int v2 ) { return v1 > v2 ? v1 : v2; }
103        unsigned long int max( unsigned long int v1, unsigned long int v2 ) { return v1 > v2 ? v1 : v2; }
104        long long int max( long long int v1, long long int v2 ) { return v1 > v2 ? v1 : v2; }
105        unsigned long long int max( unsigned long long int v1, unsigned long long int v2 ) { return v1 > v2 ? v1 : v2; }
106} // distribution
107
108// Local Variables: //
109// mode: c //
110// tab-width: 4 //
111// End: //
Note: See TracBrowser for help on using the repository browser.