... | ... |
@@ -30,76 +30,48 @@ |
30 | 30 |
// 02 April 2001: Removed limits header altogether. (Jeremy Siek) |
31 | 31 |
// 01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock) |
32 | 32 |
// |
33 | 33 |
|
34 | 34 |
// See http://www.boost.org/libs/concept_check for documentation. |
35 | 35 |
|
36 |
#ifndef LEMON_CONCEPT_CHECKS_H |
|
37 |
#define LEMON_CONCEPT_CHECKS_H |
|
36 |
///\file |
|
37 |
///\brief Basic utilities for concept checking. |
|
38 |
/// |
|
39 |
///\todo Are we still using BOOST concept checking utility? |
|
40 |
///Is the BOOST copyright notice necessary? |
|
41 |
|
|
42 |
#ifndef LEMON_CONCEPT_CHECK_H |
|
43 |
#define LEMON_CONCEPT_CHECK_H |
|
38 | 44 |
|
39 | 45 |
namespace lemon { |
40 | 46 |
|
41 | 47 |
/* |
42 | 48 |
"inline" is used for ignore_unused_variable_warning() |
43 | 49 |
and function_requires() to make sure there is no |
44 | 50 |
overtarget with g++. |
45 | 51 |
*/ |
46 | 52 |
|
47 | 53 |
template <class T> inline void ignore_unused_variable_warning(const T&) { } |
48 | 54 |
|
55 |
///\e |
|
49 | 56 |
template <class Concept> |
50 | 57 |
inline void function_requires() |
51 | 58 |
{ |
52 | 59 |
#if !defined(NDEBUG) |
53 | 60 |
void (Concept::*x)() = & Concept::constraints; |
54 | 61 |
ignore_unused_variable_warning(x); |
55 | 62 |
#endif |
56 | 63 |
} |
57 | 64 |
|
65 |
///\e |
|
58 | 66 |
template <typename Concept, typename Type> |
59 | 67 |
inline void checkConcept() { |
60 | 68 |
#if !defined(NDEBUG) |
61 | 69 |
typedef typename Concept::template Constraints<Type> ConceptCheck; |
62 | 70 |
void (ConceptCheck::*x)() = & ConceptCheck::constraints; |
63 | 71 |
ignore_unused_variable_warning(x); |
64 | 72 |
#endif |
65 | 73 |
} |
66 | 74 |
|
67 |
#define BOOST_CLASS_REQUIRE(type_var, ns, concept) \ |
|
68 |
typedef void (ns::concept <type_var>::* func##type_var##concept)(); \ |
|
69 |
template <func##type_var##concept Tp1_> \ |
|
70 |
struct concept_checking_##type_var##concept { }; \ |
|
71 |
typedef concept_checking_##type_var##concept< \ |
|
72 |
BOOST_FPTR ns::concept<type_var>::constraints> \ |
|
73 |
concept_checking_typedef_##type_var##concept |
|
74 |
|
|
75 |
#define BOOST_CLASS_REQUIRE2(type_var1, type_var2, ns, concept) \ |
|
76 |
typedef void (ns::concept <type_var1,type_var2>::* \ |
|
77 |
func##type_var1##type_var2##concept)(); \ |
|
78 |
template <func##type_var1##type_var2##concept Tp1_> \ |
|
79 |
struct concept_checking_##type_var1##type_var2##concept { }; \ |
|
80 |
typedef concept_checking_##type_var1##type_var2##concept< \ |
|
81 |
BOOST_FPTR ns::concept<type_var1,type_var2>::constraints> \ |
|
82 |
concept_checking_typedef_##type_var1##type_var2##concept |
|
83 |
|
|
84 |
#define BOOST_CLASS_REQUIRE3(tv1, tv2, tv3, ns, concept) \ |
|
85 |
typedef void (ns::concept <tv1,tv2,tv3>::* \ |
|
86 |
func##tv1##tv2##tv3##concept)(); \ |
|
87 |
template <func##tv1##tv2##tv3##concept Tp1_> \ |
|
88 |
struct concept_checking_##tv1##tv2##tv3##concept { }; \ |
|
89 |
typedef concept_checking_##tv1##tv2##tv3##concept< \ |
|
90 |
BOOST_FPTR ns::concept<tv1,tv2,tv3>::constraints> \ |
|
91 |
concept_checking_typedef_##tv1##tv2##tv3##concept |
|
92 |
|
|
93 |
#define BOOST_CLASS_REQUIRE4(tv1, tv2, tv3, tv4, ns, concept) \ |
|
94 |
typedef void (ns::concept <tv1,tv2,tv3,tv4>::* \ |
|
95 |
func##tv1##tv2##tv3##tv4##concept)(); \ |
|
96 |
template <func##tv1##tv2##tv3##tv4##concept Tp1_> \ |
|
97 |
struct concept_checking_##tv1##tv2##tv3##tv4##concept { }; \ |
|
98 |
typedef concept_checking_##tv1##tv2##tv3##tv4##concept< \ |
|
99 |
BOOST_FPTR ns::concept<tv1,tv2,tv3,tv4>::constraints> \ |
|
100 |
concept_checking_typedef_##tv1##tv2##tv3##tv4##concept |
|
101 |
|
|
102 |
|
|
103 | 75 |
} // namespace lemon |
104 | 76 |
|
105 |
#endif // |
|
77 |
#endif // LEMON_CONCEPT_CHECK_H |
0 comments (0 inline)