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