refactored vector classes to avoid reinterpret_cast
[xonotic/netradiant.git] / libs / math / vector.h
index a9d2a80905ef1d954e7a6f51caf462576e8aa2ef..15c31def3aaf871ef252c3a910c591c9b7d223df 100644 (file)
@@ -25,6 +25,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 /// \file
 /// \brief Vector data types and related operations.
 
 /// \file
 /// \brief Vector data types and related operations.
 
+#include "generic/vector.h"
+
 #if 0
 
 #define        lrint(dbl)              ((int)((dbl) + 0.5))
 #if 0
 
 #define        lrint(dbl)              ((int)((dbl) + 0.5))
@@ -58,7 +60,6 @@ inline int lrint (double flt)
 #endif
 
 #include <cmath>
 #endif
 
 #include <cmath>
-#include <cstddef>
 #include <float.h>
 #include <algorithm>
 
 #include <float.h>
 #include <algorithm>
 
@@ -115,48 +116,6 @@ inline Element float_mod(const Element& self, const ModulusElement& modulus)
 }
 
 
 }
 
 
-template<typename Element>
-class BasicVector2
-{
-  Element m_elements[2];
-public:
-  BasicVector2()
-  {
-  }
-  BasicVector2(const Element& x_, const Element& y_)
-  {
-    x() = x_;
-    y() = y_;
-  }
-
-  Element& x()
-  {
-    return m_elements[0];
-  }
-  const Element& x() const
-  {
-    return m_elements[0];
-  }
-  Element& y()
-  {
-    return m_elements[1];
-  }
-  const Element& y() const
-  {
-    return m_elements[1];
-  }
-
-  const Element& operator[](std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& operator[](std::size_t i)
-  {
-    return m_elements[i];
-  }
-};
-
-
 template<typename Element, typename OtherElement>
 inline BasicVector2<Element> vector2_added(const BasicVector2<Element>& self, const BasicVector2<OtherElement>& other)
 {
 template<typename Element, typename OtherElement>
 inline BasicVector2<Element> vector2_added(const BasicVector2<Element>& self, const BasicVector2<OtherElement>& other)
 {
@@ -335,79 +294,6 @@ inline double vector2_cross(const BasicVector2<Element>& self, const BasicVector
   return self.x() * other.y() - self.y() * other.x();
 }
 
   return self.x() * other.y() - self.y() * other.x();
 }
 
-typedef BasicVector2<float> Vector2;
-
-/// \brief A 3-element vector.
-template<typename Element>
-class BasicVector3
-{
-  Element m_elements[3];
-public:
-
-  BasicVector3()
-  {
-  }
-  template<typename OtherElement>
-  BasicVector3(const BasicVector3<OtherElement>& other)
-  {
-    x() = static_cast<Element>(other.x());
-    y() = static_cast<Element>(other.y());
-    z() = static_cast<Element>(other.z());
-  }
-  BasicVector3(const Element& x_, const Element& y_, const Element& z_)
-  {
-    x() = x_;
-    y() = y_;
-    z() = z_;
-  }
-
-  Element& x()
-  {
-    return m_elements[0];
-  }
-  const Element& x() const
-  {
-    return m_elements[0];
-  }
-  Element& y()
-  {
-    return m_elements[1];
-  }
-  const Element& y() const
-  {
-    return m_elements[1];
-  }
-  Element& z()
-  {
-    return m_elements[2];
-  }
-  const Element& z() const
-  {
-    return m_elements[2];
-  }
-
-  const Element& operator[](std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& operator[](std::size_t i)
-  {
-    return m_elements[i];
-  }
-
-  operator BasicVector2<Element>&()
-  {
-    return reinterpret_cast<BasicVector2<Element>&>(*this);
-  }
-  operator const BasicVector2<Element>&() const
-  {
-    return reinterpret_cast<const BasicVector2<Element>&>(*this);
-  }
-};
-
-/// \brief A 3-element vector stored in single-precision floating-point.
-typedef BasicVector3<float> Vector3;
-
 const Vector3 g_vector3_identity(0, 0, 0);
 const Vector3 g_vector3_max = Vector3(FLT_MAX, FLT_MAX, FLT_MAX);
 const Vector3 g_vector3_axis_x(1, 0, 0);
 const Vector3 g_vector3_identity(0, 0, 0);
 const Vector3 g_vector3_max = Vector3(FLT_MAX, FLT_MAX, FLT_MAX);
 const Vector3 g_vector3_axis_x(1, 0, 0);
@@ -416,26 +302,6 @@ const Vector3 g_vector3_axis_z(0, 0, 1);
 
 const Vector3 g_vector3_axes[3] = { g_vector3_axis_x, g_vector3_axis_y, g_vector3_axis_z };
 
 
 const Vector3 g_vector3_axes[3] = { g_vector3_axis_x, g_vector3_axis_y, g_vector3_axis_z };
 
-inline Vector3& vector3_from_array(float* array)
-{
-  return *reinterpret_cast<Vector3*>(array);
-}
-inline const Vector3& vector3_from_array(const float* array)
-{
-  return *reinterpret_cast<const Vector3*>(array);
-}
-
-template<typename Element>
-inline Element* vector3_to_array(BasicVector3<Element>& self)
-{
-  return reinterpret_cast<Element*>(&self);
-}
-template<typename Element>
-inline const Element* vector3_to_array(const BasicVector3<Element>& self)
-{
-  return reinterpret_cast<const Element*>(&self);
-}
-
 template<typename Element, typename OtherElement>
 inline void vector3_swap(BasicVector3<Element>& self, BasicVector3<OtherElement>& other)
 {
 template<typename Element, typename OtherElement>
 inline void vector3_swap(BasicVector3<Element>& self, BasicVector3<OtherElement>& other)
 {
@@ -743,98 +609,6 @@ inline Vector3 vector3_for_spherical(double theta, double phi)
 }
 
 
 }
 
 
-/// \brief A 4-element vector.
-template<typename Element>
-class BasicVector4
-{
-  Element m_elements[4];
-public:
-
-  BasicVector4()
-  {
-  }
-  BasicVector4(Element x_, Element y_, Element z_, Element w_)
-  {
-    x() = x_;
-    y() = y_;
-    z() = z_;
-    w() = w_;
-  }
-  BasicVector4(const BasicVector3<Element>& self, Element w_)
-  {
-    x() = self.x();
-    y() = self.y();
-    z() = self.z();
-    w() = w_;
-  }
-
-  Element& x()
-  {
-    return m_elements[0];
-  }
-  Element x() const
-  {
-    return m_elements[0];
-  }
-  Element& y()
-  {
-    return m_elements[1];
-  }
-  Element y() const
-  {
-    return m_elements[1];
-  }
-  Element& z()
-  {
-    return m_elements[2];
-  }
-  Element z() const
-  {
-    return m_elements[2];
-  }
-  Element& w()
-  {
-    return m_elements[3];
-  }
-  Element w() const
-  {
-    return m_elements[3];
-  }
-
-  Element index(std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& index(std::size_t i)
-  {
-    return m_elements[i];
-  }
-  Element operator[](std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& operator[](std::size_t i)
-  {
-    return m_elements[i];
-  }
-
-  operator BasicVector3<Element>&()
-  {
-    return reinterpret_cast<BasicVector3<Element>&>(*this);
-  }
-  operator const BasicVector3<Element>&() const
-  {
-    return reinterpret_cast<const BasicVector3<Element>&>(*this);
-  }
-
-  bool operator==(const BasicVector4& other) const
-  {
-    return x() == other.x() && y() == other.y() && z() == other.z() && w() == other.w();
-  }
-};
-
-/// \brief A 4-element vector stored in single-precision floating-point.
-typedef BasicVector4<float> Vector4;
 
 
 template<typename Element, typename OtherElement>
 
 
 template<typename Element, typename OtherElement>
@@ -862,28 +636,6 @@ inline bool vector4_equal_epsilon(const BasicVector4<Element>& self, const Basic
     && float_equal_epsilon(self.w(), other.w(), epsilon);
 }
 
     && float_equal_epsilon(self.w(), other.w(), epsilon);
 }
 
-template<typename Element>
-inline Element* vector4_to_array(BasicVector4<Element>& self)
-{
-  return reinterpret_cast<Element*>(&self);
-}
-template<typename Element>
-inline const float* vector4_to_array(const BasicVector4<Element>& self)
-{
-  return reinterpret_cast<const Element*>(&self);
-}
-
-template<typename Element>
-inline Vector3& vector4_to_vector3(BasicVector4<Element>& self)
-{
-  return reinterpret_cast<BasicVector3<Element>&>(self);
-}
-template<typename Element>
-inline const Vector3& vector4_to_vector3(const BasicVector4<Element>& self)
-{
-  return reinterpret_cast<const BasicVector3<Element>&>(self);
-}
-
 template<typename Element, typename OtherElement>
 inline BasicVector4<Element> vector4_added(const BasicVector4<Element>& self, const BasicVector4<OtherElement>& other)
 {
 template<typename Element, typename OtherElement>
 inline BasicVector4<Element> vector4_added(const BasicVector4<Element>& self, const BasicVector4<OtherElement>& other)
 {