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_DETAIL_GENERAL_DWA2006429_HPP 5 # define BOOST_CONCEPT_DETAIL_GENERAL_DWA2006429_HPP 6 7 # include <boost/config.hpp> 8 # include <boost/preprocessor/cat.hpp> 9 # include <boost/concept/detail/backward_compatibility.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 // This implementation works on Comeau and GCC, all the way back to 17 // 2.95 18 namespace boost { namespace concepts { 19 20 template <class ModelFn> 21 struct requirement_; 22 23 namespace detail 24 { 25 template <void(*)()> struct instantiate {}; 26 } 27 28 template <class Model> 29 struct requirement 30 { failedboost::concepts::requirement31 static void failed() { ((Model*)0)->~Model(); } 32 }; 33 34 struct failed {}; 35 36 template <class Model> 37 struct requirement<failed ************ Model::************> 38 { failedboost::concepts::requirement39 static void failed() { ((Model*)0)->~Model(); } 40 }; 41 42 # ifdef BOOST_OLD_CONCEPT_SUPPORT 43 44 template <class Model> 45 struct constraint 46 { failedboost::concepts::constraint47 static void failed() { ((Model*)0)->constraints(); } 48 }; 49 50 template <class Model> 51 struct requirement_<void(*)(Model)> 52 : mpl::if_< 53 concepts::not_satisfied<Model> 54 , constraint<Model> 55 , requirement<failed ************ Model::************> 56 >::type 57 {}; 58 59 # else 60 61 // For GCC-2.x, these can't have exactly the same name 62 template <class Model> 63 struct requirement_<void(*)(Model)> 64 : requirement<failed ************ Model::************> 65 {}; 66 67 # endif 68 69 # define BOOST_CONCEPT_ASSERT_FN( ModelFnPtr ) \ 70 typedef ::boost::concepts::detail::instantiate< \ 71 &::boost::concepts::requirement_<ModelFnPtr>::failed> \ 72 BOOST_PP_CAT(boost_concept_check,__LINE__) \ 73 BOOST_ATTRIBUTE_UNUSED 74 75 }} 76 77 #endif // BOOST_CONCEPT_DETAIL_GENERAL_DWA2006429_HPP 78