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