parsing exception specifications and virtual specifiers

This commit is contained in:
Lorenzo Caminiti
2015-01-13 19:05:56 -08:00
parent aaac02844e
commit 8e1c68eefa
11 changed files with 290 additions and 18 deletions

View File

@@ -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), \

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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