You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
117 lines
2.3 KiB
117 lines
2.3 KiB
/*============================================================================= |
|
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; |
|
}; |
|
|
|
template <typename T> |
|
struct deduce<T const> |
|
{ |
|
typedef T type; |
|
}; |
|
|
|
template <typename T> |
|
struct deduce<T volatile> |
|
{ |
|
typedef T type; |
|
}; |
|
|
|
template <typename T> |
|
struct deduce<T const volatile> |
|
{ |
|
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<T(&)[N]> |
|
{ |
|
typedef T(&type)[N]; |
|
}; |
|
|
|
template <typename T, int N> |
|
struct deduce<volatile T(&)[N]> |
|
{ |
|
typedef volatile T(&type)[N]; |
|
}; |
|
|
|
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 |
|
|
|
|