Chris@16: // Copyright David Abrahams 2006. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef BOOST_CONCEPT_REQUIRES_DWA2006430_HPP Chris@16: # define BOOST_CONCEPT_REQUIRES_DWA2006430_HPP Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { Chris@16: Chris@101: // unaryfunptr_arg_type from parameter/aux_/parenthesized_type.hpp Chris@101: Chris@101: namespace ccheck_aux { Chris@101: Chris@101: // A metafunction that transforms void(*)(T) -> T Chris@101: template Chris@101: struct unaryfunptr_arg_type; Chris@101: Chris@101: template Chris@101: struct unaryfunptr_arg_type Chris@101: { Chris@101: typedef Arg type; Chris@101: }; Chris@101: Chris@101: template <> Chris@101: struct unaryfunptr_arg_type Chris@101: { Chris@101: typedef void type; Chris@101: }; Chris@101: Chris@101: } // namespace ccheck_aux Chris@101: Chris@16: // Template for use in handwritten assertions Chris@16: template Chris@16: struct requires_ : More Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT((Model)); Chris@16: }; Chris@16: Chris@16: // Template for use by macros, where models must be wrapped in parens. Chris@16: // This isn't in namespace detail to keep extra cruft out of resulting Chris@16: // error messages. Chris@16: template Chris@16: struct _requires_ Chris@16: { Chris@16: enum { value = 0 }; Chris@16: BOOST_CONCEPT_ASSERT_FN(ModelFn); Chris@16: }; Chris@16: Chris@16: template Chris@101: struct Requires_ : ::boost::ccheck_aux::unaryfunptr_arg_type Chris@16: { Chris@16: }; Chris@16: Chris@16: # if BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(1010)) Chris@16: # define BOOST_CONCEPT_REQUIRES_(r,data,t) | (::boost::_requires_::value) Chris@16: # else Chris@16: # define BOOST_CONCEPT_REQUIRES_(r,data,t) + (::boost::_requires_::value) Chris@16: # endif Chris@16: Chris@101: #if defined(NDEBUG) Chris@16: Chris@16: # define BOOST_CONCEPT_REQUIRES(models, result) \ Chris@101: typename ::boost::ccheck_aux::unaryfunptr_arg_type::type Chris@16: Chris@16: #elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) Chris@16: Chris@16: // Same thing as below without the initial typename Chris@16: # define BOOST_CONCEPT_REQUIRES(models, result) \ Chris@16: ::boost::Requires_< \ Chris@16: (0 BOOST_PP_SEQ_FOR_EACH(BOOST_CONCEPT_REQUIRES_, ~, models)), \ Chris@101: ::boost::ccheck_aux::unaryfunptr_arg_type \ Chris@16: >::type Chris@16: Chris@16: #else Chris@16: Chris@16: // This just ICEs on MSVC6 :( Chris@16: # define BOOST_CONCEPT_REQUIRES(models, result) \ Chris@16: typename ::boost::Requires_< \ Chris@16: (0 BOOST_PP_SEQ_FOR_EACH(BOOST_CONCEPT_REQUIRES_, ~, models)), \ Chris@16: void(*)result \ Chris@16: >::type Chris@16: Chris@16: #endif Chris@16: Chris@16: // C++0x proposed syntax changed. This supports an older usage Chris@16: #define BOOST_CONCEPT_WHERE(models,result) BOOST_CONCEPT_REQUIRES(models,result) Chris@16: Chris@16: } // namespace boost::concept_check Chris@16: Chris@16: #endif // BOOST_CONCEPT_REQUIRES_DWA2006430_HPP