#include #if !BOOST_PP_VARIADICS # error "this compiler does not support variadic macros" #else #define BOOST_CONTRACT_EXT_PP_CLASS_TRAITS_AUX_INDEX_TEST \ BOOST_CONTRACT_EXT_PP_CLASS_TRAITS_AUX_BASES_INDEX #include "../aux_/pp_traits.hpp" #include "../aux_/pp_1tuple_rem.hpp" #include #include #include #include #include #include #include #define BOOST_CONTRACT_TEST_BASE_(r, unused, i, base_traits) \ BOOST_PP_COMMA_IF(i) \ BOOST_CONTRACT_EXT_PP_BASE_TRAITS_ACCESS(base_traits) \ BOOST_CONTRACT_EXT_PP_BASE_TRAITS_VIRTUAL(base_traits) \ BOOST_CONTRACT_TEST_AUX_PP_1TUPLE_REM( \ BOOST_CONTRACT_EXT_PP_BASE_TRAITS_TYPE(base_traits)) #define BOOST_CONTRACT_TEST_BASES_YES_(class_traits) \ extends( \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONTRACT_TEST_BASE_, ~, \ BOOST_CONTRACT_EXT_PP_CLASS_TRAITS_BASES(class_traits)) \ ) #define BOOST_CONTRACT_TEST_BASES_(class_traits) \ BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_IS_EMPTY( \ BOOST_CONTRACT_EXT_PP_CLASS_TRAITS_BASES(class_traits)), \ BOOST_PP_TUPLE_EAT(1) \ , \ BOOST_CONTRACT_TEST_BASES_YES_ \ )(class_traits) #define BOOST_CONTRACT_TEST_EQUAL_(extends, parsed_extends) \ BOOST_CONTRACT_TEST_AUX_PP_TRAITS( \ BOOST_CONTRACT_TEST_BASES_, \ BOOST_CONTRACT_EXT_PP_CLASS_TRAITS_PARSE_D, \ template( typename T, (std::map::value_type) V ) \ class (a), \ extends, \ BOOST_PP_EMPTY(), \ parsed_extends \ ) #define BOOST_CONTRACT_TEST_(extends) \ BOOST_CONTRACT_TEST_EQUAL_(extends, extends) int main ( ) { BOOST_CONTRACT_TEST_( BOOST_PP_EMPTY() ) BOOST_CONTRACT_TEST_( extends( b ) ) BOOST_CONTRACT_TEST_( extends( virtual b ) ) BOOST_CONTRACT_TEST_( extends( public b ) ) BOOST_CONTRACT_TEST_( extends( public virtual b ) ) BOOST_CONTRACT_TEST_EQUAL_( extends( virtual public b ), extends( public virtual b ) ) BOOST_CONTRACT_TEST_( extends( protected b ) ) BOOST_CONTRACT_TEST_( extends( protected virtual b ) ) BOOST_CONTRACT_TEST_EQUAL_( extends( virtual protected b ), extends( protected virtual b ) ) BOOST_CONTRACT_TEST_( extends( private b ) ) BOOST_CONTRACT_TEST_( extends( private virtual b ) ) BOOST_CONTRACT_TEST_EQUAL_( extends( virtual private b ), extends( private virtual b ) ) // Test base type with commas. BOOST_CONTRACT_TEST_( extends( (std::map) ) ) BOOST_CONTRACT_TEST_( extends( public virtual (std::map) ) ) // Test multiple inheritance (and a bit of everything together). BOOST_CONTRACT_TEST_EQUAL_( extends( b, virtual c, public d, protected virtual d, virtual private (std::map::value_type) ), extends( b, virtual c, public d, protected virtual d, private virtual (std::map::value_type) ) ) return BOOST_CONTRACT_TEST_AUX_PP_TRAITS_REPORT_ERRORS; } #endif // variadics