trunk 20080912
[gitenigma.git] / include / lib / base / epoint.h
blobfc5f983670e253c850f7d25e0b4469137889f4d2
1 #ifndef EPOINT_H
2 #define EPOINT_H
4 #include <iostream>
6 #ifndef ABS
7 #define ABS(x) ( x>0 ? x : -x )
8 #endif
10 class ePoint
12 public:
13 ePoint();
14 ePoint( int xpos, int ypos );
16 bool isNull() const;
18 int x() const;
19 int y() const;
20 void setX( int x );
21 void setY( int y );
23 int manhattanLength() const;
25 int &rx();
26 int &ry();
28 ePoint &operator+=( const ePoint &p );
29 ePoint &operator-=( const ePoint &p );
30 ePoint &operator*=( int c );
31 ePoint &operator*=( double c );
32 ePoint &operator/=( int c );
33 ePoint &operator/=( double c );
35 friend inline bool operator==( const ePoint &, const ePoint & );
36 friend inline bool operator!=( const ePoint &, const ePoint & );
37 friend inline ePoint operator+( const ePoint &, const ePoint & );
38 friend inline ePoint operator-( const ePoint &, const ePoint & );
39 friend inline ePoint operator*( const ePoint &, int );
40 friend inline ePoint operator*( int, const ePoint & );
41 friend inline ePoint operator*( const ePoint &, double );
42 friend inline ePoint operator*( double, const ePoint & );
43 friend inline ePoint operator-( const ePoint & );
44 friend inline ePoint operator/( const ePoint &, int );
45 friend inline ePoint operator/( const ePoint &, double );
46 private:
47 int xp;
48 int yp;
52 inline int ePoint::manhattanLength() const
54 return ABS(x())+ABS(y());
58 /*****************************************************************************
59 ePoint stream functions
60 *****************************************************************************/
61 namespace std
63 inline ostream &operator<<( ostream & s, const ePoint & p )
65 s << p.x() << p.y();
66 return s;
69 inline istream &operator>>( istream & s, ePoint & p )
71 s >> p.rx() >> p.ry();
72 return s;
77 /*****************************************************************************
78 ePoint inline functions
79 *****************************************************************************/
81 inline ePoint::ePoint()
82 { xp=0; yp=0; }
84 inline ePoint::ePoint( int xpos, int ypos )
85 { xp=(int)xpos; yp=(int)ypos; }
87 inline bool ePoint::isNull() const
88 { return xp == 0 && yp == 0; }
90 inline int ePoint::x() const
91 { return xp; }
93 inline int ePoint::y() const
94 { return yp; }
96 inline void ePoint::setX( int x )
97 { xp = (int)x; }
99 inline void ePoint::setY( int y )
100 { yp = (int)y; }
102 inline int &ePoint::rx()
103 { return xp; }
105 inline int &ePoint::ry()
106 { return yp; }
108 inline ePoint &ePoint::operator+=( const ePoint &p )
109 { xp+=p.xp; yp+=p.yp; return *this; }
111 inline ePoint &ePoint::operator-=( const ePoint &p )
112 { xp-=p.xp; yp-=p.yp; return *this; }
114 inline ePoint &ePoint::operator*=( int c )
115 { xp*=(int)c; yp*=(int)c; return *this; }
117 inline ePoint &ePoint::operator*=( double c )
118 { xp=(int)(xp*c); yp=(int)(yp*c); return *this; }
120 inline bool operator==( const ePoint &p1, const ePoint &p2 )
121 { return p1.xp == p2.xp && p1.yp == p2.yp; }
123 inline bool operator!=( const ePoint &p1, const ePoint &p2 )
124 { return p1.xp != p2.xp || p1.yp != p2.yp; }
126 inline ePoint operator+( const ePoint &p1, const ePoint &p2 )
127 { return ePoint(p1.xp+p2.xp, p1.yp+p2.yp); }
129 inline ePoint operator-( const ePoint &p1, const ePoint &p2 )
130 { return ePoint(p1.xp-p2.xp, p1.yp-p2.yp); }
132 inline ePoint operator*( const ePoint &p, int c )
133 { return ePoint(p.xp*c, p.yp*c); }
135 inline ePoint operator*( int c, const ePoint &p )
136 { return ePoint(p.xp*c, p.yp*c); }
138 inline ePoint operator*( const ePoint &p, double c )
139 { return ePoint((int)(p.xp*c), (int)(p.yp*c)); }
141 inline ePoint operator*( double c, const ePoint &p )
142 { return ePoint((int)(p.xp*c), (int)(p.yp*c)); }
144 inline ePoint operator-( const ePoint &p )
145 { return ePoint(-p.xp, -p.yp); }
147 inline ePoint &ePoint::operator/=( int c )
149 xp/=(int)c;
150 yp/=(int)c;
151 return *this;
154 inline ePoint &ePoint::operator/=( double c )
156 xp=(int)(xp/c);
157 yp=(int)(yp/c);
158 return *this;
161 inline ePoint operator/( const ePoint &p, int c )
163 return ePoint(p.xp/c, p.yp/c);
166 inline ePoint operator/( const ePoint &p, double c )
168 return ePoint((int)(p.xp/c), (int)(p.yp/c));
172 #endif // EPOINT_H