/////////////////////////////////////////////////////////////////////////////// | |
// value_accumulator.hpp | |
// | |
// Copyright 2005 Eric Niebler, Daniel Egloff. 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_FRAMEWORK_ACCUMULATORS_VALUE_ACCUMULATOR_HPP_EAN_03_23_2006 | |
#define BOOST_ACCUMULATORS_FRAMEWORK_ACCUMULATORS_VALUE_ACCUMULATOR_HPP_EAN_03_23_2006 | |
#include <boost/mpl/always.hpp> | |
#include <boost/parameter/keyword.hpp> | |
#include <boost/accumulators/framework/depends_on.hpp> // for feature_tag | |
#include <boost/accumulators/framework/accumulator_base.hpp> | |
#include <boost/accumulators/framework/extractor.hpp> | |
namespace boost { namespace accumulators | |
{ | |
namespace impl | |
{ | |
////////////////////////////////////////////////////////////////////////// | |
// value_accumulator_impl | |
template<typename ValueType, typename Tag> | |
struct value_accumulator_impl | |
: accumulator_base | |
{ | |
typedef ValueType result_type; | |
template<typename Args> | |
value_accumulator_impl(Args const &args) | |
: val(args[parameter::keyword<Tag>::get()]) | |
{ | |
} | |
result_type result(dont_care) const | |
{ | |
return this->val; | |
} | |
private: | |
ValueType val; | |
}; | |
} // namespace impl | |
namespace tag | |
{ | |
////////////////////////////////////////////////////////////////////////// | |
// value_tag | |
template<typename Tag> | |
struct value_tag | |
{ | |
}; | |
////////////////////////////////////////////////////////////////////////// | |
// value | |
template<typename ValueType, typename Tag> | |
struct value | |
: depends_on<> | |
{ | |
/// INTERNAL ONLY | |
/// | |
typedef mpl::always<accumulators::impl::value_accumulator_impl<ValueType, Tag> > impl; | |
}; | |
} | |
namespace extract | |
{ | |
BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, value, (typename)(typename)) | |
BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, value_tag, (typename)) | |
} | |
using extract::value; | |
using extract::value_tag; | |
// Map all value<V,T> features to value_tag<T> so | |
// that values can be extracted using value_tag<T> | |
// without specifying the value type. | |
template<typename ValueType, typename Tag> | |
struct feature_of<tag::value<ValueType, Tag> > | |
: feature_of<tag::value_tag<Tag> > | |
{ | |
}; | |
}} // namespace boost::accumulators | |
#endif |