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/type_traits/conditional.hpp> 14 # endif 15 16 # ifdef BOOST_MSVC 17 # pragma warning(push) 18 # pragma warning(disable:4100) 19 # endif 20 21 namespace boost { namespace concepts { 22 23 24 template <class Model> 25 struct check 26 { failedboost::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 { failedboost::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 : boost::conditional< 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 { failedboost::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(::boost::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(::boost::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