]> git.localhorst.tv Git - space.git/blobdiff - src/graphics/Vector.h
move to SDL2
[space.git] / src / graphics / Vector.h
diff --git a/src/graphics/Vector.h b/src/graphics/Vector.h
new file mode 100644 (file)
index 0000000..b5c6d7d
--- /dev/null
@@ -0,0 +1,130 @@
+#ifndef SPACE_VECTOR_H_
+#define SPACE_VECTOR_H_
+
+#include <algorithm>
+#include <ostream>
+
+
+namespace space {
+
+template<class Scalar>
+class Vector {
+
+public:
+       constexpr Vector() : x(0), y(0) { }
+       constexpr Vector(Scalar x, Scalar y) : x(x), y(y) { }
+
+       template<class Other>
+       constexpr Vector(Vector<Other> other) : x(other.x), y(other.y) { }
+
+public:
+       Vector<Scalar> &operator +=(Vector<Scalar> other) {
+               x += other.x;
+               y += other.y;
+               return *this;
+       }
+       Vector<Scalar> &operator -=(Vector<Scalar> other) {
+               x -= other.x;
+               y -= other.y;
+               return *this;
+       }
+
+public:
+       Scalar x;
+       Scalar y;
+
+};
+
+
+template<class Scalar>
+constexpr Vector<Scalar> operator -(Vector<Scalar> v) {
+       return Vector<Scalar>(-v.x, -v.y);
+}
+
+
+template<class Scalar>
+constexpr Vector<Scalar> operator +(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+       return Vector<Scalar>(lhs.x + rhs.x, lhs.y + rhs.y);
+}
+
+template<class Scalar>
+constexpr Vector<Scalar> operator -(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+       return Vector<Scalar>(lhs.x - rhs.x, lhs.y - rhs.y);
+}
+
+
+template<class Scalar>
+constexpr Vector<Scalar> operator *(Vector<Scalar> lhs, Scalar rhs) {
+       return Vector<Scalar>(lhs.x * rhs, lhs.y * rhs);
+}
+
+template<class Scalar>
+constexpr Vector<Scalar> operator *(Scalar lhs, Vector<Scalar> rhs) {
+       return rhs * lhs;
+}
+template<class Scalar>
+constexpr Vector<Scalar> operator *(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+       return Vector<Scalar>(lhs.x * rhs.x, lhs.y * rhs.y);
+}
+
+
+template<class Scalar>
+constexpr Vector<Scalar> operator /(Vector<Scalar> lhs, Scalar rhs) {
+       return Vector<Scalar>(lhs.x / rhs, lhs.y / rhs);
+}
+
+template<class Scalar>
+constexpr Vector<Scalar> operator /(Scalar lhs, Vector<Scalar> rhs) {
+       return rhs / lhs;
+}
+template<class Scalar>
+constexpr Vector<Scalar> operator /(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+       return Vector<Scalar>(lhs.x / rhs.x, lhs.y / rhs.y);
+}
+
+
+template<class Scalar>
+constexpr bool operator ==(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+       return lhs.x == rhs.x && lhs.y == rhs.y;
+}
+template<class Scalar>
+constexpr bool operator !=(Vector<Scalar> lhs, Vector<Scalar> rhs) {
+       return lhs.x != rhs.x && lhs.y != rhs.y;
+}
+
+
+template<class Scalar>
+inline std::ostream &operator <<(std::ostream &out, Vector<Scalar> v) {
+       return out << '<' << v.x << ',' << v.y << '>';
+}
+
+}
+
+
+namespace std {
+
+template<class Scalar>
+constexpr space::Vector<Scalar> min(
+               space::Vector<Scalar> lhs,
+               space::Vector<Scalar> rhs
+) {
+       return space::Vector<Scalar>(
+               min(lhs.x, rhs.x),
+               min(lhs.y, rhs.y)
+       );
+}
+
+template<class Scalar>
+constexpr space::Vector<Scalar> max(
+               space::Vector<Scalar> lhs,
+               space::Vector<Scalar> rhs
+) {
+       return space::Vector<Scalar>(
+               max(lhs.x, rhs.x),
+               max(lhs.y, rhs.y)
+       );
+}
+
+}
+
+#endif