1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| template<int cond,class A, class B> struct IF {};
template<class A,class B> struct IF<0, A, B> { typedef B RET; };
template<class A,class B> struct IF<1, A, B> { typedef A RET; };
template<int m,int n> struct EQUAL { enum { RET=(m==n)?1:0 }; };
template<int m,int n> struct NOT_EQUAL { enum { RET=(m!=n)?1:0 }; };
template<int m,int n> struct LOWER { enum { RET=(m<n)?1:0 }; };
template<int m,int n> struct GREATER { enum { RET=(m>n)?1:0 }; };
template<int m,int n> struct LOWER_EQUAL { enum { RET=(m<=n)?1:0 }; };
template<int m,int n> struct GREATER_EQUAL { enum { RET=(m>=n)?1:0 }; };
template<class T> struct promotion { };
#define DECLARE_PROMOTION(TYPE,RANK) template<> struct promotion< TYPE > { enum { rank = RANK }; }; template<> struct promotion<const TYPE > { enum { rank = RANK }; };
DECLARE_PROMOTION(unsigned char, 1)
DECLARE_PROMOTION(char, 2)
DECLARE_PROMOTION(unsigned short, 3)
DECLARE_PROMOTION(short, 4)
DECLARE_PROMOTION(unsigned int, 5)
DECLARE_PROMOTION(int, 6)
DECLARE_PROMOTION(unsigned long, 7)
DECLARE_PROMOTION(long, 8)
DECLARE_PROMOTION(float, 9)
DECLARE_PROMOTION(double, 10)
DECLARE_PROMOTION(long double, 11)
template<class T>
struct promotion_traits
{
typedef T value_type;
};
template<class T>
struct promotion_traits<const T>
{
typedef typename promotion_traits<T>::value_type value_type;
};
template<class T1,class T2>
struct promotion2_traits
{
typedef typename IF<LOWER<promotion<T1>::rank,promotion<T2>::rank>::RET, T2, T1>::RET value_type;
// typedef T1 value_type;
};
template<class T1,class T2> struct promotion2_traits<const T1, T2> { typedef typename promotion2_traits<T1,T2>::value_type value_type; };
template<class T1,class T2> struct promotion2_traits< T1,const T2> { typedef typename promotion2_traits<T1,T2>::value_type value_type; };
template<class T1,class T2> struct promotion2_traits<const T1,const T2> { typedef typename promotion2_traits<T1,T2>::value_type value_type; };
template<class G> class Vector;
template<class G,class V> struct promotion2_traits<Vector <G>,complex<V> > { typedef typename Vector<G>::template rebind<typename promotion2_traits<typename Vector<G>::const_value_type,complex<V> >::value_type>::other value_type; };
template<class V,class G> struct promotion2_traits<complex<V>,Vector <G> > { typedef typename Vector<G>::template rebind<typename promotion2_traits<complex<V>,typename Vector<G>::const_value_type >::value_type>::other value_type; };
template<class G> class Matrix;
template<class G,class V> struct promotion2_traits<Matrix <G>,complex<V> > { typedef typename Matrix<G>::template rebind<typename promotion2_traits<typename Matrix<G>::const_value_type,complex<V> >::value_type>::other value_type; };
template<class V,class G> struct promotion2_traits<complex<V>,Matrix <G> > { typedef typename Matrix<G>::template rebind<typename promotion2_traits<complex<V>,typename Matrix<G>::const_value_type >::value_type>::other value_type; };
template<int D,class G> class Array;
template<int D,class G,class V> struct promotion2_traits<Array<D,G >,complex<V> > { typedef typename Array<D,G>::template rebind<typename promotion2_traits<typename Array<D,G>::const_value_type,complex<V> >::value_type>::other value_type; };
template<class V,int D,class G> struct promotion2_traits<complex<V> ,Array<D,G > > { typedef typename Array<D,G>::template rebind<typename promotion2_traits<complex<V> ,typename Array<D,G>::const_value_type>::value_type>::other value_type; };
template<class T1,class T2,class T3>
struct promotion3_traits
{
typedef typename promotion2_traits<typename promotion2_traits<T1,T2>::value_type, T3>::value_type value_type;
// typedef T1 value_type;
};
#define PROMOTE(T) typename promotion_traits< T >::value_type
//#define PROMOTE2(T1,T2) T1
#define PROMOTE2(T1,T2) typename promotion2_traits< T1,T2 >::value_type
//#define PROMOTE3(T1,T2,T3) T1
#define PROMOTE3(T1,T2,T3) typename promotion3_traits< T1,T2,T3 >::value_type |
Partager