From 71d8a3076945aa353031e89bfb4f893df000c8a6 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 15 Apr 2015 14:06:49 +1000 Subject: [PATCH] vector: operate on value types, not references --- vector.cpp | 44 +++++++++++++++++++++++--------------------- vector.hpp | 12 ++++++------ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/vector.cpp b/vector.cpp index ef235f00..afd033ec 100644 --- a/vector.cpp +++ b/vector.cpp @@ -26,6 +26,8 @@ #include using util::vector; +using util::vector3f; +using util::vector3d; /////////////////////////////////////////////////////////////////////////////// @@ -53,7 +55,7 @@ util::vector::magnitude2 (void) const //----------------------------------------------------------------------------- template T -util::vector::difference (const util::vector &rhs) const +util::vector::difference (vector rhs) const { // TODO: change the signature to ensure it does not truncate return static_cast (std::sqrt (difference2 (rhs))); @@ -63,7 +65,7 @@ util::vector::difference (const util::vector &rhs) const //----------------------------------------------------------------------------- template T -util::vector::difference2 (const util::vector &rhs) const +util::vector::difference2 (vector rhs) const { T sum {0}; for (size_t i = 0; i < S; ++i) @@ -112,8 +114,8 @@ util::vector::normalised (void) const /////////////////////////////////////////////////////////////////////////////// template -util::vector<2,T> -util::polar_to_cartesian (util::vector<2,T> v) +vector<2,T> +util::polar_to_cartesian (vector<2,T> v) { return util::vector<2,T> { v[0] * std::cos (v[1]), @@ -124,8 +126,8 @@ util::polar_to_cartesian (util::vector<2,T> v) //----------------------------------------------------------------------------- template -util::vector<2,T> -util::cartesian_to_polar (util::vector<2,T> v) +vector<2,T> +util::cartesian_to_polar (vector<2,T> v) { return util::vector<2,T> { std::hypot (v.x, v.y), @@ -136,9 +138,9 @@ util::cartesian_to_polar (util::vector<2,T> v) /////////////////////////////////////////////////////////////////////////////// template -util::vector<3,T> -util::cross (const util::vector<3,T> &a, - const util::vector<3,T> &b) +vector<3,T> +util::cross (vector<3,T> a, + vector<3,T> b) { return util::vector<3,T> { a.y * b.z - a.z * b.y, @@ -147,16 +149,16 @@ util::cross (const util::vector<3,T> &a, }; } -template util::vector3f util::cross(const util::vector3f&, const util::vector3f&); -template util::vector3d util::cross(const util::vector3d&, const util::vector3d&); +template vector3f util::cross(vector3f, vector3f); +template vector3d util::cross(vector3d, vector3d); //----------------------------------------------------------------------------- template -util::vector<3,T> -util::spherical_to_cartesian (const util::vector<3,T> &s) +vector<3,T> +util::spherical_to_cartesian (vector<3,T> s) { - return util::vector<3,T> { + return vector<3,T> { s.x * sin (s.y) * cos (s.z), s.x * sin (s.y) * sin (s.z), s.x * cos (s.y), @@ -166,12 +168,12 @@ util::spherical_to_cartesian (const util::vector<3,T> &s) //----------------------------------------------------------------------------- template -util::vector<3,T> -util::cartesian_to_spherical (const util::vector<3,T> &c) +vector<3,T> +util::cartesian_to_spherical (vector<3,T> c) { T mag = c.magnitude (); - return util::vector<3,T> { + return vector<3,T> { mag, acos (c.z / mag), atan2 (c.y, c.x) @@ -217,7 +219,7 @@ util::vector::sanity (void) const template std::ostream& -util::operator<< (std::ostream &os, const util::vector &v) +util::operator<< (std::ostream &os, util::vector v) { os << "vec" << S << "(" << v.data[0]; for (size_t i = 1; i < S; ++i) @@ -247,9 +249,9 @@ util::operator>> (const json::tree::node &node, util::vector &v) //----------------------------------------------------------------------------- -#define INSTANTIATE_S_T(S,T) \ -template struct util::vector; \ -template std::ostream& util::operator<< (std::ostream&, const util::vector &v);\ +#define INSTANTIATE_S_T(S,T) \ +template struct util::vector; \ +template std::ostream& util::operator<< (std::ostream&, util::vector v); \ template const json::tree::node& util::operator>> (const json::tree::node&, util::vector&); diff --git a/vector.hpp b/vector.hpp index 4b5c96d3..b58421e9 100644 --- a/vector.hpp +++ b/vector.hpp @@ -36,8 +36,8 @@ namespace util { T magnitude (void) const; T magnitude2 (void) const; - T difference (const vector&) const; - T difference2 (const vector&) const; + T difference (vector) const; + T difference2 (vector) const; // normalisation bool is_normalised (void) const; @@ -56,12 +56,12 @@ namespace util { template vector<2,T> polar_to_cartesian (vector<2,T>); template vector<2,T> cartesian_to_polar (vector<2,T>); - template vector<3,T> cross (const vector<3,T>&, const vector<3,T>&); - template vector<3,T> spherical_to_cartesian (const vector<3,T>&); - template vector<3,T> cartesian_to_spherical (const vector<3,T>&); + template vector<3,T> cross (vector<3,T>, vector<3,T>); + template vector<3,T> spherical_to_cartesian (vector<3,T>); + template vector<3,T> cartesian_to_spherical (vector<3,T>); // output and serialisation operators - template std::ostream& operator<< (std::ostream&, const vector&); + template std::ostream& operator<< (std::ostream&, vector); template const json::tree::node& operator>> (const json::tree::node&, vector&);