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 #ifndef MLN_ACCU_LABEL_USED_HH
00027 # define MLN_ACCU_LABEL_USED_HH
00028
00032
00033 # include <mln/accu/internal/base.hh>
00034 # include <mln/core/concept/meta_accumulator.hh>
00035 # include <mln/math/max.hh>
00036 # include <mln/fun/i2v/array.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace accu
00043 {
00044
00049
00050 template <typename L>
00051 struct label_used : public mln::accu::internal::base< const fun::i2v::array<bool>& , label_used<L> >
00052 {
00053 typedef L argument;
00054
00055 label_used();
00056
00058 void init();
00059
00062 void take(const argument&);
00063 void take(const label_used<L>& other);
00065
00067 const fun::i2v::array<bool>& to_result() const;
00068
00071 bool is_valid() const;
00072
00073 protected:
00075 fun::i2v::array<bool> label_used_;
00076 };
00077
00078
00079 namespace meta
00080 {
00081
00083 struct label_used : public Meta_Accumulator< label_used >
00084 {
00085 template <typename L>
00086 struct with
00087 {
00088 typedef accu::label_used<L> ret;
00089 };
00090 };
00091
00092 }
00093
00094
00095
00096 # ifndef MLN_INCLUDE_ONLY
00097
00098 template <typename L>
00099 inline
00100 label_used<L>::label_used()
00101 {
00102 init();
00103 }
00104
00105 template <typename L>
00106 inline
00107 void
00108 label_used<L>::init()
00109 {
00110 label_used_.resize(1, true);
00111 }
00112
00113 template <typename L>
00114 inline
00115 void
00116 label_used<L>::take(const argument& l)
00117 {
00118 if (label_used_.size() <= l)
00119 label_used_.resize(l.next(), false);
00120
00121 label_used_(l) = true;
00122 }
00123
00124 template <typename L>
00125 inline
00126 void
00127 label_used<L>::take(const label_used<L>& other)
00128 {
00129 unsigned
00130 max_size = mln::math::max(other.to_result().size(), label_used_.size());
00131
00132 label_used_.resize(max_size, false);
00133 for (unsigned i = 1; i < label_used_.size(); ++i)
00134 label_used_(i) = label_used_(i) || other.to_result()(i);
00135 }
00136
00137 template <typename L>
00138 inline
00139 const fun::i2v::array<bool>&
00140 label_used<L>::to_result() const
00141 {
00142 return label_used_;
00143 }
00144
00145 template <typename L>
00146 inline
00147 bool
00148 label_used<L>::is_valid() const
00149 {
00150 return true;
00151 }
00152
00153 # endif // ! MLN_INCLUDE_ONLY
00154
00155 }
00156
00157 }
00158
00159
00160 #endif // ! MLN_ACCU_LABEL_USED_HH