lemon/concept_check.h
changeset 76 fc178a057bbd
parent 39 0a01d811071f
child 209 765619b7cbb2
equal deleted inserted replaced
3:36895a550967 4:c8d7a9bc33f8
    31 //   01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock)
    31 //   01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock)
    32 //
    32 //
    33 
    33 
    34 // See http://www.boost.org/libs/concept_check for documentation.
    34 // See http://www.boost.org/libs/concept_check for documentation.
    35 
    35 
    36 #ifndef LEMON_CONCEPT_CHECKS_H
    36 ///\file
    37 #define LEMON_CONCEPT_CHECKS_H
    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 namespace lemon {
    45 namespace lemon {
    40 
    46 
    41   /*
    47   /*
    42     "inline" is used for ignore_unused_variable_warning()
    48     "inline" is used for ignore_unused_variable_warning()
    44     overtarget with g++.
    50     overtarget with g++.
    45   */
    51   */
    46 
    52 
    47   template <class T> inline void ignore_unused_variable_warning(const T&) { }
    53   template <class T> inline void ignore_unused_variable_warning(const T&) { }
    48 
    54 
       
    55   ///\e
    49   template <class Concept>
    56   template <class Concept>
    50   inline void function_requires()
    57   inline void function_requires()
    51   {
    58   {
    52 #if !defined(NDEBUG)
    59 #if !defined(NDEBUG)
    53     void (Concept::*x)() = & Concept::constraints;
    60     void (Concept::*x)() = & Concept::constraints;
    54     ignore_unused_variable_warning(x);
    61     ignore_unused_variable_warning(x);
    55 #endif
    62 #endif
    56   }
    63   }
    57 
    64 
       
    65   ///\e
    58   template <typename Concept, typename Type>
    66   template <typename Concept, typename Type>
    59   inline void checkConcept() {
    67   inline void checkConcept() {
    60 #if !defined(NDEBUG)
    68 #if !defined(NDEBUG)
    61     typedef typename Concept::template Constraints<Type> ConceptCheck;
    69     typedef typename Concept::template Constraints<Type> ConceptCheck;
    62     void (ConceptCheck::*x)() = & ConceptCheck::constraints;
    70     void (ConceptCheck::*x)() = & ConceptCheck::constraints;
    63     ignore_unused_variable_warning(x);
    71     ignore_unused_variable_warning(x);
    64 #endif
    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 } // namespace lemon
    75 } // namespace lemon
   104 
    76 
   105 #endif // LEMON_CONCEPT_CHECKS_H
    77 #endif // LEMON_CONCEPT_CHECK_H