/////////////////////////////////////////////////////////////////////////////// // tail_variate.hpp // // Copyright 2005 Eric Niebler, Michael Gauckler. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_STAT_STATISTICS_TAIL_VARIATE_HPP_EAN_28_10_2005 #define BOOST_STAT_STATISTICS_TAIL_VARIATE_HPP_EAN_28_10_2005 #include #include #include #include #include #include #include #include #include #include namespace boost { namespace accumulators { namespace impl { /////////////////////////////////////////////////////////////////////////////// // tail_variate_impl template struct tail_variate_impl : accumulator_base { // for boost::result_of typedef typename detail::tail_range< typename std::vector::const_iterator , std::vector::iterator >::type result_type; template tail_variate_impl(Args const &args) : variates(args[tag::tail::cache_size], args[parameter::keyword::get() | VariateType()]) { } template void assign(Args const &args, std::size_t index) { this->variates[index] = args[parameter::keyword::get()]; } template result_type result(Args const &args) const { // getting the order result causes the indices vector to be sorted. extractor > const some_tail = {}; return this->do_result(some_tail(args)); } private: template result_type do_result(TailRng const &rng) const { return detail::make_tail_range( this->variates.begin() , rng.end().base().base() // the index iterator , rng.begin().base().base() // (begin and end reversed because these are reverse iterators) ); } std::vector variates; }; } // namespace impl /////////////////////////////////////////////////////////////////////////////// // tag::tail_variate<> // namespace tag { template struct tail_variate : depends_on > { /// INTERNAL ONLY /// typedef mpl::always > impl; }; struct abstract_tail_variate : depends_on<> { }; template struct tail_weights : depends_on > { /// INTERNAL ONLY /// typedef accumulators::impl::tail_variate_impl impl; }; struct abstract_tail_weights : depends_on<> { }; } /////////////////////////////////////////////////////////////////////////////// // extract::tail_variate // extract::tail_weights // namespace extract { extractor const tail_variate = {}; extractor const tail_weights = {}; BOOST_ACCUMULATORS_IGNORE_GLOBAL(tail_variate) BOOST_ACCUMULATORS_IGNORE_GLOBAL(tail_weights) } using extract::tail_variate; using extract::tail_weights; template struct feature_of > : feature_of { }; template struct feature_of > { typedef tag::abstract_tail_weights type; }; }} // namespace boost::accumulators #endif