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
18namespace boost { namespace concepts {
19
20template <class ModelFn>
21struct requirement_;
22
23namespace detail
24{
25 template <void(*)()> struct instantiate {};
26}
27
28template <class Model>
29struct requirement
30{
31 static void failed() { ((Model*)0)->~Model(); }
32};
33
34struct failed {};
35
36template <class Model>
37struct requirement<failed ************ Model::************>
38{
39 static void failed() { ((Model*)0)->~Model(); }
40};
41
42# ifdef BOOST_OLD_CONCEPT_SUPPORT
43
44template <class Model>
45struct constraint
46{
47 static void failed() { ((Model*)0)->constraints(); }
48};
49
50template <class Model>
51struct 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
62template <class Model>
63struct 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