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_MORPHO_ATTRIBUTE_COUNT_ADJACENT_VERTICES_HH
00027 # define MLN_MORPHO_ATTRIBUTE_COUNT_ADJACENT_VERTICES_HH
00028
00035
00036 # include <mln/pw/internal/image_base.hh>
00037 # include <mln/accu/internal/base.hh>
00038 # include <mln/pw/image.hh>
00039 # include <mln/util/pix.hh>
00040 # include <mln/util/graph_ids.hh>
00041
00042 namespace mln
00043 {
00044
00045
00046 namespace morpho {
00047 namespace attribute {
00048 template <typename I>
00049 struct count_adjacent_vertices;
00050 }
00051 }
00052
00053
00054
00055
00056 namespace trait
00057 {
00058
00059 template <typename I>
00060 struct accumulator_< morpho::attribute::count_adjacent_vertices<I> >
00061 {
00062 typedef accumulator::has_untake::no has_untake;
00063 typedef accumulator::has_set_value::no has_set_value;
00064 typedef accumulator::has_stop::no has_stop;
00065 typedef accumulator::when_pix::use_p when_pix;
00066 };
00067
00068 }
00069
00070
00071 namespace morpho
00072 {
00073
00074 namespace attribute
00075 {
00076
00081
00082 template <typename I>
00083 struct count_adjacent_vertices
00084 : public accu::internal::base< unsigned ,
00085 count_adjacent_vertices<I> >
00086 {
00087 typedef mln_psite(I) argument;
00088
00089 count_adjacent_vertices();
00090
00093 void init();
00094
00095 void take(const argument& px);
00096 void take(const count_adjacent_vertices<I>& other);
00097
00098 void take_as_init_(const argument& px);
00100
00102 unsigned to_result() const;
00103
00105 bool is_valid() const;
00106
00107
00108 protected:
00110 void update_ ();
00111
00113 unsigned count__;
00115 std::set<util::vertex_id_t> vertices_;
00116 };
00117
00118
00119
00120 # ifndef MLN_INCLUDE_ONLY
00121
00122 template <typename I>
00123 inline
00124 count_adjacent_vertices<I>::count_adjacent_vertices()
00125 {
00126 init();
00127 }
00128
00129 template <typename I>
00130 inline
00131 void
00132 count_adjacent_vertices<I>::init()
00133 {
00134 vertices_.clear();
00135 update_();
00136 }
00137
00138 template <typename I>
00139 inline
00140 void
00141 count_adjacent_vertices<I>::take(const argument& p)
00142 {
00143 vertices_.insert(p.v1());
00144 vertices_.insert(p.v2());
00145 update_();
00146 }
00147
00148 template <typename I>
00149 inline
00150 void
00151 count_adjacent_vertices<I>::take(const count_adjacent_vertices<I>& other)
00152 {
00153 vertices_.insert (other.vertices_.begin(), other.vertices_.end());
00154 update_();
00155 }
00156
00157 template <typename I>
00158 inline
00159 void
00160 count_adjacent_vertices<I>::take_as_init_(const argument& px)
00161 {
00162 vertices_.clear();
00163 take(px);
00164 }
00165
00166 template <typename I>
00167 inline
00168 unsigned
00169 count_adjacent_vertices<I>::to_result() const
00170 {
00171 return count__;
00172 }
00173
00174 template <typename I>
00175 inline
00176 void
00177 count_adjacent_vertices<I>::update_()
00178 {
00179 count__ = vertices_.size();
00180 }
00181
00182 template <typename I>
00183 inline
00184 bool
00185 count_adjacent_vertices<I>::is_valid() const
00186 {
00187 return true;
00188 }
00189
00190
00191 # endif // ! MLN_INCLUDE_ONLY
00192
00193 }
00194
00195 }
00196
00197 }
00198
00199 #endif // ! MLN_MORPHO_ATTRIBUTE_COUNT_ADJACENT_VERTICES_HH