#pragma once #include "3ds/types.h" namespace CTRPluginFramework { template class Vector { public: Vector(); Vector(T x, T y); template explicit Vector(const Vector &vector); T x; T y; }; template Vector::Vector() : x(0), y(0) { } template Vector::Vector(T x, T y) : x(x), y(y) { } template template Vector::Vector(const Vector &vector) : x(static_cast(vector.x)), y(static_cast(vector.y)) { } template Vector operator - (const Vector &vector) { return (Vector(-vector.x, -vector.y)); } template Vector operator - (const Vector &left, const Vector &right) { return (Vector(left.x - right.x, left.y - right.y)); } template Vector &operator -= (const Vector &left, const Vector &right) { left.x -= right.x; left.y -= right.y; return (left); } template Vector operator + (const Vector &left, const Vector &right) { return (Vector(left.x + right.x, left.y + right.y)); } template Vector &operator += (const Vector &left, const Vector &right) { left.x += right.x; left.y += right.y; return (left); } template Vector operator * (const Vector &left, T right) { return (Vector(left.x * right, left.y * right)); } template Vector operator * (const T left, const Vector &right) { return (Vector(right.x * left, right.y * left)); } template Vector &operator *= (Vector &left, const T right) { left.x *= right; left.y *= right; return (left); } template Vector operator / (const Vector &left, const T right) { return (Vector(left.x / right, left.y / right)); } template Vector &operator /= (Vector &left, const T right) { left.x /= right; left.y /= right; return (left); } template bool operator <= (const Vector &left, const Vector &right) { return (left.x <= right.x && left.y <= right.y); } template bool operator >= (const Vector &left, const Vector &right) { return (left.x >= right.x && left.y >= right.y); } typedef Vector UIntVector; typedef Vector IntVector; typedef Vector FloatVector; typedef Vector shortVector; }