2D float scalar

// 2D float scalar.
class RVAPI S2f
{
public:
    // X coordinate.
    float x;

    // Y coordinate.
    float y;

    // Check if all coordinates are zero.
    bool operator ! () const { return !x && !y; }

    // Get scalar with negated coordnates.
    S2f operator - () const { return S2f(-x, -y); }

    // Get sum of scalars.
    S2f operator + (const S2f &scalar) const { return S2f(x + scalar.x, y + scalar.y); }

    // Get difference of scalars.
    S2f operator - (const S2f &scalar) const { return S2f(x - scalar.x, y - scalar.y); }

    // Get product of scalars.
    S2f operator * (const S2f &scalar) const { return S2f(x * scalar.x, y * scalar.y); }

    // Get division of scalars.
    S2f operator / (const S2f &scalar) const { return S2f(x / scalar.x, y / scalar.y); }

    // Add [scalar] to this scalar.
    S2f &operator += (const S2f &scalar) { return *this = *this + scalar; }

    // Subtract [scalar] from this scalar.
    S2f &operator -= (const S2f &scalar) { return *this = *this - scalar; }

    // Multiply [scalar] and this scalar.
    S2f &operator *= (const S2f &scalar) { return *this = *this * scalar; }

    // Divide [scalar] into this scalar.
    S2f &operator /= (const S2f &scalar) { return *this = *this / scalar; }

    // Get minimim of scalars.
    S2f Min(const S2f &scalar) const { return S2f(scalar.x < x ? scalar.x : x, scalar.y < y ? scalar.y : y); }

    // Get maximum of scalars.
    S2f Max(const S2f &scalar) const { return S2f(scalar.x > x ? scalar.x : x, scalar.y > y ? scalar.y : y); }

    // Construct scalar from S2i scalar.
    S2f(const S2i &scalar) : x((float)scalar.x), y((float)scalar.y) {}

    // Construct scalar from coordinates.
    S2f(float x, float y) : x(x), y(y) {}

    // Construct scalar from single value.
    S2f(float n = 0) : x(n), y(n) {}

    // Destructor.
    ~S2f() {}
};

inline S2i::S2i(const S2f &scalar) : x((int)scalar.x), y((int)scalar.y) {}