Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // rolling_sum.hpp Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_ACCUMULATORS_STATISTICS_ROLLING_SUM_HPP_EAN_26_12_2008 Chris@16: #define BOOST_ACCUMULATORS_STATISTICS_ROLLING_SUM_HPP_EAN_26_12_2008 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // rolling_sum_impl Chris@16: // returns the sum of the samples in the rolling window Chris@16: template Chris@16: struct rolling_sum_impl Chris@16: : accumulator_base Chris@16: { Chris@16: typedef Sample result_type; Chris@16: Chris@16: template Chris@16: rolling_sum_impl(Args const &args) Chris@16: : sum_(args[sample | Sample()]) Chris@16: {} Chris@16: Chris@16: template Chris@16: void operator ()(Args const &args) Chris@16: { Chris@16: if(is_rolling_window_plus1_full(args)) Chris@16: { Chris@16: this->sum_ -= rolling_window_plus1(args).front(); Chris@16: } Chris@16: this->sum_ += args[sample]; Chris@16: } Chris@16: Chris@16: template Chris@101: result_type result(Args const & /*args*/) const Chris@16: { Chris@16: return this->sum_; Chris@16: } Chris@16: Chris@16: private: Chris@16: Sample sum_; Chris@16: }; Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::rolling_sum Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: struct rolling_sum Chris@16: : depends_on< rolling_window_plus1 > Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::rolling_sum_impl< mpl::_1 > impl; Chris@16: Chris@16: #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED Chris@16: /// tag::rolling_window::window_size named parameter Chris@16: static boost::parameter::keyword const window_size; Chris@16: #endif Chris@16: }; Chris@16: } // namespace tag Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::rolling_sum Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: extractor const rolling_sum = {}; Chris@16: Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(rolling_sum) Chris@16: } Chris@16: Chris@16: using extract::rolling_sum; Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: #endif