/*
 * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef POPPLER_RECTANGLE_H
#define POPPLER_RECTANGLE_H

#include "poppler-global.h"

namespace poppler {

template<typename T>
class rectangle
{
public:
    rectangle() : x1(), y1(), x2(), y2() { }
    rectangle(T _x, T _y, T w, T h) : x1(_x), y1(_y), x2(x1 + w), y2(y1 + h) { }
    ~rectangle() { }

    bool is_empty() const { return (x1 == x2) && (y1 == y2); }

    T x() const { return x1; }

    T y() const { return y1; }

    T width() const { return x2 - x1; }

    T height() const { return y2 - y1; }

    T left() const { return x1; }
    T top() const { return y1; }
    T right() const { return x2; }
    T bottom() const { return y2; }

    void set_left(T value) { x1 = value; }
    void set_top(T value) { y1 = value; }
    void set_right(T value) { x2 = value; }
    void set_bottom(T value) { y2 = value; }

private:
    T x1, y1, x2, y2;
};

typedef rectangle<int> rect;
typedef rectangle<double> rectf;

POPPLER_CPP_EXPORT std::ostream &operator<<(std::ostream &stream, const rect &r);
POPPLER_CPP_EXPORT std::ostream &operator<<(std::ostream &stream, const rectf &r);

}

#endif
