File indexing completed on 2025-12-16 09:45:02
0001
0002 #ifndef BOOST_CONTRACT_BASE_TYPES_HPP_
0003 #define BOOST_CONTRACT_BASE_TYPES_HPP_
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <boost/contract/core/config.hpp>
0016 #include <boost/preprocessor/config/config.hpp>
0017
0018 #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 #define BOOST_CONTRACT_BASE_TYPES(...)
0060
0061 #elif !BOOST_PP_VARIADICS
0062
0063 #define BOOST_CONTRACT_BASE_TYPES \
0064 BOOST_CONTRACT_ERROR_macro_BASE_TYPES_requires_variadic_macros_otherwise_manually_program_base_types
0065
0066 #elif !defined(BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS)
0067
0068 #include <boost/mpl/vector.hpp>
0069 #include <boost/contract/detail/preprocessor/keyword/virtual.hpp>
0070 #include <boost/contract/detail/preprocessor/keyword/public.hpp>
0071 #include <boost/contract/detail/preprocessor/keyword/protected.hpp>
0072 #include <boost/contract/detail/preprocessor/keyword/private.hpp>
0073 #include <boost/preprocessor/variadic/to_seq.hpp>
0074 #include <boost/preprocessor/seq/fold_left.hpp>
0075 #include <boost/preprocessor/seq/enum.hpp>
0076 #include <boost/preprocessor/seq/push_back.hpp>
0077 #include <boost/preprocessor/seq/size.hpp>
0078 #include <boost/preprocessor/seq/seq.hpp> // For HEAD, TAIL, etc.
0079 #include <boost/preprocessor/tuple/elem.hpp>
0080 #include <boost/preprocessor/tuple/rem.hpp>
0081 #include <boost/preprocessor/tuple/eat.hpp>
0082 #include <boost/preprocessor/comparison/equal.hpp>
0083 #include <boost/preprocessor/control/iif.hpp>
0084 #include <boost/preprocessor/facilities/expand.hpp>
0085
0086
0087
0088 #define BOOST_CONTRACT_BASE_TYPES_REMOVE_VIRTUAL_(base) \
0089 BOOST_PP_EXPAND( \
0090 BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL(base), \
0091 BOOST_CONTRACT_DETAIL_PP_KEYWORD_REMOVE_VIRTUAL \
0092 , \
0093 BOOST_PP_TUPLE_REM(1) \
0094 )(base) \
0095 )
0096
0097 #define BOOST_CONTRACT_BASE_TYPES_PUSH_BACK_IF_(is_public, types_nilseq, base) \
0098 ( \
0099 is_public, \
0100 BOOST_PP_IIF(is_public, \
0101 BOOST_PP_SEQ_PUSH_BACK \
0102 , \
0103 types_nilseq BOOST_PP_TUPLE_EAT(2) \
0104 )(types_nilseq, base) \
0105 )
0106
0107 #define BOOST_CONTRACT_BASE_TYPES_SKIP_NOT_PUBLIC_(is_public, types_nilseq, \
0108 base) \
0109 (0, types_nilseq)
0110
0111
0112 #define BOOST_CONTRACT_BASE_TYPES_PUSH_BACK_PUBLIC_(is_public, types_nilseq, \
0113 base) \
0114 ( \
0115 1, \
0116 BOOST_PP_SEQ_PUSH_BACK(types_nilseq, \
0117 BOOST_CONTRACT_BASE_TYPES_REMOVE_VIRTUAL_( \
0118 BOOST_CONTRACT_DETAIL_PP_KEYWORD_REMOVE_PUBLIC(base)) \
0119 ) \
0120 )
0121
0122 #define BOOST_CONTRACT_BASE_TYPES_ACCESS_(is_public, types_nilseq, base) \
0123 BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC(base), \
0124 BOOST_CONTRACT_BASE_TYPES_PUSH_BACK_PUBLIC_ \
0125 , BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED(base), \
0126 BOOST_CONTRACT_BASE_TYPES_SKIP_NOT_PUBLIC_ \
0127 , BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE(base), \
0128 BOOST_CONTRACT_BASE_TYPES_SKIP_NOT_PUBLIC_ \
0129 , \
0130 BOOST_CONTRACT_BASE_TYPES_PUSH_BACK_IF_ \
0131 )))(is_public, types_nilseq, base)
0132
0133 #define BOOST_CONTRACT_BASE_TYPES_(s, public_types, base) \
0134 BOOST_CONTRACT_BASE_TYPES_ACCESS_( \
0135 BOOST_PP_TUPLE_ELEM(2, 0, public_types), \
0136 BOOST_PP_TUPLE_ELEM(2, 1, public_types), \
0137 BOOST_CONTRACT_BASE_TYPES_REMOVE_VIRTUAL_(base) \
0138 )
0139
0140 #define BOOST_CONTRACT_BASE_TYPES_RETURN_YES_(types_nilseq) \
0141 BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TAIL(types_nilseq))
0142
0143 #define BOOST_CONTRACT_BASE_TYPES_RETURN_(types_nilseq) \
0144 BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(types_nilseq), 1), \
0145 BOOST_PP_TUPLE_EAT(1) \
0146 , \
0147 BOOST_CONTRACT_BASE_TYPES_RETURN_YES_ \
0148 )(types_nilseq)
0149
0150 #define BOOST_CONTRACT_BASE_TYPES_OK_(base_tuple, bases_seq) \
0151 boost::mpl::vector< \
0152 BOOST_CONTRACT_BASE_TYPES_RETURN_(BOOST_PP_TUPLE_ELEM(2, 1, \
0153 BOOST_PP_SEQ_FOLD_LEFT( \
0154 BOOST_CONTRACT_BASE_TYPES_, \
0155 (0, (BOOST_PP_NIL)), \
0156 bases_seq \
0157 ) \
0158 )) \
0159 >
0160
0161 #define BOOST_CONTRACT_BASE_TYPES_ERR_(bases_tuple, bases_seq) \
0162 BOOST_CONTRACT_ERROR_all_bases_must_explicitly_specify_public_protected_or_private base_tuple
0163
0164 #define BOOST_CONTRACT_BASE_TYPES_IS_ACCESS_(base) \
0165 BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC(base), \
0166 1 \
0167 , BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED(base), \
0168 1 \
0169 , BOOST_PP_IIF(BOOST_CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE(base), \
0170 1 \
0171 , \
0172 0 \
0173 )))
0174
0175
0176
0177
0178
0179
0180 #define BOOST_CONTRACT_BASE_TYPES_CHECK_(bases_tuple, bases_seq) \
0181 BOOST_PP_IIF(BOOST_CONTRACT_BASE_TYPES_IS_ACCESS_( \
0182 BOOST_CONTRACT_BASE_TYPES_REMOVE_VIRTUAL_(BOOST_PP_SEQ_HEAD( \
0183 bases_seq))), \
0184 BOOST_CONTRACT_BASE_TYPES_OK_ \
0185 , \
0186 BOOST_CONTRACT_BASE_TYPES_ERR_ \
0187 )(bases_tuple, bases_seq)
0188
0189
0190
0191 #define BOOST_CONTRACT_BASE_TYPES(...) \
0192 BOOST_CONTRACT_BASE_TYPES_CHECK_((__VA_ARGS__), \
0193 BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
0194
0195 #else
0196
0197 #define BOOST_CONTRACT_BASE_TYPES(...) void
0198
0199 #endif
0200
0201 #endif
0202