Changeset d3b8752


Ignore:
Timestamp:
Jul 20, 2023, 10:57:09 AM (13 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
a09552d
Parents:
5a7789f
Message:

Added min/max for 3+ argument cases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/common.hfa

    r5a7789f rd3b8752  
    6666
    6767static inline __attribute__((always_inline)) {
    68         char min( char v1, char v2 ) { return v1 < v2 ? v1 : v2; } // optimization
     68        forall( T | { int ?<?( T, T ); } )
     69        T min( T v1, T v2 ) { return v1 < v2 ? v1 : v2; }
     70
     71        forall( T, Ts... | { T min( T, T ); T min( T, Ts ); } )
     72        T min( T v1, T v2, Ts vs ) { return min( min( v1, v2 ), vs ); }
     73
     74        forall( T | { int ?>?( T, T ); } )
     75        T max( T v1, T v2 ) { return v1 > v2 ? v1 : v2; }
     76
     77        forall( T, Ts... | { T max( T, T ); T max( T, Ts ); } )
     78        T max( T v1, T v2, Ts vs ) { return max( max( v1, v2 ), vs ); }
     79
     80        forall( T | { T min( T, T ); T max( T, T ); } )
     81        T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); }
     82
     83        forall( T )
     84        void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; }
     85
     86        // Specializations
     87        char min( char v1, char v2 ) { return v1 < v2 ? v1 : v2; }
    6988        int min( int v1, int v2 ) { return v1 < v2 ? v1 : v2; }
    7089        unsigned int min( unsigned int v1, unsigned int v2 ) { return v1 < v2 ? v1 : v2; }
     
    7392        long long int min( long long int v1, long long int v2 ) { return v1 < v2 ? v1 : v2; }
    7493        unsigned long long int min( unsigned long long int v1, unsigned long long int v2 ) { return v1 < v2 ? v1 : v2; }
    75         forall( T | { int ?<?( T, T ); } )                                      // generic
    76         T min( T v1, T v2 ) { return v1 < v2 ? v1 : v2; }
    7794
    78         char max( char v1, char v2 ) { return v1 > v2 ? v1 : v2; } // optimization
     95        char max( char v1, char v2 ) { return v1 > v2 ? v1 : v2; }
    7996        int max( int v1, int v2 ) { return v1 > v2 ? v1 : v2; }
    8097        unsigned int max( unsigned int v1, unsigned int v2 ) { return v1 > v2 ? v1 : v2; }
     
    83100        long long int max( long long int v1, long long int v2 ) { return v1 > v2 ? v1 : v2; }
    84101        unsigned long long int max( unsigned long long int v1, unsigned long long int v2 ) { return v1 > v2 ? v1 : v2; }
    85         forall( T | { int ?>?( T, T ); } )                                      // generic
    86         T max( T v1, T v2 ) { return v1 > v2 ? v1 : v2; }
    87 
    88         forall( T | { T min( T, T ); T max( T, T ); } )
    89         T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); }
    90 
    91         forall( T )
    92         void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; }
    93102} // distribution
    94103
Note: See TracChangeset for help on using the changeset viewer.