+++ /dev/null
-#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