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_GRAPH_ATTRIBUTE_CARD_HH
00027 # define MLN_GRAPH_ATTRIBUTE_CARD_HH
00028
00033
00034
00035 # include <mln/core/concept/graph.hh>
00036 # include <mln/util/array.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace graph
00043 {
00044
00045 namespace attribute
00046 {
00047
00049 struct card_t;
00050
00052 extern card_t card;
00053
00054
00055 # ifndef MLN_INCLUDE_ONLY
00056
00061 struct card_t
00062 {
00064 typedef util::array<unsigned> result;
00065
00066 template <typename G>
00067 void init(const Graph<G>& g)
00068 {
00069 data.resize(0);
00070 deja_vu_.resize(exact(g).v_nmax());
00071 deja_vu_.fill(false);
00072 comp = 0;
00073 }
00074
00075 bool to_be_treated(unsigned id)
00076 { return !deja_vu_[id]; }
00077
00078 void new_component_from_vertex(unsigned id)
00079 {
00080 data.append(1);
00081 deja_vu_[id] = true;
00082 }
00083
00084 void process_vertex(unsigned)
00085 {}
00086
00087 bool to_be_queued(unsigned id)
00088 { return !deja_vu_[id]; }
00089
00090 void added_to_queue(unsigned id)
00091 {
00092 deja_vu_[id] = true;
00093 ++data[comp];
00094 }
00095
00096 void next_component()
00097 { ++comp; }
00098
00099 void final()
00100 {}
00101
00102 unsigned comp;
00103 util::array<bool> deja_vu_;
00104 util::array<unsigned> data;
00105 };
00106
00107 card_t card;
00108
00109 # endif // ! MLN_INCLUDE_ONLY
00110
00111
00112 }
00113
00114 }
00115
00116 }
00117
00118
00119 #endif // ! MLN_GRAPH_ATTRIBUTE_CARD_HH