1 // Copyright David Abrahams 2006. Distributed under the Boost
2 // Software License, Version 1.0. (See accompanying
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4 #ifndef BOOST_CONCEPT_CHECK_MSVC_DWA2006429_HPP
5 # define BOOST_CONCEPT_CHECK_MSVC_DWA2006429_HPP
6 
7 # include <boost/preprocessor/cat.hpp>
8 # include <boost/concept/detail/backward_compatibility.hpp>
9 # include <boost/config.hpp>
10 
11 # ifdef BOOST_OLD_CONCEPT_SUPPORT
12 #  include <boost/concept/detail/has_constraints.hpp>
13 #  include <boost/mpl/if.hpp>
14 # endif
15 
16 # ifdef BOOST_MSVC
17 #  pragma warning(push)
18 #  pragma warning(disable:4100)
19 # endif
20 
21 namespace pdalboost { namespace concepts {
22 
23 
24 template <class Model>
25 struct check
26 {
failedpdalboost::concepts::check27     virtual void failed(Model* x)
28     {
29         x->~Model();
30     }
31 };
32 
33 # ifndef BOOST_NO_PARTIAL_SPECIALIZATION
34 struct failed {};
35 template <class Model>
36 struct check<failed ************ Model::************>
37 {
failedpdalboost::concepts::check38     virtual void failed(Model* x)
39     {
40         x->~Model();
41     }
42 };
43 # endif
44 
45 # ifdef BOOST_OLD_CONCEPT_SUPPORT
46 
47 namespace detail
48 {
49   // No need for a virtual function here, since evaluating
50   // not_satisfied below will have already instantiated the
51   // constraints() member.
52   struct constraint {};
53 }
54 
55 template <class Model>
56 struct require
57   : mpl::if_c<
58         not_satisfied<Model>::value
59       , detail::constraint
60 # ifndef BOOST_NO_PARTIAL_SPECIALIZATION
61       , check<Model>
62 # else
63       , check<failed ************ Model::************>
64 # endif
65         >::type
66 {};
67 
68 # else
69 
70 template <class Model>
71 struct require
72 # ifndef BOOST_NO_PARTIAL_SPECIALIZATION
73     : check<Model>
74 # else
75     : check<failed ************ Model::************>
76 # endif
77 {};
78 
79 # endif
80 
81 # if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
82 
83 //
84 // The iterator library sees some really strange errors unless we
85 // do things this way.
86 //
87 template <class Model>
88 struct require<void(*)(Model)>
89 {
failedpdalboost::concepts::require90     virtual void failed(Model*)
91     {
92         require<Model>();
93     }
94 };
95 
96 # define BOOST_CONCEPT_ASSERT_FN( ModelFnPtr )      \
97 enum                                                \
98 {                                                   \
99     BOOST_PP_CAT(boost_concept_check,__LINE__) =    \
100     sizeof(::pdalboost::concepts::require<ModelFnPtr>)    \
101 }
102 
103 # else // Not vc-7.1
104 
105 template <class Model>
106 require<Model>
107 require_(void(*)(Model));
108 
109 # define BOOST_CONCEPT_ASSERT_FN( ModelFnPtr )          \
110 enum                                                    \
111 {                                                       \
112     BOOST_PP_CAT(boost_concept_check,__LINE__) =        \
113       sizeof(::pdalboost::concepts::require_((ModelFnPtr)0)) \
114 }
115 
116 # endif
117 }}
118 
119 # ifdef BOOST_MSVC
120 #  pragma warning(pop)
121 # endif
122 
123 #endif // BOOST_CONCEPT_CHECK_MSVC_DWA2006429_HPP
124