Skip to content

Commit 06fe0f1

Browse files
committed
is_reference_to_function implementation
[SVN r16276]
1 parent 7ea2447 commit 06fe0f1

File tree

3 files changed

+150
-9
lines changed

3 files changed

+150
-9
lines changed

include/boost/python/detail/indirect_traits.hpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
# include <boost/mpl/bool_c.hpp>
2020
# include <boost/mpl/aux_/lambda_support.hpp>
2121

22+
# ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
23+
# include <boost/python/detail/is_function_ref_tester.hpp>
24+
# endif
25+
2226
namespace boost { namespace python { namespace detail {
2327

2428
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
@@ -42,7 +46,6 @@ struct is_reference_to_const<T const volatile&>
4246
};
4347
# endif
4448

45-
# if 0 // Corresponding code doesn't work on MSVC yet
4649
template <class T>
4750
struct is_reference_to_function
4851
{
@@ -72,7 +75,6 @@ struct is_reference_to_function<T const volatile&>
7275
{
7376
BOOST_STATIC_CONSTANT(bool, value = is_function<T>::value);
7477
};
75-
# endif
7678

7779
template <class T>
7880
struct is_pointer_to_function
@@ -231,15 +233,19 @@ struct is_class_help
231233
>::type type;
232234
};
233235

234-
# if 0 // doesn't seem to work yet
235236
template <class T>
236-
struct is_reference_to_function
237+
struct is_reference_to_function_aux
237238
{
238239
static T t;
239240
BOOST_STATIC_CONSTANT(
240-
bool, value
241-
= sizeof(::boost::type_traits::is_function_ptr_tester(t)) == sizeof(::boost::type_traits::yes_type));
242-
# endif
241+
bool, value = sizeof(is_function_ref_tester(t,0)) == sizeof(::boost::type_traits::yes_type));
242+
};
243+
244+
template <class T>
245+
struct is_reference_to_function
246+
: mpl::if_<is_reference<T>, is_reference_to_function_aux<T>, mpl::bool_c<false> >::type
247+
{
248+
};
243249

244250
template <class T>
245251
struct is_pointer_to_function
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
2+
// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes,
3+
// Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.
4+
// Permission to copy, use, modify, sell and distribute this software
5+
// is granted provided this copyright notice appears in all copies.
6+
// This software is provided "as is" without express or implied warranty,
7+
// and with no claim as to its suitability for any purpose.
8+
9+
#if !defined(BOOST_PP_IS_ITERATING)
10+
11+
///// header body
12+
13+
#ifndef BOOST_TT_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED
14+
#define BOOST_TT_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED
15+
16+
#include "boost/type_traits/detail/yes_no_type.hpp"
17+
#include "boost/type_traits/config.hpp"
18+
19+
#if defined(BOOST_TT_PREPROCESSING_MODE)
20+
# include "boost/preprocessor/iterate.hpp"
21+
# include "boost/preprocessor/enum_params.hpp"
22+
# include "boost/preprocessor/comma_if.hpp"
23+
#endif
24+
25+
namespace boost {
26+
namespace python {
27+
namespace detail {
28+
29+
template <class T>
30+
boost::type_traits::no_type BOOST_TT_DECL is_function_ref_tester(T& ...);
31+
32+
#if !defined(BOOST_TT_PREPROCESSING_MODE)
33+
// preprocessor-generated part, don't edit by hand!
34+
35+
template <class R>
36+
boost::type_traits::yes_type is_function_ref_tester(R (&)(), int);
37+
38+
template <class R,class T0 >
39+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0), int);
40+
41+
template <class R,class T0,class T1 >
42+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1), int);
43+
44+
template <class R,class T0,class T1,class T2 >
45+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2), int);
46+
47+
template <class R,class T0,class T1,class T2,class T3 >
48+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3), int);
49+
50+
template <class R,class T0,class T1,class T2,class T3,class T4 >
51+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4), int);
52+
53+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5 >
54+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5), int);
55+
56+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6 >
57+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6), int);
58+
59+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7 >
60+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7), int);
61+
62+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8 >
63+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8), int);
64+
65+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9 >
66+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9), int);
67+
68+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10 >
69+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10), int);
70+
71+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11 >
72+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11), int);
73+
74+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12 >
75+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12), int);
76+
77+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13 >
78+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13), int);
79+
80+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14 >
81+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14), int);
82+
83+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15 >
84+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15), int);
85+
86+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16 >
87+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16), int);
88+
89+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17 >
90+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17), int);
91+
92+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18 >
93+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18), int);
94+
95+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19 >
96+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19), int);
97+
98+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20 >
99+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20), int);
100+
101+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21 >
102+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21), int);
103+
104+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22 >
105+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22), int);
106+
107+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22,class T23 >
108+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23), int);
109+
110+
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22,class T23,class T24 >
111+
boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24), int);
112+
113+
#else
114+
115+
#define BOOST_PP_ITERATION_PARAMS_1 \
116+
(3, (0, 25, "boost/type_traits/detail/is_function_ref_tester.hpp"))
117+
#include BOOST_PP_ITERATE()
118+
119+
#endif // BOOST_TT_PREPROCESSING_MODE
120+
121+
} // namespace detail
122+
} // namespace python
123+
} // namespace boost
124+
125+
#endif // BOOST_TT_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED
126+
127+
///// iteration
128+
129+
#else
130+
#define i BOOST_PP_FRAME_ITERATION(1)
131+
132+
template <class R BOOST_PP_COMMA_IF(i) BOOST_PP_ENUM_PARAMS(i,class T) >
133+
boost::type_traits::yes_type is_function_ref_tester(R (&)(BOOST_PP_ENUM_PARAMS(i,T)), int);
134+
135+
#undef i
136+
#endif // BOOST_PP_IS_ITERATING

test/indirect_traits_test.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@ int main()
1111
{
1212
using namespace boost::python::detail;
1313

14-
#if 0 // not yet supported
1514
assert(is_reference_to_function<int (&)()>::value);
1615
assert(!is_reference_to_function<int (*)()>::value);
17-
#endif
16+
assert(!is_reference_to_function<int&>::value);
1817

1918
assert(!is_pointer_to_function<int (&)()>::value);
2019
assert(is_pointer_to_function<int (*)()>::value);

0 commit comments

Comments
 (0)