00001
00002
00003 #ifndef DUNE_DOTPRODUCT_HH
00004 #define DUNE_DOTPRODUCT_HH
00005
00006 #include "ftraits.hh"
00007 #include "typetraits.hh"
00008
00009 namespace Dune {
00024 template<class T>
00025 struct AlwaysVoid { typedef void type; };
00026
00027 template<class T, class = void>
00028 struct IsVector : std::false_type {};
00029
00030 template<class T>
00031 struct IsVector<T, typename AlwaysVoid<typename T::field_type>::type>
00032 : std::true_type {};
00033
00041 template<class A, class B>
00042 auto
00043 dot(const A & a, const B & b) -> typename std::enable_if<!IsVector<A>::value && !std::is_same<typename FieldTraits<A>::field_type,typename FieldTraits<A>::real_type> ::value, decltype(conj(a)*b)>::type
00044 {
00045 return conj(a)*b;
00046 }
00047
00057
00058 template<class A, class B>
00059 auto
00060 dot(const A & a, const B & b) -> typename std::enable_if<!IsVector<A>::value && std::is_same<typename FieldTraits<A>::field_type,typename FieldTraits<A>::real_type>::value, decltype(a*b)>::type
00061 {
00062 return a*b;
00063 }
00064
00074 template<typename A, typename B>
00075 auto
00076 dot(const A & a, const B & b) -> typename std::enable_if<IsVector<A>::value, decltype(a.dot(b))>::type
00077 {
00078 return a.dot(b);
00079 }
00089 template<class A, class B>
00090 auto
00091 dotT(const A & a, const B & b) -> decltype(a*b)
00092 {
00093 return a*b;
00094 }
00095
00097 }
00098
00099 #endif // DUNE_DOTPRODUCT_HH