Index: libcfa/src/common.hfa
===================================================================
--- libcfa/src/common.hfa	(revision 8a1d62b6ede909a6414b6d518e069975842244df)
+++ libcfa/src/common.hfa	(revision d3b8752a534585aa168dacfe646fe4a2c9043084)
@@ -66,5 +66,24 @@
 
 static inline __attribute__((always_inline)) {
-	char min( char v1, char v2 ) { return v1 < v2 ? v1 : v2; } // optimization
+	forall( T | { int ?<?( T, T ); } )
+	T min( T v1, T v2 ) { return v1 < v2 ? v1 : v2; }
+
+	forall( T, Ts... | { T min( T, T ); T min( T, Ts ); } )
+	T min( T v1, T v2, Ts vs ) { return min( min( v1, v2 ), vs ); }
+
+	forall( T | { int ?>?( T, T ); } )
+	T max( T v1, T v2 ) { return v1 > v2 ? v1 : v2; }
+
+	forall( T, Ts... | { T max( T, T ); T max( T, Ts ); } )
+	T max( T v1, T v2, Ts vs ) { return max( max( v1, v2 ), vs ); }
+
+	forall( 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 ) ); }
+
+	forall( T )
+	void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; }
+
+	// Specializations
+	char min( char v1, char v2 ) { return v1 < v2 ? v1 : v2; }
 	int min( int v1, int v2 ) { return v1 < v2 ? v1 : v2; }
 	unsigned int min( unsigned int v1, unsigned int v2 ) { return v1 < v2 ? v1 : v2; }
@@ -73,8 +92,6 @@
 	long long int min( long long int v1, long long int v2 ) { return v1 < v2 ? v1 : v2; }
 	unsigned long long int min( unsigned long long int v1, unsigned long long int v2 ) { return v1 < v2 ? v1 : v2; }
-	forall( T | { int ?<?( T, T ); } )					// generic
-	T min( T v1, T v2 ) { return v1 < v2 ? v1 : v2; }
 
-	char max( char v1, char v2 ) { return v1 > v2 ? v1 : v2; } // optimization
+	char max( char v1, char v2 ) { return v1 > v2 ? v1 : v2; }
 	int max( int v1, int v2 ) { return v1 > v2 ? v1 : v2; }
 	unsigned int max( unsigned int v1, unsigned int v2 ) { return v1 > v2 ? v1 : v2; }
@@ -83,12 +100,4 @@
 	long long int max( long long int v1, long long int v2 ) { return v1 > v2 ? v1 : v2; }
 	unsigned long long int max( unsigned long long int v1, unsigned long long int v2 ) { return v1 > v2 ? v1 : v2; }
-	forall( T | { int ?>?( T, T ); } )					// generic
-	T max( T v1, T v2 ) { return v1 > v2 ? v1 : v2; }
-
-	forall( 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 ) ); }
-
-	forall( T )
-	void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; }
 } // distribution
 
