diff options
Diffstat (limited to 'boost/fusion/support/deduce.hpp')
-rw-r--r-- | boost/fusion/support/deduce.hpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/boost/fusion/support/deduce.hpp b/boost/fusion/support/deduce.hpp new file mode 100644 index 0000000000..3a7231bdf1 --- /dev/null +++ b/boost/fusion/support/deduce.hpp @@ -0,0 +1,117 @@ +/*============================================================================= + 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 + |