1 ///////////////////////////////////////////////////////////////////////////////
2 // rolling_count.hpp
3 //
4 // Copyright 2008 Eric Niebler. Distributed under the Boost
5 // Software License, Version 1.0. (See accompanying file
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 
8 #ifndef BOOST_ACCUMULATORS_STATISTICS_ROLLING_COUNT_HPP_EAN_26_12_2008
9 #define BOOST_ACCUMULATORS_STATISTICS_ROLLING_COUNT_HPP_EAN_26_12_2008
10 
11 #include <boost/mpl/placeholders.hpp>
12 #include <boost/accumulators/framework/accumulator_base.hpp>
13 #include <boost/accumulators/framework/extractor.hpp>
14 #include <boost/accumulators/numeric/functional.hpp>
15 #include <boost/accumulators/framework/parameters/sample.hpp>
16 #include <boost/accumulators/framework/depends_on.hpp>
17 #include <boost/accumulators/statistics_fwd.hpp>
18 #include <boost/accumulators/statistics/rolling_window.hpp>
19 
20 namespace boost { namespace accumulators
21 {
22 
23 namespace impl
24 {
25 
26     ///////////////////////////////////////////////////////////////////////////////
27     // rolling_count_impl
28     //    returns the count of elements in the rolling window
29     template<typename Sample>
30     struct rolling_count_impl
31       : accumulator_base
32     {
33         typedef std::size_t result_type;
34 
rolling_count_implboost::accumulators::impl::rolling_count_impl35         rolling_count_impl(dont_care)
36         {}
37 
38         template<typename Args>
resultboost::accumulators::impl::rolling_count_impl39         result_type result(Args const &args) const
40         {
41             return static_cast<std::size_t>(rolling_window_plus1(args).size()) - is_rolling_window_plus1_full(args);
42         }
43 
44         // serialization is done by accumulators it depends on
45         template<class Archive>
serializeboost::accumulators::impl::rolling_count_impl46         void serialize(Archive & ar, const unsigned int file_version) {}
47     };
48 
49 } // namespace impl
50 
51 ///////////////////////////////////////////////////////////////////////////////
52 // tag::rolling_count
53 //
54 namespace tag
55 {
56     struct rolling_count
57       : depends_on< rolling_window_plus1 >
58     {
59         /// INTERNAL ONLY
60         ///
61         typedef accumulators::impl::rolling_count_impl< mpl::_1 > impl;
62 
63         #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED
64         /// tag::rolling_window::window_size named parameter
65         static boost::parameter::keyword<tag::rolling_window_size> const window_size;
66         #endif
67     };
68 } // namespace tag
69 
70 ///////////////////////////////////////////////////////////////////////////////
71 // extract::rolling_count
72 //
73 namespace extract
74 {
75     extractor<tag::rolling_count> const rolling_count = {};
76 
77     BOOST_ACCUMULATORS_IGNORE_GLOBAL(rolling_count)
78 }
79 
80 using extract::rolling_count;
81 
82 }} // namespace boost::accumulators
83 
84 #endif
85