]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | |
2 | #ifndef BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED | |
3 | #define BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED | |
4 | ||
5 | // Copyright Aleksey Gurtovoy 2002-2004 | |
6 | // | |
7 | // Distributed under the Boost Software License, Version 1.0. | |
8 | // (See accompanying file LICENSE_1_0.txt or copy at | |
9 | // http://www.boost.org/LICENSE_1_0.txt) | |
10 | // | |
11 | // See http://www.boost.org/libs/mpl for documentation. | |
12 | ||
13 | // $Id$ | |
14 | // $Date$ | |
15 | // $Revision$ | |
16 | ||
17 | #include <boost/mpl/aux_/config/msvc.hpp> | |
18 | #include <boost/mpl/aux_/config/intel.hpp> | |
19 | #include <boost/mpl/aux_/config/workaround.hpp> | |
20 | ||
21 | #if BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION) | |
22 | # include <boost/mpl/has_xxx.hpp> | |
23 | #elif BOOST_WORKAROUND(BOOST_MSVC, < 1300) | |
24 | # include <boost/mpl/has_xxx.hpp> | |
25 | # include <boost/mpl/if.hpp> | |
26 | # include <boost/mpl/bool.hpp> | |
27 | # include <boost/mpl/aux_/msvc_is_class.hpp> | |
28 | #elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) | |
29 | # include <boost/mpl/if.hpp> | |
30 | # include <boost/mpl/bool.hpp> | |
31 | # include <boost/mpl/aux_/yes_no.hpp> | |
32 | # include <boost/mpl/aux_/config/static_constant.hpp> | |
33 | # include <boost/type_traits/is_class.hpp> | |
34 | #else | |
35 | # include <boost/mpl/aux_/type_wrapper.hpp> | |
36 | # include <boost/mpl/aux_/yes_no.hpp> | |
37 | # include <boost/mpl/aux_/config/static_constant.hpp> | |
38 | #endif | |
39 | ||
40 | namespace boost { namespace mpl { namespace aux { | |
41 | ||
42 | #if BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION) | |
43 | ||
44 | BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_rebind, rebind, false) | |
45 | ||
46 | #elif BOOST_WORKAROUND(BOOST_MSVC, < 1300) | |
47 | ||
48 | BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_rebind_impl, rebind, false) | |
49 | ||
50 | template< typename T > | |
51 | struct has_rebind | |
52 | : if_< | |
53 | msvc_is_class<T> | |
54 | , has_rebind_impl<T> | |
55 | , bool_<false> | |
56 | >::type | |
57 | { | |
58 | }; | |
59 | ||
60 | #else // the rest | |
61 | ||
62 | template< typename T > struct has_rebind_tag {}; | |
63 | no_tag operator|(has_rebind_tag<int>, void const volatile*); | |
64 | ||
65 | # if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) | |
66 | template< typename T > | |
67 | struct has_rebind | |
68 | { | |
69 | static has_rebind_tag<T>* get(); | |
70 | BOOST_STATIC_CONSTANT(bool, value = | |
71 | sizeof(has_rebind_tag<int>() | get()) == sizeof(yes_tag) | |
72 | ); | |
73 | }; | |
74 | # else // __BORLANDC__ | |
75 | template< typename T > | |
76 | struct has_rebind_impl | |
77 | { | |
78 | static T* get(); | |
79 | BOOST_STATIC_CONSTANT(bool, value = | |
80 | sizeof(has_rebind_tag<int>() | get()) == sizeof(yes_tag) | |
81 | ); | |
82 | }; | |
83 | ||
84 | template< typename T > | |
85 | struct has_rebind | |
86 | : if_< | |
87 | is_class<T> | |
88 | , has_rebind_impl<T> | |
89 | , bool_<false> | |
90 | >::type | |
91 | { | |
92 | }; | |
93 | # endif // __BORLANDC__ | |
94 | ||
95 | #endif | |
96 | ||
97 | }}} | |
98 | ||
99 | #endif // BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED |