introduces deduce metafunctions

[SVN r36811]
This commit is contained in:
Tobias Schwinger
2007-01-27 10:42:55 +00:00
parent 469a4a2d7a
commit aa1d326ba4
2 changed files with 130 additions and 0 deletions

View File

@ -0,0 +1,87 @@
/*=============================================================================
Copyright (c) 2007 Tobias Schwinger
Use modification and distribution are subject to 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).
==============================================================================*/
#if !defined(BOOST_FUSION_SUPPORT_DEDUCE_HPP_INCLUDED)
#define BOOST_FUSION_SUPPORT_DEDUCE_HPP_INCLUDED
#include <boost/ref.hpp>
namespace boost { namespace fusion { namespace traits
{
template <typename T> struct deduce;
//----- ---- --- -- - - - -
// Non-references pass unchanged
template <typename T>
struct deduce
{
typedef T type;
};
// Keep references on mutable LValues
template <typename T>
struct deduce<T &>
{
typedef T & type;
};
template <typename T>
struct deduce<T volatile&>
{
typedef T volatile& type;
};
// Store away potential RValues
template <typename T>
struct deduce<T const&>
{
typedef T type;
};
template <typename T>
struct deduce<T const volatile&>
{
typedef T type;
};
// Unwrap Boost.RefS (referencee cv is deduced)
template <typename T>
struct deduce<reference_wrapper<T> & >
{
typedef T& type;
};
template <typename T>
struct deduce<reference_wrapper<T> const & >
{
typedef T& type;
};
// Keep references on arrays, even if const
template <typename T, int N>
struct deduce<const T(&)[N]>
{
typedef const T(&type)[N];
};
template <typename T, int N>
struct deduce<const volatile T(&)[N]>
{
typedef const volatile T(&type)[N];
};
}}}
#endif

View File

@ -0,0 +1,43 @@
/*=============================================================================
Copyright (c) 2007 Tobias Schwinger
Use modification and distribution are subject to 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).
==============================================================================*/
#if !defined(BOOST_FUSION_SUPPORT_DEDUCE_SEQUENCE_HPP_INCLUDED)
#define BOOST_FUSION_SUPPORT_DEDUCE_SEQUENCE_HPP_INCLUDED
#include <boost/fusion/support/deduce.hpp>
#include <boost/fusion/sequence/conversion/as_vector.hpp>
#include <boost/fusion/sequence/view/transform_view.hpp>
namespace boost { namespace fusion { namespace traits
{
template <class Sequence> struct deduce_sequence;
//----- ---- --- -- - - - -
namespace detail
{
struct deducer
{
template <typename T>
struct result
: fusion::traits::deduce<T>
{ };
};
}
template <class Sequence>
struct deduce_sequence
: result_of::as_vector<
fusion::transform_view<Sequence, detail::deducer> >
{ };
}}}
#endif