File indexing completed on 2025-12-16 09:45:03
0001
0002 #ifndef BOOST_CONTRACT_OVERRIDE_HPP_
0003 #define BOOST_CONTRACT_OVERRIDE_HPP_
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <boost/contract/core/config.hpp>
0016 #include <boost/preprocessor/cat.hpp>
0017 #include <boost/preprocessor/config/config.hpp>
0018
0019 #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #define BOOST_CONTRACT_NAMED_OVERRIDE(type_name, func_name)
0042 #elif !defined(BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS)
0043 #include <boost/contract/core/virtual.hpp>
0044 #include <boost/contract/detail/type_traits/mirror.hpp>
0045 #include <boost/contract/detail/tvariadic.hpp>
0046 #include <boost/contract/detail/none.hpp>
0047 #include <boost/contract/detail/name.hpp>
0048
0049
0050
0051 #define BOOST_CONTRACT_OVERRIDE_CALL_BASE_(z, arity, arity_compl, \
0052 func_name) \
0053 template< \
0054 class BOOST_CONTRACT_DETAIL_NAME1(B), \
0055 class BOOST_CONTRACT_DETAIL_NAME1(C) \
0056 BOOST_CONTRACT_DETAIL_TVARIADIC_COMMA(arity) \
0057 BOOST_CONTRACT_DETAIL_TVARIADIC_TPARAMS_Z(z, arity, \
0058 BOOST_CONTRACT_DETAIL_NAME1(Args)) \
0059 > \
0060 static void BOOST_CONTRACT_DETAIL_NAME1(call_base)( \
0061 boost::contract::virtual_* BOOST_CONTRACT_DETAIL_NAME1(v), \
0062 BOOST_CONTRACT_DETAIL_NAME1(C)* BOOST_CONTRACT_DETAIL_NAME1(obj) \
0063 BOOST_CONTRACT_DETAIL_TVARIADIC_COMMA(arity) \
0064 BOOST_CONTRACT_DETAIL_TVARIADIC_FPARAMS_Z(z, arity, \
0065 BOOST_CONTRACT_DETAIL_NAME1(Args), \
0066 &, \
0067 BOOST_CONTRACT_DETAIL_NAME1(args) \
0068 ) \
0069 BOOST_CONTRACT_DETAIL_NO_TVARIADIC_COMMA(arity_compl) \
0070 BOOST_CONTRACT_DETAIL_NO_TVARIADIC_ENUM_Z(z, arity_compl, \
0071 boost::contract::detail::none&) \
0072 ) { \
0073 BOOST_CONTRACT_DETAIL_NAME1(obj)-> \
0074 BOOST_CONTRACT_DETAIL_NAME1(B)::func_name( \
0075 BOOST_CONTRACT_DETAIL_TVARIADIC_ARGS_Z(z, arity, \
0076 BOOST_CONTRACT_DETAIL_NAME1(args)) \
0077 BOOST_CONTRACT_DETAIL_TVARIADIC_COMMA(arity) \
0078 BOOST_CONTRACT_DETAIL_NAME1(v) \
0079 ); \
0080 }
0081
0082 #if BOOST_CONTRACT_DETAIL_TVARIADIC
0083 #define BOOST_CONTRACT_OVERRIDE_CALL_BASE_DECL_(func_name) \
0084 BOOST_CONTRACT_OVERRIDE_CALL_BASE_(1, ~, ~, func_name)
0085 #else
0086 #include <boost/preprocessor/repetition/repeat.hpp>
0087 #include <boost/preprocessor/arithmetic/inc.hpp>
0088 #include <boost/preprocessor/arithmetic/sub.hpp>
0089
0090 #define BOOST_CONTRACT_OVERRIDE_CALL_BASE_DECL_(func_name) \
0091 BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_CONTRACT_MAX_ARGS), \
0092 BOOST_CONTRACT_OVERRIDE_CALL_BASE_ARITY_, func_name) \
0093
0094 #define BOOST_CONTRACT_OVERRIDE_CALL_BASE_ARITY_(z, arity, func_name) \
0095 BOOST_CONTRACT_OVERRIDE_CALL_BASE_(z, arity, \
0096 BOOST_PP_SUB(BOOST_CONTRACT_MAX_ARGS, arity), func_name)
0097 #endif
0098
0099
0100
0101 #define BOOST_CONTRACT_NAMED_OVERRIDE(type_name, func_name) \
0102 struct type_name { \
0103 BOOST_CONTRACT_DETAIL_MIRROR_HAS_MEMBER_FUNCTION( \
0104 BOOST_CONTRACT_DETAIL_NAME1(has_member_function), \
0105 func_name \
0106 ) \
0107 BOOST_CONTRACT_OVERRIDE_CALL_BASE_DECL_(func_name) \
0108 };
0109 #else
0110 #define BOOST_CONTRACT_NAMED_OVERRIDE(type_name, func_name) \
0111 struct type_name {};
0112 #endif
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137 #define BOOST_CONTRACT_OVERRIDE(func_name) \
0138 BOOST_CONTRACT_NAMED_OVERRIDE(BOOST_PP_CAT(override_, func_name), func_name)
0139
0140 #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168 #define BOOST_CONTRACT_OVERRIDES(...)
0169 #elif BOOST_PP_VARIADICS
0170 #include <boost/preprocessor/seq/for_each.hpp>
0171 #include <boost/preprocessor/variadic/to_seq.hpp>
0172
0173
0174
0175 #define BOOST_CONTRACT_OVERRIDES_SEQ_(r, unused, func_name) \
0176 BOOST_CONTRACT_OVERRIDE(func_name)
0177
0178
0179
0180 #define BOOST_CONTRACT_OVERRIDES(...) \
0181 BOOST_PP_SEQ_FOR_EACH(BOOST_CONTRACT_OVERRIDES_SEQ_, ~, \
0182 BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
0183 #else
0184 #define BOOST_CONTRACT_OVERRIDES \
0185 BOOST_CONTRACT_ERROR_macro_OVERRIDES_requires_variadic_macros_otherwise_manually_repeat_OVERRIDE_macro
0186 #endif
0187
0188 #endif
0189