count.hh 2.67 KB
Newer Older
1
2
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
// Copyright (C) 2007 EPITA Research and Development Laboratory
//
// 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.

Thierry Geraud's avatar
Thierry Geraud committed
28
29
#ifndef MLN_ACCU_COUNT_HH
# define MLN_ACCU_COUNT_HH
30

Thierry Geraud's avatar
Thierry Geraud committed
31
/*! \file mln/accu/count.hh
32
 *
33
 * \brief Define an accumulator that counts.
34
35
 */

36
37
# include <mln/core/concept/accumulator.hh>

38
39
40
41

namespace mln
{

42
  namespace accu
43
44
45
  {


46
47
48
    /*! Generic counter accumulator class.
     */
    template <typename V>
Thierry Geraud's avatar
Thierry Geraud committed
49
    struct count : public Accumulator< count<V> >
50
51
52
    {
      typedef V value;

Thierry Geraud's avatar
Thierry Geraud committed
53
      count();
54
55
56
57
58
      void take(const value&);
      void init();

      operator std::size_t() const;
      std::size_t to_value() const;
Thierry Geraud's avatar
Thierry Geraud committed
59
60
61

      count<V>& operator+=(const count<V>& rhs);

62
63
64
65
    protected:

      std::size_t count_;
    };
66
67
68
69
70



# ifndef MLN_INCLUDE_ONLY

71
    template <typename V>
Thierry Geraud's avatar
Thierry Geraud committed
72
    count<V>::count()
73
74
75
76
77
78
    {
      init();
    }

    template <typename V>
    void
Thierry Geraud's avatar
Thierry Geraud committed
79
    count<V>::take(const value&)
80
81
82
83
84
85
    {
      ++count_;
    }

    template <typename V>
    void
Thierry Geraud's avatar
Thierry Geraud committed
86
    count<V>::init()
87
88
89
90
91
    {
      count_ = 0;
    }

    template <typename V>
Thierry Geraud's avatar
Thierry Geraud committed
92
    count<V>::operator std::size_t() const
93
94
95
96
97
98
    {
      return to_value();
    }

    template <typename V>
    std::size_t
Thierry Geraud's avatar
Thierry Geraud committed
99
    count<V>::to_value() const
100
    {
101
      return count_;
102
103
    }

Thierry Geraud's avatar
Thierry Geraud committed
104
105
106
107
108
109
110
111
    template <typename V>
    count<V>&
    count<V>::operator+=(const count<V>& rhs)
    {
      count_ += rhs.count_;
      return *this;
    }

112
113
# endif // ! MLN_INCLUDE_ONLY

114
  } // end of namespace mln::accu
115
116
117
118

} // end of namespace mln


Thierry Geraud's avatar
Thierry Geraud committed
119
#endif // ! MLN_ACCU_COUNT_HH