Chris@16
|
1 // Copyright Daniel Wallin 2006. Use, modification and distribution is
|
Chris@16
|
2 // subject to the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
4
|
Chris@16
|
5 #ifndef BOOST_PARAMETER_CAST_060902_HPP
|
Chris@16
|
6 # define BOOST_PARAMETER_CAST_060902_HPP
|
Chris@16
|
7
|
Chris@16
|
8 # include <boost/detail/workaround.hpp>
|
Chris@16
|
9
|
Chris@16
|
10 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|
Chris@16
|
11 && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
Chris@16
|
12 # include <boost/type_traits/add_reference.hpp>
|
Chris@16
|
13 # include <boost/type_traits/remove_const.hpp>
|
Chris@16
|
14 # endif
|
Chris@16
|
15
|
Chris@16
|
16 namespace boost { namespace parameter { namespace aux {
|
Chris@16
|
17
|
Chris@16
|
18 struct use_default_tag {};
|
Chris@16
|
19
|
Chris@16
|
20 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|
Chris@16
|
21 || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
Chris@16
|
22
|
Chris@16
|
23 # define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) value
|
Chris@16
|
24
|
Chris@16
|
25 # else
|
Chris@16
|
26
|
Chris@16
|
27 // Handles possible implicit casts. Used by preprocessor.hpp to
|
Chris@16
|
28 // normalize user input.
|
Chris@16
|
29 //
|
Chris@16
|
30 // cast<void*>::execute() is identity
|
Chris@16
|
31 // cast<void*(X)>::execute() is identity
|
Chris@16
|
32 // cast<void(X)>::execute() casts to X
|
Chris@16
|
33 //
|
Chris@16
|
34 // preprocessor.hpp uses this like this:
|
Chris@16
|
35 //
|
Chris@16
|
36 // #define X(value, predicate)
|
Chris@16
|
37 // cast<void predicate>::execute(value)
|
Chris@16
|
38 //
|
Chris@16
|
39 // X(something, *)
|
Chris@16
|
40 // X(something, *(predicate))
|
Chris@16
|
41 // X(something, (int))
|
Chris@16
|
42
|
Chris@16
|
43 template <class T, class Args>
|
Chris@16
|
44 struct cast;
|
Chris@16
|
45
|
Chris@16
|
46 template <class Args>
|
Chris@16
|
47 struct cast<void*, Args>
|
Chris@16
|
48 {
|
Chris@16
|
49 static use_default_tag execute(use_default_tag)
|
Chris@16
|
50 {
|
Chris@16
|
51 return use_default_tag();
|
Chris@16
|
52 }
|
Chris@16
|
53
|
Chris@16
|
54 static use_default_tag remove_const(use_default_tag)
|
Chris@16
|
55 {
|
Chris@16
|
56 return use_default_tag();
|
Chris@16
|
57 }
|
Chris@16
|
58
|
Chris@16
|
59 template <class U>
|
Chris@16
|
60 static U& execute(U& value)
|
Chris@16
|
61 {
|
Chris@16
|
62 return value;
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 template <class U>
|
Chris@16
|
66 static U& remove_const(U& x)
|
Chris@16
|
67 {
|
Chris@16
|
68 return x;
|
Chris@16
|
69 }
|
Chris@16
|
70 };
|
Chris@16
|
71
|
Chris@16
|
72 #if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))
|
Chris@16
|
73
|
Chris@16
|
74 typedef void* voidstar;
|
Chris@16
|
75
|
Chris@16
|
76 template <class T, class Args>
|
Chris@16
|
77 struct cast<voidstar(T), Args>
|
Chris@16
|
78 : cast<void*, Args>
|
Chris@16
|
79 {
|
Chris@16
|
80 };
|
Chris@16
|
81
|
Chris@16
|
82 #else
|
Chris@16
|
83
|
Chris@16
|
84 template <class T, class Args>
|
Chris@16
|
85 struct cast<void*(T), Args>
|
Chris@16
|
86 : cast<void*, Args>
|
Chris@16
|
87 {
|
Chris@16
|
88 };
|
Chris@16
|
89
|
Chris@16
|
90 #endif
|
Chris@16
|
91
|
Chris@16
|
92 // This is a hack used in cast<> to turn the user supplied type,
|
Chris@16
|
93 // which may or may not be a placeholder expression into one, so
|
Chris@16
|
94 // that it will be properly evaluated by mpl::apply.
|
Chris@16
|
95 template <class T, class Dummy = mpl::_1>
|
Chris@16
|
96 struct as_placeholder_expr
|
Chris@16
|
97 {
|
Chris@16
|
98 typedef T type;
|
Chris@16
|
99 };
|
Chris@16
|
100
|
Chris@16
|
101 template <class T, class Args>
|
Chris@16
|
102 struct cast<void(T), Args>
|
Chris@16
|
103 {
|
Chris@16
|
104 typedef typename mpl::apply2<
|
Chris@16
|
105 as_placeholder_expr<T>, Args, Args>::type type0;
|
Chris@16
|
106
|
Chris@16
|
107 typedef typename boost::add_reference<
|
Chris@16
|
108 typename boost::remove_const<type0>::type
|
Chris@16
|
109 >::type reference;
|
Chris@16
|
110
|
Chris@16
|
111 static use_default_tag execute(use_default_tag)
|
Chris@16
|
112 {
|
Chris@16
|
113 return use_default_tag();
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 static use_default_tag remove_const(use_default_tag)
|
Chris@16
|
117 {
|
Chris@16
|
118 return use_default_tag();
|
Chris@16
|
119 }
|
Chris@16
|
120
|
Chris@16
|
121 static type0 execute(type0 value)
|
Chris@16
|
122 {
|
Chris@16
|
123 return value;
|
Chris@16
|
124 }
|
Chris@16
|
125
|
Chris@16
|
126 template <class U>
|
Chris@16
|
127 static reference remove_const(U const& x)
|
Chris@16
|
128 {
|
Chris@16
|
129 return const_cast<reference>(x);
|
Chris@16
|
130 }
|
Chris@16
|
131 };
|
Chris@16
|
132
|
Chris@16
|
133 # define BOOST_PARAMETER_FUNCTION_CAST(value, predicate, args) \
|
Chris@16
|
134 boost::parameter::aux::cast<void predicate, args>::remove_const( \
|
Chris@16
|
135 boost::parameter::aux::cast<void predicate, args>::execute(value) \
|
Chris@16
|
136 )
|
Chris@16
|
137
|
Chris@16
|
138 # endif
|
Chris@16
|
139
|
Chris@16
|
140 }}} // namespace boost::parameter::aux
|
Chris@16
|
141
|
Chris@16
|
142 #endif // BOOST_PARAMETER_CAST_060902_HPP
|
Chris@16
|
143
|