00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_CORE_POINT2D_HH
00029 # define OLENA_CORE_POINT2D_HH
00030
00031 # include <oln/core/coord.hh>
00032 # include <oln/core/point1d.hh>
00033 # include <iostream>
00034 namespace oln {
00035
00036
00037 class dpoint2d;
00038 class point2d;
00039
00045 template<>
00046 struct point_traits<point2d>: public point_traits<abstract::point<point2d> >
00047 {
00048 enum { dim = 2 };
00049 typedef dpoint2d dpoint_type;
00050 };
00051
00063 class point2d : public abstract::point<point2d >
00064 {
00065 public:
00066
00067 typedef abstract::point< point2d > super_type;
00068 typedef point_traits<point2d>::dpoint_type dpoint_type;
00069
00070 friend class abstract::point< point2d >;
00071
00072 point2d();
00073
00075
00076 point2d(coord row, coord col);
00077
00079
00080 point2d(const point1d& p, coord col);
00081
00083
00084 coord
00085 row() const;
00086
00088
00089 coord&
00090 row();
00091
00093
00094 coord
00095 col() const;
00096
00098
00099 coord&
00100 col();
00101
00102 static std::string
00103 name()
00104 {
00105 return "point2d";
00106 }
00107
00108 protected:
00109
00114 point2d
00115 plus_dp(const dpoint2d& dp) const;
00116
00121 point2d
00122 minus_dp(const dpoint2d& dp) const;
00123
00128 point2d&
00129 plus_assign_dp(const dpoint2d& dp);
00130
00135 point2d&
00136 minus_assign_dp(const dpoint2d& dp);
00137
00142 dpoint2d
00143 minus_p(const point2d& p) const;
00144
00149 point2d
00150 minus() const;
00151
00152 };
00153
00154 namespace internal
00155 {
00156
00162 template<>
00163 struct default_less<point2d> :
00164 public default_less<point2d::super_type>
00165 {};
00166 }
00167
00168 }
00169
00171
00172 inline std::ostream&
00173 operator<<(std::ostream& o, const oln::point2d& p);
00174
00175 # include <oln/core/point2d.hxx>
00176
00177 #endif // ! OLENA_CORE_POINT2D_HH