Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // weighted_sum.hpp Chris@16: // Chris@16: // Copyright 2006 Eric Niebler, Olivier Gygi. 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_WEIGHTED_SUM_HPP_EAN_28_10_2005 Chris@16: #define BOOST_ACCUMULATORS_STATISTICS_WEIGHTED_SUM_HPP_EAN_28_10_2005 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: #include Chris@16: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // weighted_sum_impl Chris@16: template Chris@16: struct weighted_sum_impl Chris@16: : accumulator_base Chris@16: { Chris@16: typedef typename numeric::functional::multiplies::result_type weighted_sample; Chris@16: Chris@16: // for boost::result_of Chris@16: typedef weighted_sample result_type; Chris@16: Chris@16: template Chris@16: weighted_sum_impl(Args const &args) Chris@16: : weighted_sum_( Chris@16: args[parameter::keyword::get() | Sample()] Chris@16: * numeric::one::value Chris@16: ) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: void operator ()(Args const &args) Chris@16: { Chris@16: // what about overflow? Chris@16: this->weighted_sum_ += args[parameter::keyword::get()] * args[weight]; Chris@16: } Chris@16: Chris@16: result_type result(dont_care) const Chris@16: { Chris@16: return this->weighted_sum_; Chris@16: } Chris@16: Chris@16: private: Chris@16: Chris@16: weighted_sample weighted_sum_; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::weighted_sum Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: struct weighted_sum Chris@16: : depends_on<> Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::weighted_sum_impl impl; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct weighted_sum_of_variates Chris@16: : depends_on<> Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::weighted_sum_impl impl; Chris@16: }; Chris@16: Chris@16: struct abstract_weighted_sum_of_variates Chris@16: : depends_on<> Chris@16: { Chris@16: }; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::weighted_sum Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: extractor const weighted_sum = {}; Chris@16: extractor const weighted_sum_of_variates = {}; Chris@16: Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(weighted_sum) Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(weighted_sum_of_variates) Chris@16: } Chris@16: Chris@16: using extract::weighted_sum; Chris@16: using extract::weighted_sum_of_variates; Chris@16: Chris@16: template Chris@16: struct feature_of > Chris@16: : feature_of Chris@16: { Chris@16: }; Chris@16: Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: #endif