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_ABSTRACT_WINDOW_HH
00029 # define OLENA_CORE_ABSTRACT_WINDOW_HH
00030
00031 # include <oln/core/abstract/struct_elt.hh>
00032 # include <oln/core/winneighb.hh>
00033 # include <oln/core/abstract/dpoint.hh>
00034
00035 namespace oln {
00036
00037 namespace abstract {
00038 template<class Exact>
00039 struct window;
00040 }
00041
00045 template<class Exact>
00046 struct struct_elt_traits<abstract::window<Exact> > : public
00047 struct_elt_traits< abstract::struct_elt<Exact> >
00048 {
00049
00050 };
00051
00052 namespace abstract
00053 {
00054
00061 template<class Exact>
00062 struct window : public struct_elt<Exact>
00063 {
00064 typedef struct_elt<Exact> super_type;
00065 typedef Exact exact_type;
00066
00072 typedef typename struct_elt_traits<Exact>::dpoint_type dpoint_type;
00073
00074 friend class struct_elt<exact_type>;
00075
00077 static std::string
00078 name()
00079 {
00080 return std::string("window<") + Exact::name() + ">";
00081 }
00082
00083 protected:
00084
00090 exact_type&
00091 add_dp(const abstract::dpoint<dpoint_type>& dp)
00092 {
00093 return this->exact().add_(dp.exact());
00094 }
00095
00099 window() : super_type()
00100 {}
00101
00102 };
00103
00104 }
00105
00109 template<class E>
00110 inline E
00111 inter(const abstract::window<E>& lhs, const abstract::window<E>& rhs)
00112 {
00113 E win;
00114 for (unsigned i = 0; i < lhs.card(); ++i)
00115 if (rhs.has(lhs.dp(i)))
00116 win.add(lhs.dp(i));
00117 for (unsigned j = 0; j < rhs.card(); ++j)
00118 if (! win.has(rhs.dp(j)) && lhs.has(rhs.dp(j)))
00119 win.add(rhs.dp(j));
00120 return win;
00121 }
00122
00126 template<class E>
00127 inline E
00128 uni(const abstract::window<E>& lhs, const abstract::window<E>& rhs)
00129 {
00130 E win;
00131 for (unsigned i = 0; i < lhs.card(); ++i)
00132 win.add(lhs.dp(i));
00133 for (unsigned j = 0; j < rhs.card(); ++j)
00134 if (! win.has(rhs.dp(j)))
00135 win.add(rhs.dp(j));
00136 return win;
00137 }
00138
00139
00140 }
00141
00142 #endif // ! OLENA_CORE_ABSTRACT_WINDOW_HH