1/*=============================================================================
2 Copyright (c) 2007 Tobias Schwinger
3
4 Use modification and distribution are subject to the Boost Software
5 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt).
7==============================================================================*/
8
9#if !defined(BOOST_FUSION_SUPPORT_DEDUCE_HPP_INCLUDED)
10#define BOOST_FUSION_SUPPORT_DEDUCE_HPP_INCLUDED
11
12#include <boost/fusion/support/config.hpp>
13#include <boost/ref.hpp>
14
15#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
16#include <functional>
17#endif
18
19namespace boost { namespace fusion { namespace traits
20{
21 template <typename T> struct deduce;
22
23 //----- ---- --- -- - - - -
24
25 // Non-references pass unchanged
26
27 template <typename T>
28 struct deduce
29 {
30 typedef T type;
31 };
32
33 template <typename T>
34 struct deduce<T const>
35 {
36 typedef T type;
37 };
38
39 template <typename T>
40 struct deduce<T volatile>
41 {
42 typedef T type;
43 };
44
45 template <typename T>
46 struct deduce<T const volatile>
47 {
48 typedef T type;
49 };
50
51 // Keep references on mutable LValues
52
53 template <typename T>
54 struct deduce<T &>
55 {
56 typedef T & type;
57 };
58
59 template <typename T>
60 struct deduce<T volatile&>
61 {
62 typedef T volatile& type;
63 };
64
65 // Store away potential RValues
66
67 template <typename T>
68 struct deduce<T const&>
69 {
70 typedef T type;
71 };
72
73 template <typename T>
74 struct deduce<T const volatile&>
75 {
76 typedef T type;
77 };
78
79 // Unwrap Boost.RefS (referencee cv is deduced)
80
81 template <typename T>
82 struct deduce<reference_wrapper<T> & >
83 {
84 typedef T& type;
85 };
86
87 template <typename T>
88 struct deduce<reference_wrapper<T> const & >
89 {
90 typedef T& type;
91 };
92
93 // Also unwrap C++11 std::ref if available (referencee cv is deduced)
94#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
95 template <typename T>
96 struct deduce<std::reference_wrapper<T> &>
97 {
98 typedef T& type;
99 };
100
101 template <typename T>
102 struct deduce<std::reference_wrapper<T> const &>
103 {
104 typedef T& type;
105 };
106#endif
107
108 // Keep references on arrays, even if const
109
110 template <typename T, int N>
111 struct deduce<T(&)[N]>
112 {
113 typedef T(&type)[N];
114 };
115
116 template <typename T, int N>
117 struct deduce<volatile T(&)[N]>
118 {
119 typedef volatile T(&type)[N];
120 };
121
122 template <typename T, int N>
123 struct deduce<const T(&)[N]>
124 {
125 typedef const T(&type)[N];
126 };
127
128 template <typename T, int N>
129 struct deduce<const volatile T(&)[N]>
130 {
131 typedef const volatile T(&type)[N];
132 };
133
134}}}
135
136#endif
137
138

source code of boost/boost/fusion/support/deduce.hpp