1 #ifndef SPACE_VECTOR_H_
2 #define SPACE_VECTOR_H_
10 template<class Scalar>
14 constexpr Vector() : x(0), y(0) { }
15 constexpr Vector(Scalar x, Scalar y) : x(x), y(y) { }
18 constexpr Vector(Vector<Other> other) : x(other.x), y(other.y) { }
21 Vector<Scalar> &operator +=(Vector<Scalar> other) {
26 Vector<Scalar> &operator -=(Vector<Scalar> other) {
39 template<class Scalar>
40 constexpr Vector<Scalar> operator -(Vector<Scalar> v) {
41 return Vector<Scalar>(-v.x, -v.y);
45 template<class Scalar>
46 constexpr Vector<Scalar> operator +(Vector<Scalar> lhs, Vector<Scalar> rhs) {
47 return Vector<Scalar>(lhs.x + rhs.x, lhs.y + rhs.y);
50 template<class Scalar>
51 constexpr Vector<Scalar> operator -(Vector<Scalar> lhs, Vector<Scalar> rhs) {
52 return Vector<Scalar>(lhs.x - rhs.x, lhs.y - rhs.y);
56 template<class Scalar>
57 constexpr Vector<Scalar> operator *(Vector<Scalar> lhs, Scalar rhs) {
58 return Vector<Scalar>(lhs.x * rhs, lhs.y * rhs);
61 template<class Scalar>
62 constexpr Vector<Scalar> operator *(Scalar lhs, Vector<Scalar> rhs) {
65 template<class Scalar>
66 constexpr Vector<Scalar> operator *(Vector<Scalar> lhs, Vector<Scalar> rhs) {
67 return Vector<Scalar>(lhs.x * rhs.x, lhs.y * rhs.y);
71 template<class Scalar>
72 constexpr Vector<Scalar> operator /(Vector<Scalar> lhs, Scalar rhs) {
73 return Vector<Scalar>(lhs.x / rhs, lhs.y / rhs);
76 template<class Scalar>
77 constexpr Vector<Scalar> operator /(Scalar lhs, Vector<Scalar> rhs) {
80 template<class Scalar>
81 constexpr Vector<Scalar> operator /(Vector<Scalar> lhs, Vector<Scalar> rhs) {
82 return Vector<Scalar>(lhs.x / rhs.x, lhs.y / rhs.y);
86 template<class Scalar>
87 constexpr bool operator ==(Vector<Scalar> lhs, Vector<Scalar> rhs) {
88 return lhs.x == rhs.x && lhs.y == rhs.y;
90 template<class Scalar>
91 constexpr bool operator !=(Vector<Scalar> lhs, Vector<Scalar> rhs) {
92 return lhs.x != rhs.x && lhs.y != rhs.y;
96 template<class Scalar>
97 inline std::ostream &operator <<(std::ostream &out, Vector<Scalar> v) {
98 return out << '<' << v.x << ',' << v.y << '>';
106 template<class Scalar>
107 constexpr space::Vector<Scalar> min(
108 space::Vector<Scalar> lhs,
109 space::Vector<Scalar> rhs
111 return space::Vector<Scalar>(
117 template<class Scalar>
118 constexpr space::Vector<Scalar> max(
119 space::Vector<Scalar> lhs,
120 space::Vector<Scalar> rhs
122 return space::Vector<Scalar>(