struct Point
{
public:
    int x;
    int y;

public:
	Point() : x(0), y(0) { }
    Point(int x, int y) : x(x), y(y) { }
    Point(const Point &point); //Copy constructor
	~Point() { }
	
    //A bunch of helper functions for assorted uses.
    //Some of it depends on another class (Rect), so I commented it all out.
    /*
        //Keeps the point within 'rect'.
        void KeepWithin(const Rect &rect);
        //Keeps the point outside of 'rect'.
        void KeepWithout(const Rect &rect);
        //Snaps the point to the nearest edge of 'rect', regardless of
        //whether the point is inside or outside the rectangle.
        void SnapToEdge(const Rect &rect);
        
        //Returns 'true' if 'value.x' is greater than 'min.x' and less than 'max.x', and the same for the 'y' member.
        static bool IsWithin(const Point &min, const Point &value, const Point &max);
        static bool IsWithin(const Point &value, const Point &max);
        //Keeps 'value.x' between 'min.x' and 'max.x', with 'loops.x' being the number of times it had to loop around.
        //Does the same with the 'y' member. Negative loops return a negative number.
        static Point LoopInRange(const Point &min, const Point &value, const Point &max, Point &loops);
        static Point LoopInRange(const Point &value, const Point &max, Point &loops);
    */
    
    bool operator==(const Point &other) const;
    bool operator!=(const Point &other) const;

    Point &operator=(const Point &other); //Assignment operator

    Point &operator+=(const Point &other);
    Point &operator-=(const Point &other);
    Point &operator*=(const Point &other);
    Point &operator/=(const Point &other);
    Point &operator%=(const Point &other);

    Point operator+(const Point &other) const;
    Point operator-(const Point &other) const;
    Point operator*(const Point &other) const;
    Point operator/(const Point &other) const;
    Point operator%(const Point &other) const;

    //Additive-inverse operator.
    Point operator-() const;

    //Some conversions you don't need:
    /*
        //Packs the Point into a Uint32, with 16 bits for x, and 16 for y. Since both x and y can be negative,
        //this leaves just 15 bits for the numeral component, meaning (-32768 to 32768) in both x and y.
        uint32_t ToUint32() const;
        void FromUint32(uint32_t data);
    
        //Format: "(x, y)"
        std::string ToString() const;
        void FromString(const std::string &str);
    
        SFML_ONLY
        (
            sf::Vector2f ToSfmlVector2f() const;
            void FromSfmlVector2f(sf::Vector2f vector);
        )
    
        QT_ONLY
        (
            QPoint ToQPoint() const;
            void FromQPoint(QPoint point);
        )
    */
};