namespace vtr {
    /*
     * Point
     */

    template<class T>
    Point<T>::Point(T x_val, T y_val) 
        : x_(x_val)
        , y_(y_val) {
        //pass
    }

    template<class T>
    T Point<T>::x() const {
        return x_;
    }

    template<class T>
    T Point<T>::y() const {
        return y_;
    }

    template<class T>
    bool operator==(Point<T> lhs, Point<T> rhs) {
        return lhs.x() == rhs.x()
            && lhs.y() == rhs.y();
    }

    template<class T>
    bool operator!=(Point<T> lhs, Point<T> rhs) {
        return !(lhs == rhs);
    }

    /*
     * Rect
     */
    template<class T>
    Rect<T>::Rect(T left_val, T bottom_val, T right_val, T top_val)
       : Rect<T>(Point<T>(left_val, bottom_val), Point<T>(right_val, top_val)) {
       //pass
    }

    template<class T>
    Rect<T>::Rect(Point<T> bottom_left_val, Point<T> top_right_val)
        : bottom_left_(bottom_left_val)
        , top_right_(top_right_val) {
        //pass
    }

    template<class T>
    T Rect<T>::xmin() const {
       return bottom_left_.x();
    }

    template<class T>
    T Rect<T>::xmax() const {
       return top_right_.x();
    }

    template<class T>
    T Rect<T>::ymin() const {
       return bottom_left_.y();
    }

    template<class T>
    T Rect<T>::ymax() const {
       return top_right_.y();
    }

    template<class T>
    Point<T> Rect<T>::bottom_left() const {
       return bottom_left_;
    }

    template<class T>
    Point<T> Rect<T>::top_right() const {
       return top_right_;
    }

    template<class T>
    T Rect<T>::width() const {
       return xmax() - xmin();
    }

    template<class T>
    T Rect<T>::height() const {
       return ymax() - ymin();
    }

    template<class T>
    bool Rect<T>::contains(Point<T> point) const {
       //Up-to but not including right or top edges
       return point.x() >= xmin() && point.x() < xmax()
           && point.y() >= ymin() && point.y() < ymax();
    }

    template<class T>
    bool Rect<T>::strictly_contains(Point<T> point) const {
       //Excluding edges
       return point.x() > xmin() && point.x() < xmax()
           && point.y() > ymin() && point.y() < ymax();
    }

    template<class T>
    bool Rect<T>::coincident(Point<T> point) const {
       //Including right or top edges
       return point.x() >= xmin() && point.x() <= xmax()
           && point.y() >= ymin() && point.y() <= ymax();
    }

    template<class T>
    bool operator==(const Rect<T>& lhs, const Rect<T>& rhs) {
        return lhs.bottom_left() == rhs.bottom_left()
            && lhs.top_right() == rhs.top_right();
    }

    template<class T>
    bool operator!=(const Rect<T>& lhs, const Rect<T>& rhs) {
        return !(lhs == rhs);
    }

    /*
     * Line
     */
    template<class T>
    Line<T>::Line(std::vector<Point<T>> line_points)
        : points_(line_points) {
        //pass
    }

    template<class T>
    Rect<T> Line<T>::bounding_box() const {
        T xmin = std::numeric_limits<T>::max();
        T ymin = std::numeric_limits<T>::max();
        T xmax = std::numeric_limits<T>::min();
        T ymax = std::numeric_limits<T>::min();

        for (const auto& point : points()) {
            xmin = std::min(xmin, point.x());
            ymin = std::min(ymin, point.y());
            xmax = std::max(xmax, point.x());
            ymax = std::max(ymax, point.y());
        }

        return Rect<T>(xmin, ymin, xmax, ymax);
    }

    template<class T>
    typename Line<T>::point_range Line<T>::points() const {
        return vtr::make_range(points_.begin(), points_.end());
    }

    /*
     * RectUnion
     */
    template<class T>
    RectUnion<T>::RectUnion(std::vector<Rect<T>> rectangles)
        : rects_(rectangles) {
        //pass
    }

    template<class T>
    Rect<T> RectUnion<T>::bounding_box() const {
        T xmin = std::numeric_limits<T>::max();
        T ymin = std::numeric_limits<T>::max();
        T xmax = std::numeric_limits<T>::min();
        T ymax = std::numeric_limits<T>::min();

        for (const auto& rect : rects_) {
            xmin = std::min(xmin, rect.xmin());
            ymin = std::min(ymin, rect.ymin());
            xmax = std::max(xmax, rect.xmax());
            ymax = std::max(ymax, rect.ymax());
        }

        return Rect<T>(xmin, ymin, xmax, ymax);
    }

    template<class T>
    bool RectUnion<T>::contains(Point<T> point) const {
        for(const auto& rect : rects()) {
            if (rect.contains(point)) {
                return true;
            }
        }
        return false;
    }

    template<class T>
    bool RectUnion<T>::strictly_contains(Point<T> point) const {
        for(const auto& rect : rects()) {
            if (rect.strictly_contains(point)) {
                return true;
            }
        }
        return false;
    }

    template<class T>
    bool RectUnion<T>::coincident(Point<T> point) const {
        for(const auto& rect : rects()) {
            if (rect.coincident(point)) {
                return true;
            }
        }
        return false;
    }

    template<class T>
    typename RectUnion<T>::rect_range RectUnion<T>::rects() const {
        return vtr::make_range(rects_.begin(), rects_.end());
    }

    template<class T>
    bool operator==(const RectUnion<T>& lhs, const RectUnion<T>& rhs) {
        //Currently checks for an identical *representation* (not whether the 
        //representations are equivalent)

        if (lhs.rects_.size() != rhs.rects_.size()) {
            return false;
        }

        for (size_t i = 0; i < lhs.rects_.size(); ++i) {
            if (lhs.rects_[i] != rhs.rects_[i]) {
                return false;
            }
        }

        return true;
    }

    template<class T>
    bool operator!=(const RectUnion<T>& lhs, const RectUnion<T>& rhs) {
        return !(lhs == rhs);
    }
} //namespace
