From b96ad81d3266aabd296606e086e3d24872e4d73f Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Thu, 28 May 2015 10:18:07 +1000 Subject: [PATCH] coord: allow multi-type scalar-vector ops --- coord/ops.hpp | 55 +++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/coord/ops.hpp b/coord/ops.hpp index 0013a657..39ddcb92 100644 --- a/coord/ops.hpp +++ b/coord/ops.hpp @@ -35,19 +35,20 @@ namespace util { template < size_t S, typename T, + typename U, template class A, template class B > struct traits { }; //------------------------------------------------------------------------- - template struct traits { typedef colour result; }; - template struct traits { typedef extent result; }; - template struct traits { typedef extent result; }; - template struct traits { typedef point result; }; - template struct traits { typedef point result; }; - template struct traits { typedef point result; }; - template struct traits { typedef vector result; }; + template struct traits { typedef colour::type> result; }; + template struct traits { typedef extent::type> result; }; + template struct traits { typedef extent::type> result; }; + template struct traits { typedef point ::type> result; }; + template struct traits { typedef point ::type> result; }; + template struct traits { typedef point ::type> result; }; + template struct traits { typedef vector::type> result; }; } /////////////////////////////////////////////////////////////////////////// @@ -56,13 +57,14 @@ namespace util { template < \ size_t S, \ typename T, \ + typename U, \ template class A, \ template class B \ > \ - typename coord::traits::result \ - operator OP (A a, B b) \ + typename coord::traits::result \ + operator OP (A a, B b) \ { \ - typename coord::traits::result out; \ + typename coord::traits::result out; \ for (size_t i = 0; i < S; ++i) \ out[i] = a[i] OP b[i]; \ return out; \ @@ -74,7 +76,7 @@ namespace util { template class A, \ template class B \ > \ - typename coord::traits::result& \ + typename coord::traits::result& \ operator PASTE(OP,=) (A& a, B b) \ { \ for (size_t i = 0; i < S; ++i) \ @@ -94,28 +96,30 @@ namespace util { template < \ size_t S, \ typename T, \ + typename U, \ template class K \ > \ - K \ - operator OP (T t, K k) \ + typename std::enable_if::value, K>::type \ + operator OP (U u, K k) \ { \ K out; \ for (size_t i = 0; i < S; ++i) \ - out[i] = t OP k[i]; \ + out[i] = u OP k[i]; \ return out; \ } \ \ template < \ size_t S, \ typename T, \ + typename U, \ template class K \ > \ - K \ - operator OP (K k, T t) \ + typename std::enable_if::value, K>::type \ + operator OP (K k, U u) \ { \ K out; \ for (size_t i = 0; i < S; ++i) \ - out[i] = k[i] OP t; \ + out[i] = k[i] OP u; \ return out; \ } @@ -194,12 +198,13 @@ namespace util { /// point-point subtraction giving a vector difference template < size_t S, - typename T + typename T, + typename U > - vector - operator- (point a, point b) + vector::type> + operator- (point a, point b) { - vector out; + vector::type> out; for (size_t i = 0; i < S; ++i) out[i] = a[i] - b[i]; return out; @@ -209,11 +214,13 @@ namespace util { //------------------------------------------------------------------------- template < size_t S, - typename T + typename T, + typename U > - vector operator- (T t, point p) + vector::type> + operator- (U u, point p) { - return point {t} - p; + return point {u} - p; }