mirror of
https://github.com/boostorg/contract.git
synced 2026-02-27 17:02:15 +00:00
parsing exception specifications and virtual specifiers
This commit is contained in:
@@ -3,21 +3,43 @@
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_HPP_
|
||||
|
||||
#include <boost/contract/ext_/preprocessor/paren/front.hpp>
|
||||
#include <boost/preprocessor/control/iif.hpp>
|
||||
#include <boost/preprocessor/tuple/rem.hpp>
|
||||
#include <boost/preprocessor/tuple/eat.hpp>
|
||||
#include <boost/preprocessor/control/iif.hpp>
|
||||
#include <boost/preprocessor/control/expr_iif.hpp>
|
||||
|
||||
/* PRIVATE */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_FRONT_(tokens) \
|
||||
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_HAS_PAREN(tokens), \
|
||||
BOOST_CONTRACT_EXT_PP_PAREN_FRONT \
|
||||
, \
|
||||
BOOST_PP_TUPLE_EAT(1) \
|
||||
)(tokens)
|
||||
|
||||
// Precondition: tokens = `keyword ...`
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_( \
|
||||
tokens, remove_keyword_macro) \
|
||||
BOOST_CONTRACT_EXT_PP_PAREN_FRONT(remove_keyword_macro(tokens))
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_FRONT_( \
|
||||
remove_keyword_macro(tokens))
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_SKIP_EAT_(tokens) \
|
||||
BOOST_PP_EXPR_IIF(BOOST_CONTRACT_EXT_PP_HAS_PAREN(tokens), \
|
||||
BOOST_PP_TUPLE_EAT(0) \
|
||||
) \
|
||||
tokens
|
||||
|
||||
// Precondition: tokens = `keyword ...`
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_SKIP_( \
|
||||
tokens, remove_keyword_macro) \
|
||||
BOOST_PP_TUPLE_EAT(0) remove_keyword_macro(tokens)
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_SKIP_EAT_( \
|
||||
remove_keyword_macro(tokens))
|
||||
|
||||
/* PUBLIC */
|
||||
|
||||
|
||||
// If tokens = `keyword(,,,) ...` expand to `(,,,)`, otherwise (i.e., both no
|
||||
// keyword `(,,,) ...` and keyword with no parenthesis `keyword ...`) expand to
|
||||
// EMPTY().
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN( \
|
||||
tokens, is_keyword_macro, remove_keyword_macro) \
|
||||
BOOST_PP_IIF(is_keyword_macro(tokens), \
|
||||
@@ -26,6 +48,7 @@
|
||||
BOOST_PP_TUPLE_EAT(2) \
|
||||
)(tokens, remove_keyword_macro)
|
||||
|
||||
// Expand tokens = `keyword(,,,) ...` and `keyword ...` to `...`.
|
||||
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_SKIP( \
|
||||
tokens, is_keyword_macro, remove_keyword_macro) \
|
||||
BOOST_PP_IIF(is_keyword_macro(tokens), \
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#ifndef BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_HPP_
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_HPP_
|
||||
|
||||
#include <boost/contract/ext_/preprocessor/traits/func/virt_specifiers.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/func/except.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/func/ref.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/func/cv_qualifiers.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/func/params.hpp>
|
||||
@@ -26,6 +28,26 @@
|
||||
// NOTE: These macros #definitions read TRITS_FUNC instead of FUNC_TRAITS to
|
||||
// avoid name clashes with macro #define in func/*.
|
||||
|
||||
#if defined(BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_INDEX_TEST) && \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_INDEX_TEST < \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_VIRT_SPECIFIERS_INDEX
|
||||
# define BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_VIRT_SPECIFIERS_(sign_traits) \
|
||||
sign_traits
|
||||
#else
|
||||
# define BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_VIRT_SPECIFIERS_(sign_traits) \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VIRT_SPECIFIERS_PARSE(sign_traits)
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_INDEX_TEST) && \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_INDEX_TEST < \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_EXCEPT_INDEX
|
||||
# define BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_EXCEPT_(sign_traits) \
|
||||
sign_traits
|
||||
#else
|
||||
# define BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_EXCEPT_(sign_traits) \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_PARSE(sign_traits)
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_INDEX_TEST) && \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_INDEX_TEST < \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_REF_INDEX
|
||||
@@ -143,6 +165,8 @@
|
||||
// WARNING: Order of these macros must match ..._INDEX values (see index.hpp).
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS(sign) \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_DONE_( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_VIRT_SPECIFIERS_( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_EXCEPT_( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_REF_( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_CV_QUALIFIERS_( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_PARAMS_( \
|
||||
@@ -155,7 +179,7 @@
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_ACCESS_( \
|
||||
BOOST_CONTRACT_EXT_PP_SIGN_TRAITS_INIT( \
|
||||
sign \
|
||||
))))))))))))
|
||||
))))))))))))))
|
||||
|
||||
#endif // #include guard
|
||||
|
||||
|
||||
@@ -38,7 +38,14 @@
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_REF_INDEX 17
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_DONE_INDEX 18
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_EXCEPT_INDEX 18
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_FINAL_INDEX 19
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_OVERRIDE_INDEX 20
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_VIRT_SPECIFIERS_INDEX \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_OVERRIDE_INDEX
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_DONE_INDEX 21
|
||||
|
||||
#endif // #include guard
|
||||
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
|
||||
#ifndef BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_HPP_
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_HPP_
|
||||
|
||||
#include <boost/contract/ext_/preprocessor/traits/adt.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/aux_/keyword_paren.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/keyword/noexcept.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/keyword/throw.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/utility/expand.hpp>
|
||||
#include <boost/preprocessor/control/iif.hpp>
|
||||
#include <boost/preprocessor/facilities/empty.hpp>
|
||||
|
||||
/* PRIVATE */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_( \
|
||||
sign, traits, keyword, is_keyword_macro, remove_keyword_macro) \
|
||||
( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_SKIP(sign, \
|
||||
is_keyword_macro, remove_keyword_macro) \
|
||||
, \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
|
||||
traits, \
|
||||
keyword \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN(sign, \
|
||||
is_keyword_macro, remove_keyword_macro) \
|
||||
BOOST_PP_EMPTY \
|
||||
) \
|
||||
)
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_NONE_(sign, traits) \
|
||||
(sign, BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, BOOST_PP_EMPTY))
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_NOEXCEPT_(sign, traits) \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_(sign, traits, \
|
||||
noexcept, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_IS_NOEXCEPT_FRONT, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_NOEXCEPT_REMOVE_FRONT \
|
||||
)
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_THROW_(sign, traits) \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_(sign, traits, \
|
||||
throw, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_IS_THROW_FRONT, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_THROW_REMOVE_FRONT \
|
||||
)
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_PARSE_ARGS_(sign, traits) \
|
||||
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_NOEXCEPT_FRONT(sign), \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_NOEXCEPT_ \
|
||||
, BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_THROW_FRONT(sign), \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_THROW_ \
|
||||
, \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_NONE_ \
|
||||
))(sign, traits)
|
||||
|
||||
/* PUBLIC */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_PARSE(sign_traits) \
|
||||
BOOST_CONTRACT_EXT_PP_EXPAND_ONCE( \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT_PARSE_ARGS_ sign_traits)
|
||||
|
||||
// Expand to `noexcept | noexcept(,,,) | throw(,,,) | EMPTY()`.
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_EXCEPT(traits) \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM( \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_EXCEPT_INDEX, traits)()
|
||||
|
||||
#endif // #include guard
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <boost/contract/ext_/preprocessor/keyword/contract/verbatim.hpp>
|
||||
#include <boost/preprocessor/facilities/empty.hpp>
|
||||
|
||||
// PRIVATE //
|
||||
/* PRIVATE */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VERBATIM_SIGN_(sign, traits) \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN_SKIP( \
|
||||
@@ -28,7 +28,7 @@
|
||||
BOOST_PP_EMPTY \
|
||||
)
|
||||
|
||||
// PUBLIC //
|
||||
/* PUBLIC */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VERBATIM_PARSE(sign_traits) \
|
||||
( \
|
||||
@@ -40,9 +40,7 @@
|
||||
// Expand to `(,,,) | EMPTY()`.
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VERBATIM(traits) \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM( \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_VERBATIM_INDEX, \
|
||||
traits \
|
||||
)()
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_VERBATIM_INDEX, traits)()
|
||||
|
||||
#endif // #include guard
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
|
||||
#ifndef BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VIRT_SPECIFIERS_HPP_
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VIRT_SPECIFIERS_HPP_
|
||||
|
||||
#include <boost/contract/ext_/preprocessor/traits/func/aux_/index.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/aux_/keyword_comb.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/traits/adt.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/keyword/final.hpp>
|
||||
#include <boost/contract/ext_/preprocessor/keyword/override.hpp>
|
||||
#include <boost/preprocessor/tuple/elem.hpp>
|
||||
#include <boost/preprocessor/control/expr_iif.hpp>
|
||||
#include <boost/preprocessor/facilities/empty.hpp>
|
||||
|
||||
/* PRIVATE */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VIRT_SPECIFIERS_( \
|
||||
sign_virt, traits) \
|
||||
( \
|
||||
BOOST_CONTRACT_EXT_PP_SIGN_TRAITS_FIRST(sign_virt) \
|
||||
, \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
|
||||
traits, \
|
||||
BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(2, 0, \
|
||||
BOOST_CONTRACT_EXT_PP_SIGN_TRAITS_SECOND(sign_virt)), \
|
||||
final \
|
||||
) \
|
||||
BOOST_PP_EMPTY \
|
||||
), \
|
||||
BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(2, 1, \
|
||||
BOOST_CONTRACT_EXT_PP_SIGN_TRAITS_SECOND(sign_virt)), \
|
||||
override \
|
||||
) \
|
||||
BOOST_PP_EMPTY \
|
||||
) \
|
||||
)
|
||||
|
||||
/* PUBLIC */
|
||||
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VIRT_SPECIFIERS_PARSE(sign_traits) \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_VIRT_SPECIFIERS_( \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD2_COMB_PARSE( \
|
||||
BOOST_CONTRACT_EXT_PP_SIGN_TRAITS_FIRST(sign_traits), \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_IS_FINAL_FRONT, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_FINAL_REMOVE_FRONT, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_IS_OVERRIDE_FRONT, \
|
||||
BOOST_CONTRACT_EXT_PP_KEYWORD_OVERRIDE_REMOVE_FRONT \
|
||||
), \
|
||||
BOOST_CONTRACT_EXT_PP_SIGN_TRAITS_SECOND(sign_traits) \
|
||||
)
|
||||
|
||||
// Expand to `final | EMPTY()`.
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_FINAL(traits) \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM( \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_FINAL_INDEX, traits)()
|
||||
|
||||
// Expand to `override | EMPTY()`.
|
||||
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_OVERRIDE(traits) \
|
||||
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM( \
|
||||
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_OVERRIDE_INDEX, traits)()
|
||||
|
||||
#endif // #include guard
|
||||
|
||||
Reference in New Issue
Block a user