Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // sum.hpp Chris@16: // Chris@16: // Copyright 2005 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_SUM_HPP_EAN_28_10_2005 Chris@16: #define BOOST_ACCUMULATORS_STATISTICS_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: #include Chris@16: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // sum_impl Chris@16: template Chris@16: struct sum_impl Chris@16: : accumulator_base Chris@16: { Chris@16: // for boost::result_of Chris@16: typedef Sample result_type; Chris@16: Chris@16: template Chris@16: sum_impl(Args const &args) Chris@16: : sum(args[parameter::keyword::get() | Sample()]) 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->sum += args[parameter::keyword::get()]; Chris@16: } Chris@16: Chris@16: result_type result(dont_care) const Chris@16: { Chris@16: return this->sum; Chris@16: } Chris@16: Chris@16: private: Chris@16: Chris@16: Sample sum; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::sum Chris@16: // tag::sum_of_weights Chris@16: // tag::sum_of_variates Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: struct sum Chris@16: : depends_on<> Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::sum_impl impl; Chris@16: }; Chris@16: Chris@16: struct sum_of_weights Chris@16: : depends_on<> Chris@16: { Chris@16: typedef mpl::true_ is_weight_accumulator; Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::sum_impl impl; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct sum_of_variates Chris@16: : depends_on<> Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef mpl::always > impl; Chris@16: }; Chris@16: Chris@16: struct abstract_sum_of_variates Chris@16: : depends_on<> Chris@16: { Chris@16: }; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::sum Chris@16: // extract::sum_of_weights Chris@16: // extract::sum_of_variates Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: extractor const sum = {}; Chris@16: extractor const sum_of_weights = {}; Chris@16: extractor const sum_of_variates = {}; Chris@16: Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(sum) Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(sum_of_weights) Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(sum_of_variates) Chris@16: } Chris@16: Chris@16: using extract::sum; Chris@16: using extract::sum_of_weights; Chris@16: using extract::sum_of_variates; Chris@16: Chris@16: // So that mean can be automatically substituted with Chris@16: // weighted_mean when the weight parameter is non-void. Chris@16: template<> Chris@16: struct as_weighted_feature Chris@16: { Chris@16: typedef tag::weighted_sum type; Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct feature_of Chris@16: : feature_of Chris@16: {}; 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