count_adjacent_vertices.hh 4.74 KB
Newer Older
Matthieu Garrigues's avatar
Matthieu Garrigues committed
1
2
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
// (LRDE)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//
// This file is part of the Olena Library.  This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License version 2 as published by the
// Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this library; see the file COPYING.  If not, write to
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
// Boston, MA 02111-1307, USA.
//
// As a special exception, you may use this file as part of a free
// software library without restriction.  Specifically, if other files
// instantiate templates or use macros or inline functions from this
// file, or you compile this file and link it with other files to
// produce an executable, this file does not by itself cause the
// resulting executable to be covered by the GNU General Public
// License.  This exception does not however invalidate any other
// reasons why the executable file might be covered by the GNU General
// Public License.

#ifndef MLN_ACCU_COUNT_ADJACENT_VERTICES_HH
# define MLN_ACCU_COUNT_ADJACENT_VERTICES_HH

/// \file mln/accu/count_adjacent_vertices.hh
Guillaume Lazzara's avatar
Guillaume Lazzara committed
33
/// Define an accumulator that counts the vertices adjacent to a
34
35
36
37
/// set of line graph psite.

# include <mln/accu/internal/base.hh>
# include <mln/core/concept/meta_accumulator.hh>
38
# include <mln/core/image/line_graph_image.hh>
39
40
41
42
43
44
45
46
# include <mln/util/pix.hh>

namespace mln
{

  namespace accu
  {

Guillaume Lazzara's avatar
Guillaume Lazzara committed
47
    /// Accumulator class counting the number of vertices
48
49
50
51
52
    /// adjacent to a set of mln::line_graph_psite (i.e., a set of
    /// edges).
    ///
    /// The type to be count is mln::util::pix< mln::line_graph_image<P, V> >
    /// where \p P and \p V are the parameters of this class.
53
54
55
    ///
    /// This accumulator is used by mln::closing_area_on_vertices and
    /// mln::opening_area_on_vertices.
56
    template <typename P, typename V>
57
    struct count_adjacent_vertices
Ugo Jardonnet's avatar
Ugo Jardonnet committed
58
      : public mln::accu::internal::base< unsigned,
59
					  count_adjacent_vertices<P, V> >
60
61
62
    {
      typedef mln::util::pix< mln::line_graph_image<P, V> > argument;

63
      count_adjacent_vertices();
64
65
66
67
68

      /// Manipulators.
      /// \{
      void init();
      void take(const argument& arg);
69
      void take(const count_adjacent_vertices<P, V>& other);
70

71
      /// Force the value of the counter to \a c.
Ugo Jardonnet's avatar
Ugo Jardonnet committed
72
      void set_value(unsigned c);
73
74
75
      /// \}

      /// Get the value of the accumulator.
Ugo Jardonnet's avatar
Ugo Jardonnet committed
76
      unsigned to_result() const;
77
78
79
80
81
82
83

    protected:
      /// Update the value of the counter.
      void update_ ();

    protected:
      /// The value of the counter.
Ugo Jardonnet's avatar
Ugo Jardonnet committed
84
      unsigned count__;
85
      /// The set of adjacent vertices.
86
      std::set<util::vertex_id> vertices_;
87
88
89
    };


90
    namespace meta
91
    {
92

Guillaume Lazzara's avatar
Guillaume Lazzara committed
93
      /// Meta accumulator for count_adjacent_vertices.
94
95
      struct count_adjacent_vertices
	: public Meta_Accumulator< count_adjacent_vertices >
96
      {
97
98
99
100
101
	template <typename P, typename V>
	  struct with
	  {
	    typedef accu::count_adjacent_vertices<P, V> ret;
	  };
102
      };
103
104

    } // end of namespace mln::accu::meta
105
106
107
108
109
110


# ifndef MLN_INCLUDE_ONLY

    template <typename P, typename V>
    inline
111
    count_adjacent_vertices<P, V>::count_adjacent_vertices()
112
113
114
115
116
117
118
    {
      init();
    }

    template <typename P, typename V>
    inline
    void
119
    count_adjacent_vertices<P, V>::init()
120
121
122
123
124
125
126
127
    {
      vertices_.clear();
      update_();
    }

    template <typename P, typename V>
    inline
    void
128
    count_adjacent_vertices<P, V>::take(const argument& arg)
129
130
131
132
133
134
135
136
137
    {
      vertices_.insert(arg.p().first_id());
      vertices_.insert(arg.p().second_id());
      update_();
    }

    template <typename P, typename V>
    inline
    void
138
    count_adjacent_vertices<P, V>::take(const count_adjacent_vertices<P, V>& other)
139
140
141
142
143
144
145
    {
      vertices_.insert (other.vertices_.begin(), other.vertices_.end());
      update_();
    }

    template <typename P, typename V>
    inline
Ugo Jardonnet's avatar
Ugo Jardonnet committed
146
    unsigned
147
    count_adjacent_vertices<P, V>::to_result() const
148
149
150
151
152
153
154
    {
      return count__;
    }

    template <typename P, typename V>
    inline
    void
Ugo Jardonnet's avatar
Ugo Jardonnet committed
155
    count_adjacent_vertices<P, V>::set_value(unsigned c)
156
157
    {
      count__ = c;
158
159
      /// Reset the other member.
      vertices_.clear();
160
161
162
163
164
    }

    template <typename P, typename V>
    inline
    void
165
    count_adjacent_vertices<P, V>::update_()
166
167
168
169
170
171
172
173
174
175
176
177
    {
      count__ = vertices_.size();
    }

# endif // ! MLN_INCLUDE_ONLY

  } // end of namespace mln::accu

} // end of namespace mln


#endif // ! MLN_ACCU_COUNT_ADJACENT_VERTICES_HH