annotate DEPENDENCIES/generic/include/boost/accumulators/statistics/tail_variate.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 ///////////////////////////////////////////////////////////////////////////////
Chris@16 2 // tail_variate.hpp
Chris@16 3 //
Chris@16 4 // Copyright 2005 Eric Niebler, Michael Gauckler. Distributed under the Boost
Chris@16 5 // Software License, Version 1.0. (See accompanying file
Chris@16 6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7
Chris@16 8 #ifndef BOOST_STAT_STATISTICS_TAIL_VARIATE_HPP_EAN_28_10_2005
Chris@16 9 #define BOOST_STAT_STATISTICS_TAIL_VARIATE_HPP_EAN_28_10_2005
Chris@16 10
Chris@16 11 #include <boost/range.hpp>
Chris@16 12 #include <boost/mpl/always.hpp>
Chris@16 13 #include <boost/mpl/placeholders.hpp>
Chris@16 14 #include <boost/iterator/reverse_iterator.hpp>
Chris@16 15 #include <boost/iterator/permutation_iterator.hpp>
Chris@16 16 #include <boost/accumulators/framework/accumulator_base.hpp>
Chris@16 17 #include <boost/accumulators/framework/extractor.hpp>
Chris@16 18 #include <boost/accumulators/framework/depends_on.hpp>
Chris@16 19 #include <boost/accumulators/statistics_fwd.hpp>
Chris@16 20 #include <boost/accumulators/statistics/tail.hpp>
Chris@16 21
Chris@16 22 namespace boost { namespace accumulators
Chris@16 23 {
Chris@16 24
Chris@16 25 namespace impl
Chris@16 26 {
Chris@16 27 ///////////////////////////////////////////////////////////////////////////////
Chris@16 28 // tail_variate_impl
Chris@16 29 template<typename VariateType, typename VariateTag, typename LeftRight>
Chris@16 30 struct tail_variate_impl
Chris@16 31 : accumulator_base
Chris@16 32 {
Chris@16 33 // for boost::result_of
Chris@16 34 typedef
Chris@16 35 typename detail::tail_range<
Chris@16 36 typename std::vector<VariateType>::const_iterator
Chris@16 37 , std::vector<std::size_t>::iterator
Chris@16 38 >::type
Chris@16 39 result_type;
Chris@16 40
Chris@16 41 template<typename Args>
Chris@16 42 tail_variate_impl(Args const &args)
Chris@16 43 : variates(args[tag::tail<LeftRight>::cache_size], args[parameter::keyword<VariateTag>::get() | VariateType()])
Chris@16 44 {
Chris@16 45 }
Chris@16 46
Chris@16 47 template<typename Args>
Chris@16 48 void assign(Args const &args, std::size_t index)
Chris@16 49 {
Chris@16 50 this->variates[index] = args[parameter::keyword<VariateTag>::get()];
Chris@16 51 }
Chris@16 52
Chris@16 53 template<typename Args>
Chris@16 54 result_type result(Args const &args) const
Chris@16 55 {
Chris@16 56 // getting the order result causes the indices vector to be sorted.
Chris@16 57 extractor<tag::tail<LeftRight> > const some_tail = {};
Chris@16 58 return this->do_result(some_tail(args));
Chris@16 59 }
Chris@16 60
Chris@16 61 private:
Chris@16 62 template<typename TailRng>
Chris@16 63 result_type do_result(TailRng const &rng) const
Chris@16 64 {
Chris@16 65 return detail::make_tail_range(
Chris@16 66 this->variates.begin()
Chris@16 67 , rng.end().base().base() // the index iterator
Chris@16 68 , rng.begin().base().base() // (begin and end reversed because these are reverse iterators)
Chris@16 69 );
Chris@16 70 }
Chris@16 71
Chris@16 72 std::vector<VariateType> variates;
Chris@16 73 };
Chris@16 74
Chris@16 75 } // namespace impl
Chris@16 76
Chris@16 77 ///////////////////////////////////////////////////////////////////////////////
Chris@16 78 // tag::tail_variate<>
Chris@16 79 //
Chris@16 80 namespace tag
Chris@16 81 {
Chris@16 82 template<typename VariateType, typename VariateTag, typename LeftRight>
Chris@16 83 struct tail_variate
Chris@16 84 : depends_on<tail<LeftRight> >
Chris@16 85 {
Chris@16 86 /// INTERNAL ONLY
Chris@16 87 ///
Chris@16 88 typedef mpl::always<accumulators::impl::tail_variate_impl<VariateType, VariateTag, LeftRight> > impl;
Chris@16 89 };
Chris@16 90
Chris@16 91 struct abstract_tail_variate
Chris@16 92 : depends_on<>
Chris@16 93 {
Chris@16 94 };
Chris@16 95
Chris@16 96 template<typename LeftRight>
Chris@16 97 struct tail_weights
Chris@16 98 : depends_on<tail<LeftRight> >
Chris@16 99 {
Chris@16 100 /// INTERNAL ONLY
Chris@16 101 ///
Chris@16 102 typedef accumulators::impl::tail_variate_impl<mpl::_2, tag::weight, LeftRight> impl;
Chris@16 103 };
Chris@16 104
Chris@16 105 struct abstract_tail_weights
Chris@16 106 : depends_on<>
Chris@16 107 {
Chris@16 108 };
Chris@16 109 }
Chris@16 110
Chris@16 111 ///////////////////////////////////////////////////////////////////////////////
Chris@16 112 // extract::tail_variate
Chris@16 113 // extract::tail_weights
Chris@16 114 //
Chris@16 115 namespace extract
Chris@16 116 {
Chris@16 117 extractor<tag::abstract_tail_variate> const tail_variate = {};
Chris@16 118 extractor<tag::abstract_tail_weights> const tail_weights = {};
Chris@16 119
Chris@16 120 BOOST_ACCUMULATORS_IGNORE_GLOBAL(tail_variate)
Chris@16 121 BOOST_ACCUMULATORS_IGNORE_GLOBAL(tail_weights)
Chris@16 122 }
Chris@16 123
Chris@16 124 using extract::tail_variate;
Chris@16 125 using extract::tail_weights;
Chris@16 126
Chris@16 127 template<typename VariateType, typename VariateTag, typename LeftRight>
Chris@16 128 struct feature_of<tag::tail_variate<VariateType, VariateTag, LeftRight> >
Chris@16 129 : feature_of<tag::abstract_tail_variate>
Chris@16 130 {
Chris@16 131 };
Chris@16 132
Chris@16 133 template<typename LeftRight>
Chris@16 134 struct feature_of<tag::tail_weights<LeftRight> >
Chris@16 135 {
Chris@16 136 typedef tag::abstract_tail_weights type;
Chris@16 137 };
Chris@16 138
Chris@16 139 }} // namespace boost::accumulators
Chris@16 140
Chris@16 141 #endif