1 /////////////////////////////////////////////////////////////////////////////// 2 // rolling_sum.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_SUM_HPP_EAN_26_12_2008 9 #define BOOST_ACCUMULATORS_STATISTICS_ROLLING_SUM_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 namespace impl 23 { 24 /////////////////////////////////////////////////////////////////////////////// 25 // rolling_sum_impl 26 // returns the sum of the samples in the rolling window 27 template<typename Sample> 28 struct rolling_sum_impl 29 : accumulator_base 30 { 31 typedef Sample result_type; 32 33 template<typename Args> rolling_sum_implboost::accumulators::impl::rolling_sum_impl34 rolling_sum_impl(Args const &args) 35 : sum_(args[sample | Sample()]) 36 {} 37 38 template<typename Args> operator ()boost::accumulators::impl::rolling_sum_impl39 void operator ()(Args const &args) 40 { 41 if(is_rolling_window_plus1_full(args)) 42 { 43 this->sum_ -= rolling_window_plus1(args).front(); 44 } 45 this->sum_ += args[sample]; 46 } 47 48 template<typename Args> resultboost::accumulators::impl::rolling_sum_impl49 result_type result(Args const & /*args*/) const 50 { 51 return this->sum_; 52 } 53 54 // make this accumulator serializeable 55 template<class Archive> serializeboost::accumulators::impl::rolling_sum_impl56 void serialize(Archive & ar, const unsigned int file_version) 57 { 58 ar & sum_; 59 } 60 61 private: 62 Sample sum_; 63 }; 64 } // namespace impl 65 66 /////////////////////////////////////////////////////////////////////////////// 67 // tag::rolling_sum 68 // 69 namespace tag 70 { 71 struct rolling_sum 72 : depends_on< rolling_window_plus1 > 73 { 74 /// INTERNAL ONLY 75 /// 76 typedef accumulators::impl::rolling_sum_impl< mpl::_1 > impl; 77 78 #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED 79 /// tag::rolling_window::window_size named parameter 80 static boost::parameter::keyword<tag::rolling_window_size> const window_size; 81 #endif 82 }; 83 } // namespace tag 84 85 /////////////////////////////////////////////////////////////////////////////// 86 // extract::rolling_sum 87 // 88 namespace extract 89 { 90 extractor<tag::rolling_sum> const rolling_sum = {}; 91 92 BOOST_ACCUMULATORS_IGNORE_GLOBAL(rolling_sum) 93 } 94 95 using extract::rolling_sum; 96 }} // namespace boost::accumulators 97 98 #endif 99