#ifndef VECTOR2_H
#define VECTOR2_H
#include <string>
template<typename T>
struct Vector2
{
T x, y;
template<typename T>
Vector2(T x = 0.0, T y = 0.0) :
x(x),
y(y)
{
}
template<typename T>
std::string toString() const
{
char buffer[255];
snprintf(buffer, 255, "Vector2[%+.2f %+.2f]", x, y);
return std::string(buffer);
}
template<typename T>
T operator[](int i) const
{
return (&x)[i];
}
template<typename T>
T & operator[](int i)
{
return (&x)[i];
}
template<typename T>
bool operator==(const Vector2<T> & other) const
{
return (&*this == &other) || (x == other.x && y == other.y);
}
template<typename T>
bool operator!=(const Vector2<T> & other) const
{
return !(*this == other);
}
template<typename T>
Vector2 operator+=(const Vector2<T> & other)
{
x += other.x;
y += other.y;
return *this;
}
template<typename T>
Vector2 operator+=(const T f)
{
x += f;
y += f;
return *this;
}
template<typename T>
Vector2 operator-=(const Vector2<T> & other)
{
x -= other.x;
y -= other.y;
return *this;
}
template<typename T>
Vector2 operator-=(const T f)
{
x -= f;
y -= f;
return *this;
}
template<typename T>
Vector2 operator*=(const Vector2<T> & other)
{
x *= other.x;
y *= other.y;
return *this;
}
template<typename T>
Vector2 operator*=(const T f)
{
x *= f;
y *= f;
return *this;
}
template<typename T>
Vector2 operator/=(const Vector2<T> & other)
{
x /= other.x;
y /= other.y;
return *this;
}
template<typename T>
Vector2 operator/=(const T f)
{
x /= f;
y /= f;
return *this;
}
template<typename T>
Vector2 operator+(const Vector2<T> & other) const
{
return (x + other.x, y + other.y);
}
template<typename T>
Vector2 operator+(const T f) const
{
return (x + f, y + f);
}
template<typename T>
Vector2 operator-(const Vector2<T> & other) const
{
return (x - other.x, y - other.y);
}
template<typename T>
Vector2 operator-(const T f) const
{
return (x - f, y - f);
}
template<typename T>
Vector2 operator*(const Vector2<T> & other) const
{
return (x * other.x, y * other.y);
}
template<typename T>
Vector2 operator*(const T f) const
{
return (x * f, y * f);
}
template<typename T>
Vector2 operator/(const Vector2<T> & other) const
{
return (x / other.x, y / other.y);
}
template<typename T>
Vector2 operator/(const T f) const
{
return (x / f, y / f);
}
};
#endif // VECTOR2_H
I2lmbmRlZiBWRUNUT1IyX0gKI2RlZmluZSBWRUNUT1IyX0gKCiNpbmNsdWRlIDxzdHJpbmc+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgVmVjdG9yMgp7CglUIHgsIHk7CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIoVCB4ID0gMC4wLCBUIHkgPSAwLjApIDoKCQl4KHgpLAoJCXkoeSkKCXsKCgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCXN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QKCXsKCQljaGFyIGJ1ZmZlclsyNTVdOwoJCXNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiVmVjdG9yMlslKy4yZiAlKy4yZl0iLCB4LCB5KTsKCQlyZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyKTsKCX0KCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJVCBvcGVyYXRvcltdKGludCBpKSBjb25zdAoJewoJCXJldHVybiAoJngpW2ldOwoJfQoKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglUICYgb3BlcmF0b3JbXShpbnQgaSkKCXsKCQlyZXR1cm4gKCZ4KVtpXTsKCX0KCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3RvcjI8VD4gJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKCYqdGhpcyA9PSAmb3RoZXIpIHx8ICh4ID09IG90aGVyLnggJiYgeSA9PSBvdGhlci55KTsKCX0KCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZlY3RvcjI8VD4gJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IrPShjb25zdCBWZWN0b3IyPFQ+ICYgb3RoZXIpCgl7CgkJeCArPSBvdGhlci54OwoJCXkgKz0gb3RoZXIueTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IrPShjb25zdCBUIGYpCgl7CgkJeCArPSBmOwoJCXkgKz0gZjsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3ItPShjb25zdCBWZWN0b3IyPFQ+ICYgb3RoZXIpCgl7CgkJeCAtPSBvdGhlci54OwoJCXkgLT0gb3RoZXIueTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3ItPShjb25zdCBUIGYpCgl7CgkJeCAtPSBmOwoJCXkgLT0gZjsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IqPShjb25zdCBWZWN0b3IyPFQ+ICYgb3RoZXIpCgl7CgkJeCAqPSBvdGhlci54OwoJCXkgKj0gb3RoZXIueTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IqPShjb25zdCBUIGYpCgl7CgkJeCAqPSBmOwoJCXkgKj0gZjsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IvPShjb25zdCBWZWN0b3IyPFQ+ICYgb3RoZXIpCgl7CgkJeCAvPSBvdGhlci54OwoJCXkgLz0gb3RoZXIueTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IvPShjb25zdCBUIGYpCgl7CgkJeCAvPSBmOwoJCXkgLz0gZjsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IrKGNvbnN0IFZlY3RvcjI8VD4gJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKHggKyBvdGhlci54LCB5ICsgb3RoZXIueSk7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IrKGNvbnN0IFQgZikgY29uc3QKCXsKCQlyZXR1cm4gKHggKyBmLCB5ICsgZik7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3ItKGNvbnN0IFZlY3RvcjI8VD4gJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKHggLSBvdGhlci54LCB5IC0gb3RoZXIueSk7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3ItKGNvbnN0IFQgZikgY29uc3QKCXsKCQlyZXR1cm4gKHggLSBmLCB5IC0gZik7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IqKGNvbnN0IFZlY3RvcjI8VD4gJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKHggKiBvdGhlci54LCB5ICogb3RoZXIueSk7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IqKGNvbnN0IFQgZikgY29uc3QKCXsKCQlyZXR1cm4gKHggKiBmLCB5ICogZik7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IvKGNvbnN0IFZlY3RvcjI8VD4gJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKHggLyBvdGhlci54LCB5IC8gb3RoZXIueSk7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCVZlY3RvcjIgb3BlcmF0b3IvKGNvbnN0IFQgZikgY29uc3QKCXsKCQlyZXR1cm4gKHggLyBmLCB5IC8gZik7Cgl9Cgp9OwoKI2VuZGlmIC8vIFZFQ1RPUjJfSA==