Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tail_variate.hpp Chris@16: // Chris@16: // Copyright 2005 Eric Niebler, Michael Gauckler. 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_STAT_STATISTICS_TAIL_VARIATE_HPP_EAN_28_10_2005 Chris@16: #define BOOST_STAT_STATISTICS_TAIL_VARIATE_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: // tail_variate_impl Chris@16: template Chris@16: struct tail_variate_impl Chris@16: : accumulator_base Chris@16: { Chris@16: // for boost::result_of Chris@16: typedef Chris@16: typename detail::tail_range< Chris@16: typename std::vector::const_iterator Chris@16: , std::vector::iterator Chris@16: >::type Chris@16: result_type; Chris@16: Chris@16: template Chris@16: tail_variate_impl(Args const &args) Chris@16: : variates(args[tag::tail::cache_size], args[parameter::keyword::get() | VariateType()]) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: void assign(Args const &args, std::size_t index) Chris@16: { Chris@16: this->variates[index] = args[parameter::keyword::get()]; Chris@16: } Chris@16: Chris@16: template Chris@16: result_type result(Args const &args) const Chris@16: { Chris@16: // getting the order result causes the indices vector to be sorted. Chris@16: extractor > const some_tail = {}; Chris@16: return this->do_result(some_tail(args)); Chris@16: } Chris@16: Chris@16: private: Chris@16: template Chris@16: result_type do_result(TailRng const &rng) const Chris@16: { Chris@16: return detail::make_tail_range( Chris@16: this->variates.begin() Chris@16: , rng.end().base().base() // the index iterator Chris@16: , rng.begin().base().base() // (begin and end reversed because these are reverse iterators) Chris@16: ); Chris@16: } Chris@16: Chris@16: std::vector variates; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::tail_variate<> Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: template Chris@16: struct tail_variate 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_tail_variate Chris@16: : depends_on<> Chris@16: { Chris@16: }; Chris@16: Chris@16: template Chris@16: struct tail_weights Chris@16: : depends_on > Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::tail_variate_impl impl; Chris@16: }; Chris@16: Chris@16: struct abstract_tail_weights Chris@16: : depends_on<> Chris@16: { Chris@16: }; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::tail_variate Chris@16: // extract::tail_weights Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: extractor const tail_variate = {}; Chris@16: extractor const tail_weights = {}; Chris@16: Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(tail_variate) Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(tail_weights) Chris@16: } Chris@16: Chris@16: using extract::tail_variate; Chris@16: using extract::tail_weights; Chris@16: Chris@16: template Chris@16: struct feature_of > Chris@16: : feature_of Chris@16: { Chris@16: }; Chris@16: Chris@16: template Chris@16: struct feature_of > Chris@16: { Chris@16: typedef tag::abstract_tail_weights type; Chris@16: }; Chris@16: Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: #endif