2 #if !defined(INCLUDED_VECTOR_H)
3 #define INCLUDED_VECTOR_H
7 template <typename Element>
10 Element m_elements[2];
15 BasicVector2(const Element& x_, const Element& y_)
25 const Element& x() const
33 const Element& y() const
38 const Element& operator[](std::size_t i) const
42 Element& operator[](std::size_t i)
51 const Element* data() const
57 /// \brief A 3-element vector.
58 template<typename Element>
61 Element m_elements[3];
67 template<typename OtherElement>
68 BasicVector3(const BasicVector3<OtherElement>& other)
70 x() = static_cast<Element>(other.x());
71 y() = static_cast<Element>(other.y());
72 z() = static_cast<Element>(other.z());
74 BasicVector3(const Element& x_, const Element& y_, const Element& z_)
85 const Element& x() const
93 const Element& y() const
101 const Element& z() const
103 return m_elements[2];
106 const Element& operator[](std::size_t i) const
108 return m_elements[i];
110 Element& operator[](std::size_t i)
112 return m_elements[i];
119 const Element* data() const
125 /// \brief A 4-element vector.
126 template<typename Element>
129 Element m_elements[4];
135 BasicVector4(Element x_, Element y_, Element z_, Element w_)
142 BasicVector4(const BasicVector3<Element>& self, Element w_)
152 return m_elements[0];
154 const Element& x() const
156 return m_elements[0];
160 return m_elements[1];
162 const Element& y() const
164 return m_elements[1];
168 return m_elements[2];
170 const Element& z() const
172 return m_elements[2];
176 return m_elements[3];
178 const Element& w() const
180 return m_elements[3];
183 Element index(std::size_t i) const
185 return m_elements[i];
187 Element& index(std::size_t i)
189 return m_elements[i];
191 Element operator[](std::size_t i) const
193 return m_elements[i];
195 Element& operator[](std::size_t i)
197 return m_elements[i];
204 const Element* data() const
210 template<typename Element>
211 inline BasicVector3<Element> vector3_from_array(const Element* array)
213 return BasicVector3<Element>(array[0], array[1], array[2]);
216 template<typename Element>
217 inline Element* vector3_to_array(BasicVector3<Element>& self)
221 template<typename Element>
222 inline const Element* vector3_to_array(const BasicVector3<Element>& self)
227 template<typename Element>
228 inline Element* vector4_to_array(BasicVector4<Element>& self)
232 template<typename Element>
233 inline const Element* vector4_to_array(const BasicVector4<Element>& self)
238 template<typename Element>
239 inline BasicVector3<Element>& vector4_to_vector3(BasicVector4<Element>& self)
241 return *reinterpret_cast<BasicVector3<Element>*>(vector4_to_array(self));
243 template<typename Element>
244 inline const BasicVector3<Element>& vector4_to_vector3(const BasicVector4<Element>& self)
246 return *reinterpret_cast<const BasicVector3<Element>*>(vector4_to_array(self));
249 /// \brief A 2-element vector stored in single-precision floating-point.
250 typedef BasicVector2<float> Vector2;
252 /// \brief A 3-element vector stored in single-precision floating-point.
253 typedef BasicVector3<float> Vector3;
255 /// \brief A 4-element vector stored in single-precision floating-point.
256 typedef BasicVector4<float> Vector4;