// 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> | |
# include <boost/concept/detail/backward_compatibility.hpp> | |
namespace boost { namespace concepts { | |
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::concepts::detail | |
#endif // BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP |