49 lines
1.6 KiB
C++
49 lines
1.6 KiB
C++
|
// Copyright David Abrahams 2006. Distributed under the Boost
|
||
|
// Software License, Version 1.0. (See accompanying
|
||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
#ifndef BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP
|
||
|
# define BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP
|
||
|
|
||
|
# include <boost/mpl/bool.hpp>
|
||
|
# include <boost/detail/workaround.hpp>
|
||
|
namespace boost { namespace concept {
|
||
|
|
||
|
namespace detail
|
||
|
{
|
||
|
|
||
|
// Here we implement the metafunction that detects whether a
|
||
|
// constraints metafunction exists
|
||
|
typedef char yes;
|
||
|
typedef char (&no)[2];
|
||
|
|
||
|
template <class Model, void (Model::*)()>
|
||
|
struct wrap_constraints {};
|
||
|
|
||
|
#if BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580) || defined(__CUDACC__)
|
||
|
// Work around the following bogus error in Sun Studio 11, by
|
||
|
// turning off the has_constraints function entirely:
|
||
|
// Error: complex expression not allowed in dependent template
|
||
|
// argument expression
|
||
|
inline no has_constraints_(...);
|
||
|
#else
|
||
|
template <class Model>
|
||
|
inline yes has_constraints_(Model*, wrap_constraints<Model,&Model::constraints>* = 0);
|
||
|
inline no has_constraints_(...);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
// This would be called "detail::has_constraints," but it has a strong
|
||
|
// tendency to show up in error messages.
|
||
|
template <class Model>
|
||
|
struct not_satisfied
|
||
|
{
|
||
|
BOOST_STATIC_CONSTANT(
|
||
|
bool
|
||
|
, value = sizeof( detail::has_constraints_((Model*)0) ) == sizeof(detail::yes) );
|
||
|
typedef mpl::bool_<value> type;
|
||
|
};
|
||
|
|
||
|
}} // namespace boost::concept::detail
|
||
|
|
||
|
#endif // BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP
|