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_W_WINDOW_HH
00029 # define OLENA_CORE_ABSTRACT_W_WINDOW_HH
00030
00031 # include <oln/core/abstract/struct_elt.hh>
00032 # include <oln/core/abstract/dpoint.hh>
00033
00034 namespace oln {
00035
00036 namespace abstract {
00037 template<class Exact>
00038 struct w_window;
00039
00040 }
00041
00045 template<class Exact>
00046 struct struct_elt_traits<abstract::w_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 w_window : public struct_elt< Exact >
00063 {
00064 typedef Exact exact_type;
00065 typedef struct_elt<Exact> super_type;
00066
00072 typedef typename struct_elt_traits<Exact>::dpoint_type dpoint_type;
00073
00074 typedef typename struct_elt_traits<Exact>::weight_type weight_type;
00076 friend class struct_elt<exact_type>;
00077
00079 static std::string
00080 name()
00081 {
00082 return std::string("w_window<") + Exact::name() + ">";
00083 }
00084
00093 exact_type&
00094 add(const abstract::dpoint<dpoint_type>& dp, const weight_type& w = 1)
00095 {
00096 return this->exact().add_(dp.exact(), w);
00097 }
00098
00104 weight_type
00105 w(unsigned i) const
00106 {
00107 return this->exact().get_weight(i);
00108 }
00109
00117 const weight_type&
00118 set(const abstract::dpoint<dpoint_type>& dp,
00119 const weight_type& weight)
00120 {
00121 return this->exact().set_(dp.exact(), weight);
00122 }
00123
00124 protected:
00125
00133 exact_type&
00134 add_dp(const abstract::dpoint<dpoint_type>& dp)
00135 {
00136 return this->add(dp.exact(), 1);
00137 }
00138
00139 protected:
00140
00144 w_window() : super_type()
00145 {}
00146
00147 };
00148
00149 }
00150
00151
00155 template<class E>
00156 inline E
00157 inter(const abstract::w_window<E>& lhs, const abstract::w_window<E>& rhs)
00158 {
00159 E win;
00160 for (unsigned i = 0; i < lhs.card(); ++i)
00161 if (rhs.has(lhs.dp(i)))
00162 win.add(lhs.dp(i));
00163 for (unsigned j = 0; j < rhs.card(); ++j)
00164 if (! win.has(rhs.dp(j)) && lhs.has(rhs.dp(j)))
00165 win.add(rhs.dp(j));
00166 return win;
00167 }
00168
00172 template<class E>
00173 inline E
00174 uni(const abstract::w_window<E>& lhs, const abstract::w_window<E>& rhs)
00175 {
00176 E win;
00177 for (unsigned i = 0; i < lhs.card(); ++i)
00178 win.add(lhs.dp(i));
00179 for (unsigned j = 0; j < rhs.card(); ++j)
00180 if (! win.has(rhs.dp(j)))
00181 win.add(rhs.dp(j));
00182 return win;
00183 }
00184
00185
00186 }
00187
00188 #endif // ! OLENA_CORE_ABSTRACT_W_WINDOW_HH