/////////////////////////////////////////////////////////////////////////////// | |
// accumulators_fwd.hpp | |
// | |
// Copyright 2005 Eric Niebler. 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_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005 | |
#define BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005 | |
#include <boost/config.hpp> | |
#include <boost/mpl/apply_fwd.hpp> // for mpl::na | |
#include <boost/mpl/limits/vector.hpp> | |
#include <boost/preprocessor/arithmetic/inc.hpp> | |
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> | |
#include <boost/preprocessor/repetition/enum_trailing_params.hpp> | |
#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp> | |
#include <boost/preprocessor/repetition/repeat_from_to.hpp> | |
#include <boost/accumulators/numeric/functional_fwd.hpp> | |
#ifndef BOOST_ACCUMULATORS_MAX_FEATURES | |
/// The maximum number of accumulators that may be put in an accumulator_set. | |
/// Defaults to BOOST_MPL_LIMIT_VECTOR_SIZE (which defaults to 20). | |
# define BOOST_ACCUMULATORS_MAX_FEATURES BOOST_MPL_LIMIT_VECTOR_SIZE | |
#endif | |
#if BOOST_ACCUMULATORS_MAX_FEATURES > BOOST_MPL_LIMIT_VECTOR_SIZE | |
# error BOOST_ACCUMULATORS_MAX_FEATURES cannot be larger than BOOST_MPL_LIMIT_VECTOR_SIZE | |
#endif | |
#ifndef BOOST_ACCUMULATORS_MAX_ARGS | |
/// The maximum number of arguments that may be specified to an accumulator_set's | |
/// accumulation function. Defaults to 15. | |
# define BOOST_ACCUMULATORS_MAX_ARGS 15 | |
#endif | |
#if BOOST_WORKAROUND(__GNUC__, == 3) \ | |
|| BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(306)) | |
# define BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS | |
#endif | |
#ifdef BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS | |
# include <boost/utility/enable_if.hpp> | |
# include <boost/type_traits/is_const.hpp> | |
# define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T)\ | |
, typename boost::disable_if<boost::is_const<T> >::type * = 0 | |
#else | |
# define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T) | |
#endif | |
namespace boost { namespace accumulators | |
{ | |
/////////////////////////////////////////////////////////////////////////////// | |
// Named parameters tags | |
// | |
namespace tag | |
{ | |
struct sample; | |
struct weight; | |
struct accumulator; | |
struct weights; | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
// User-level features | |
// | |
namespace tag | |
{ | |
template<typename ValueType, typename Tag> | |
struct value; | |
template<typename Tag> | |
struct value_tag; | |
template<typename Referent, typename Tag> | |
struct reference; | |
template<typename Tag> | |
struct reference_tag; | |
template<typename Type, typename Tag = void, typename AccumulatorSet = void> | |
struct external; | |
template<typename Feature> | |
struct droppable; | |
} | |
template<typename Accumulator> | |
struct droppable_accumulator_base; | |
template<typename Accumulator> | |
struct droppable_accumulator; | |
template<typename Accumulator> | |
struct with_cached_result; | |
template<typename Sample, typename Features, typename Weight = void> | |
struct accumulator_set; | |
template<typename Feature> | |
struct extractor; | |
template<typename Feature> | |
struct feature_of; | |
template<typename Feature> | |
struct as_feature; | |
template<typename Feature> | |
struct as_weighted_feature; | |
template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_ACCUMULATORS_MAX_FEATURES, typename Feature, mpl::na)> | |
struct depends_on; | |
template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_ACCUMULATORS_MAX_FEATURES, typename Feature, mpl::na)> | |
struct features; | |
template<typename Feature, typename AccumulatorSet> | |
typename mpl::apply<AccumulatorSet, Feature>::type const & | |
find_accumulator(AccumulatorSet const &acc); | |
template<typename Feature, typename AccumulatorSet> | |
typename mpl::apply<AccumulatorSet, Feature>::type::result_type | |
extract_result(AccumulatorSet const &acc); | |
template<typename Feature, typename AccumulatorSet, typename A1> | |
typename mpl::apply<AccumulatorSet, Feature>::type::result_type | |
extract_result(AccumulatorSet const &acc, A1 const &a1); | |
// ... other overloads generated by Boost.Preprocessor: | |
/// INTERNAL ONLY | |
/// | |
#define BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD(z, n, _) \ | |
template< \ | |
typename Feature \ | |
, typename AccumulatorSet \ | |
BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, typename A) \ | |
> \ | |
typename mpl::apply<AccumulatorSet, Feature>::type::result_type \ | |
extract_result( \ | |
AccumulatorSet const &acc \ | |
BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, n, A, const &a) \ | |
); | |
/// INTERNAL ONLY | |
/// | |
BOOST_PP_REPEAT_FROM_TO( | |
2 | |
, BOOST_PP_INC(BOOST_ACCUMULATORS_MAX_ARGS) | |
, BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD | |
, _ | |
) | |
#ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED | |
template<typename Feature, typename AccumulatorSet, typename A1, typename A2 ...> | |
typename mpl::apply<AccumulatorSet, Feature>::type::result_type | |
extract_result(AccumulatorSet const &acc, A1 const &a1, A2 const &a2 ...); | |
#endif | |
namespace impl | |
{ | |
using namespace numeric::operators; | |
template<typename Accumulator, typename Tag> | |
struct external_impl; | |
} | |
namespace detail | |
{ | |
template<typename Accumulator> | |
struct feature_tag; | |
template<typename Feature, typename Sample, typename Weight> | |
struct to_accumulator; | |
struct accumulator_set_base; | |
template<typename T> | |
struct is_accumulator_set; | |
inline void ignore_variable(void const *) {} | |
#define BOOST_ACCUMULATORS_IGNORE_GLOBAL(X)\ | |
namespace detail { inline void BOOST_PP_CAT(ignore_, X)() { boost::accumulators::detail::ignore_variable(&X); } } | |
} | |
}} // namespace boost::accumulators | |
// For defining boost::parameter keywords that can be inherited from to | |
// get a nested, class-scoped keyword with the requested alias | |
#define BOOST_PARAMETER_NESTED_KEYWORD(tag_namespace, name, alias) \ | |
namespace tag_namespace \ | |
{ \ | |
template<int Dummy = 0> \ | |
struct name ## _ \ | |
{ \ | |
static char const* keyword_name() \ | |
{ \ | |
return #name; \ | |
} \ | |
static ::boost::parameter::keyword<name ## _<Dummy> > &alias; \ | |
}; \ | |
template<int Dummy> \ | |
::boost::parameter::keyword<name ## _<Dummy> > &name ## _<Dummy>::alias = \ | |
::boost::parameter::keyword<name ## _<Dummy> >::get(); \ | |
typedef name ## _ <> name; \ | |
} \ | |
namespace \ | |
{ \ | |
::boost::parameter::keyword<tag_namespace::name> &name = \ | |
::boost::parameter::keyword<tag_namespace::name>::get(); \ | |
} | |
#endif |