started pp parsing of assertions

This commit is contained in:
Lorenzo Caminiti
2015-01-16 03:06:13 -08:00
parent 0a5539459d
commit e893cb1da1
18 changed files with 738 additions and 28 deletions

View File

@@ -108,7 +108,8 @@ entries = [
'extends',
'verbatim',
'ref',
'refref'
'refref',
'as'
]
}
]

View File

@@ -0,0 +1,48 @@
#ifndef BOOST_CONTRACT_EXT_PP_KEYWORD_AS_HPP_
#define BOOST_CONTRACT_EXT_PP_KEYWORD_AS_HPP_
// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
// Instead, modify and run related generation script "keyword-generate.py".
#include <boost/contract/ext_/preprocessor/keyword/utility/is.hpp>
#include <boost/contract/ext_/preprocessor/keyword/utility/remove.hpp>
/* PRIVATE */
// Must expand to a single comma `,` (not local macros, do not #undefine).
#define BOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_COMMAas ,
#define asBOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_COMMA ,
// Must expand to empty `` (not local macros, do not #undefine).
#define BOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_EMPTYas
#define asBOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_EMPTY
/* PUBLIC */
// Precondition: tokens must start with a token concatenable to a macro name
// (e.g., a literal or integral token) or with parenthesis.
#define BOOST_CONTRACT_EXT_PP_KEYWORD_IS_AS_FRONT(tokens) \
BOOST_CONTRACT_EXT_PP_KEYWORD_UTILITY_IS_FRONT( \
BOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_COMMA, tokens)
// Precondition: tokens must end with a token concatenable to a macro name
// (e.g., a literal or integral token) or with parenthesis.
#define BOOST_CONTRACT_EXT_PP_KEYWORD_IS_AS_BACK(tokens) \
BOOST_CONTRACT_EXT_PP_KEYWORD_UTILITY_IS_BACK( \
BOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_COMMA, tokens)
// Precondition: tokens must start with `as` (this can be
// checked with `..._IS_AS_FRONT` macro above).
#define BOOST_CONTRACT_EXT_PP_KEYWORD_AS_REMOVE_FRONT(tokens) \
BOOST_CONTRACT_EXT_PP_KEYWORD_UTILITY_REMOVE_FRONT( \
BOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_EMPTY, tokens)
// Precondition: tokens must end with `as` (this can be
// checked with `..._IS_AS_BACK` macro above).
#define BOOST_CONTRACT_EXT_PP_KEYWORD_AS_REMOVE_BACK(tokens) \
BOOST_CONTRACT_EXT_PP_KEYWORD_UTILITY_REMOVE_BACK( \
BOOST_CONTRACT_EXT_PP_KEYWORD_AS_CAT_TO_EMPTY, tokens)
#endif // #include guard

View File

@@ -37,7 +37,8 @@
// Declaration and traits (2-tuple).
// Create a `decl_traits` data structure to start parsing specified declaration.
// Implementation: Leading NIL needed to handle empty macro params (on MSVC).
// Implementation: NIL in front of traits needed to handle empty macro params
// (on MSVC).
#define BOOST_CONTRACT_EXT_PP_DECL_TRAITS_INIT(decl) (decl, BOOST_PP_NIL)
// Expand to final traits after they have been parsed from declaration.

View File

@@ -0,0 +1,23 @@
#ifndef BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND_HPP_
#define BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND_HPP_
#include <boost/contract/ext_/preprocessor/traits/adt.hpp>
/* PUBLIC */
#define BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND_SET(kind, decl_traits) \
( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_traits), kind) \
)
// Index 0 used and reserved for kind, other traits must use index 1, 2, etc.
#define BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(0, traits)
#endif // #include guard

View File

@@ -0,0 +1,76 @@
#ifndef BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_HPP_
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_HPP_
#include <boost/contract/ext_/preprocessor/traits/assertion/kind.hpp>
#include <boost/contract/ext_/preprocessor/traits/adt.hpp>
#include <boost/contract/ext_/preprocessor/keyword/namespace.hpp>
#include <boost/contract/ext_/preprocessor/keyword/contract/as.hpp>
#include <boost/contract/ext_/preprocessor/paren/front.hpp>
#include <boost/preprocessor/tuple/eat.hpp>
/* PUBLIC */
// Precondition: decl = `name`.
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_NAME_PARSE( \
decl_traits) \
( \
BOOST_PP_NIL \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_traits), \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits) \
) \
)
// NOTE: This extra macro is needed for proper expansion (on MSVC).
// Precondition: decl = `(new-name) as ...`.
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_REMOVE_PAREN_AS_(decl)\
BOOST_CONTRACT_EXT_PP_KEYWORD_AS_REMOVE_FRONT(BOOST_PP_TUPLE_EAT(1) decl)
// Precondition: decl = `namespace (new-name) as ...`.
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_NEW_NAME_PARSE( \
decl_traits) \
( \
BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_REMOVE_PAREN_AS_( \
BOOST_CONTRACT_EXT_PP_KEYWORD_NAMESPACE_REMOVE_FRONT( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST( \
decl_traits \
) \
) \
) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_traits), \
BOOST_PP_TUPLE_REM_CTOR(1, \
BOOST_CONTRACT_EXT_PP_PAREN_FRONT( \
BOOST_CONTRACT_EXT_PP_KEYWORD_NAMESPACE_REMOVE_FRONT( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits) \
) \
) \
) \
) \
)
// decl = namespace (new-name) as name
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS(decl) \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_DONE( \
BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_NAME_PARSE( \
BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_NEW_NAME_PARSE( \
BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND_SET(namespace, \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_INIT( \
decl \
)))))
// Index 0 below already used and reserved for ASSERTION_TRAITS_KIND.
// Expand to `token`.
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_NEW_NAME(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(1, traits)
// Expand to `token`.
#define BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS_NAME(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(2, traits)
#endif // #include guard

View File

@@ -0,0 +1,62 @@
#ifndef BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_HPP_
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_HPP_
/* PRIVATE */
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NAME_PARSE_( \
decl_type, traits) \
( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_type) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_type)) \
)
/* PUBLIC */
// Precondition: decl = `new-name`.
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NEW_NAME_PARSE( \
decl_traits) \
( \
BOOST_PP_NIL \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_traits), \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits) \
) \
)
// Precondition: decl = `typedef wrapped-type ...`.
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NAME_PARSE(decl_traits) \
BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NAME_PARSE_( \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_TYPE( \
BOOST_CONTRACT_EXT_PP_KEYWORD_TYPEDEF_REMOVE_FRONT( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits) \
) \
), \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_traits) \
)
// decl = typedef wrapped-type new-name
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS(decl) \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_DONE( \
BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NEW_NAME_PARSE( \
BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NAME_PARSE( \
BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND_SET(typedef, \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_INIT( \
decl \
)))))
// Index 0 below already used and reserved for ASSERTION_TRAITS_KIND.
// Expand to `(,,,)`.
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NAME(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(1, traits)
// Expand to `token`.
#define BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS_NEW_NAME(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(2, traits)
#endif // #include guard

View File

@@ -0,0 +1,174 @@
#ifndef BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_HPP_
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_HPP_
#include <boost/contract/ext_/preprocessor/traits/assertion/kind.hpp>
#include <boost/contract/ext_/preprocessor/traits/adt.hpp>
#include <boost/contract/ext_/preprocessor/keyword/namespace.hpp>
#include <boost/contract/ext_/preprocessor/keyword/contract/as.hpp>
#include <boost/contract/ext_/preprocessor/paren/front.hpp>
#include <boost/preprocessor/tuple/eat.hpp>
/* PRIVATE */
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_NAME_PAREN_(name) \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_HAS_PAREN(name), \
name \
, \
(name) \
)
// Precondition: decl = `(new-name) as ...`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_YES_( \
decl, traits) \
( \
BOOST_CONTRACT_EXT_PP_KEYWORD_AS_REMOVE_FRONT( \
BOOST_PP_TUPLE_EAT(1) decl) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, \
BOOST_CONTRACT_EXT_PP_PAREN_FRONT(decl) BOOST_PP_EMPTY) \
)
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_NO_( \
decl, traits) \
(decl, BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, BOOST_PP_EMPTY))
// Precondition: decl = `(new-name) ...`.
// Implementation: NIL after decl in case EAT removes last tokens in decl.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_MAYBE_( \
decl, traits) \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_AS_FRONT( \
BOOST_PP_TUPLE_EAT(1) decl BOOST_PP_NIL), \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_YES_ \
, \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_NO_ \
)(decl, traits)
// Precondition: decl = `using namespace ...`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE_YES_( \
decl, traits) \
( \
BOOST_CONTRACT_EXT_PP_KEYWORD_NAMESPACE_REMOVE_FRONT( \
BOOST_CONTRACT_EXT_PP_KEYWORD_USING_REMOVE_FRONT(decl)) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, \
namespace BOOST_PP_EMPTY) \
)
// Precondition: decl = `using ...`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE_NO_( \
decl, traits) \
( \
BOOST_CONTRACT_EXT_PP_KEYWORD_USING_REMOVE_FRONT(decl) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, BOOST_PP_EMPTY) \
)
// Precondition: decl = `template( ,,, ) ...`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS_YES_( \
decl, traits) \
( \
BOOST_PP_TUPLE_EAT(0) \
BOOST_CONTRACT_EXT_PP_KEYWORD_TEMPLATE_REMOVE_FRONT(decl) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
traits, \
BOOST_CONTRACT_EXT_PP_PAREN_FRONT( \
BOOST_CONTRACT_EXT_PP_KEYWORD_TEMPLATE_REMOVE_FRONT(decl)) \
BOOST_PP_EMPTY \
) \
)
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS_NO_( \
decl, traits) \
(decl, BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, BOOST_PP_EMPTY))
/* PUBLIC */
// Precondition: decl = `wrapped-name`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAME_PARSE( \
decl_traits) \
( \
BOOST_PP_NIL \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_traits), \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_NAME_PAREN_( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits)) \
) \
)
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_PARSE( \
decl_traits) \
BOOST_PP_EXPAND( \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_HAS_PAREN( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits)), \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_MAYBE_ \
, \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_NO_ \
) decl_traits \
)
// Precondition: decl = `using ...`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE_PARSE( \
decl_traits) \
BOOST_PP_EXPAND( \
BOOST_PP_IIF( \
BOOST_CONTRACT_EXT_PP_KEYWORD_IS_NAMESPACE_FRONT( \
BOOST_CONTRACT_EXT_PP_KEYWORD_USING_REMOVE_FRONT( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST( \
decl_traits \
))) \
, \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE_YES_ \
, \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE_NO_ \
) decl_traits \
)
// TODO: Do I really need all these PP_EXPAND here?
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS_PARSE( \
decl_traits) \
BOOST_PP_EXPAND( \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_TEMPLATE_FRONT( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_traits)), \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS_YES_ \
, \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS_NO_ \
) decl_traits \
)
// decl = [template( c++-template-parameter, ... )]
// using [namespace | (new-name) as] wrapped-name
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS(decl) \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_DONE( \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAME_PARSE( \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME_PARSE( \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE_PARSE( \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS_PARSE( \
BOOST_CONTRACT_EXT_PP_ASSERTION_TRAITS_KIND_SET(using, \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_INIT( \
decl \
)))))))
// Index 0 below already used and reserved for ASSERTION_TRAITS_KIND.
// Expand to `(,,,) | EMPTY()`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_TEMPLATE_PARAMS(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(1, traits)()
// Expand to `namespace | EMPTY()`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAMESPACE(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(2, traits)()
// Expand to `token | EMPTY()`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NEW_NAME(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(3, traits)()
// Expand to `(,,,)`.
#define BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS_NAME(traits) \
BOOST_CONTRACT_EXT_PP_TRAITS_ELEM(4, traits)
#endif // #include guard

View File

@@ -0,0 +1,86 @@
#ifndef BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_HPP_
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_HPP_
#include <boost/contract/ext_/preprocessor/traits/assertion/typedef.hpp>
#include <boost/contract/ext_/preprocessor/traits/assertion/using.hpp>
#include <boost/contract/ext_/preprocessor/traits/assertion/namespace.hpp>
#include <boost/contract/ext_/preprocessor/traits/aux_/enum_to_seq.hpp>
#include <boost/contract/ext_/preprocessor/keyword/namespace.hpp>
#include <boost/contract/ext_/preprocessor/keyword/using.hpp>
#include <boost/contract/ext_/preprocessor/keyword/typedef.hpp>
/* PRIVATE */
// TODO: To be correct, I should probably check that using is after
// template(,,,) here, and not just check IS_TEMPLATE_FRONT...
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_APPEND_ASSERTION_( \
s, decl, a, d, allow_oldof, allow_return, traits) \
( \
a, \
d, \
allow_oldof, \
allow_return, \
BOOST_PP_LIST_APPEND_D( \
d, \
traits, \
( \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_NAMESPACE_FRONT( \
decl), \
BOOST_CONTRACT_EXT_PP_NAMESPACE_ASSERTION_TRAITS \
, BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_USING_FRONT( \
decl), \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS \
, BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_TEMPLATE_FRONT(\
decl), \
BOOST_CONTRACT_EXT_PP_USING_ASSERTION_TRAITS \
, BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_TYPEDEF_FRONT( \
decl), \
BOOST_CONTRACT_EXT_PP_TYPEDEF_ASSERTION_TRAITS \
, \
BOOST_CONTRACT_EXT_PP_BOOL_ASSERTION_TRAITS \
))))(decl), \
BOOST_PP_NIL \
) \
) \
)
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_ASSERTION_( \
s, a_d_oldof_return_traits, decl) \
BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_APPEND_ASSERTION_( \
s, \
decl, \
BOOST_PP_TUPLE_ELEM(5, 0, a_d_oldof_return_traits), \
BOOST_PP_TUPLE_ELEM(5, 1, a_d_oldof_return_traits), \
BOOST_PP_TUPLE_ELEM(5, 2, a_d_oldof_return_traits), \
BOOST_PP_TUPLE_ELEM(5, 3, a_d_oldof_return_traits), \
BOOST_PP_TUPLE_ELEM(5, 4, a_d_oldof_return_traits) \
)
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_( \
a, d, s, allow_oldof, allow_return, decl) \
BOOST_PP_SEQ_FOLD_LEFT_ ## s( \
BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_ASSERTION_, \
(a, d, allow_oldof, allow_return, BOOST_PP_NIL), \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ decl \
)
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_A_D_S_( \
a, d, s, allow_oldof, allow_return, decl) \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_IS_EMPTY decl, \
BOOST_PP_NIL BOOST_PP_TUPLE_EAT(6) \
, \
BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_ \
)(a, d, s, allow_oldof, allow_return, decl)
/* PUBLIC */
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_A_D_S(a, d, s, decl) \
BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_A_D_S_(a, d, s, 1, 1, decl)
#define BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS(decl) \
BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS_A_D_S(1, 1, 1, decl)
#endif // #include guard

View File

@@ -0,0 +1,46 @@
#ifndef BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_HPP_
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_HPP_
#include <boost/contract/ext_/preprocessor/utility/nil.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#include <boost/preprocessor/seq/pop_back.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/tuple/eat.hpp>
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/preprocessor/control/iif.hpp>
// NOTE: This algorithm is not so generic because it requires that the
// enumerated elements can be checked using IS_NIL (that assumption is usually
// only true for declaration traits so this is programmed here in the traits).
/* PRIVATE */
// Wrapped with parenthesis after removal of NIL so to make it a pp-seq elem.
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_REMOVE_NIL_(back) \
(BOOST_CONTRACT_EXT_PP_NIL_REMOVE_BACK(back))
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_BACK_(seq, back) \
BOOST_PP_SEQ_POP_BACK(seq) \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_IS_NIL_FRONT(back), \
BOOST_PP_TUPLE_EAT(1) \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_REMOVE_NIL_ \
)(back)
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_(seq) \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_BACK_(seq, \
BOOST_PP_SEQ_ELEM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq))
/* PUBLIC */
// Expand `x, ..., y[,]` (note a trailing commas is optionally allowed similarly
// to C++ enum declarations) to `(x)...(y)`.
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ(...) \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_ENUM_TO_SEQ_( \
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__ BOOST_PP_NIL))
#endif // #include guard

View File

@@ -115,11 +115,12 @@
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_PARAMS_ \
)(d, s, allow_void, decl, param_parse_macro, default_replace_macro)
// Handle `decl == ()` (i.e., empty parameters).
// Handle `decl == ( )` (i.e., empty parameters).
// Precondition: decl is 1-tuple.
#define BOOST_CONTRACT_EXT_PP_TRAITS_AUX_PARAMS_HANDLE_EMPTY_( \
d, s, allow_void, decl, param_parse_macro, default_replace_macro) \
BOOST_PP_IIF(BOOST_PP_IS_EMPTY(BOOST_PP_TUPLE_REM_CTOR(decl)), \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_IS_EMPTY( \
BOOST_PP_TUPLE_REM_CTOR(1, decl)), \
BOOST_PP_NIL BOOST_PP_TUPLE_EAT(6) \
, BOOST_PP_IIF(allow_void, \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_PARAMS_HANDLE_VOID_ \

View File

@@ -2,6 +2,7 @@
#ifndef BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_HPP_
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_HPP_
#include <boost/contract/ext_/preprocessor/traits/func/precondition.hpp>
#include <boost/contract/ext_/preprocessor/traits/func/virt.hpp>
#include <boost/contract/ext_/preprocessor/traits/func/except.hpp>
#include <boost/contract/ext_/preprocessor/traits/func/ref.hpp>
@@ -27,6 +28,16 @@
// 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_PRECONDITION_INDEX
# define BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_PRECONDITION_PARSE_(decl_traits) \
decl_traits
#else
# define BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_PRECONDITION_PARSE_(decl_traits) \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_PARSE(decl_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_VIRT_INDEX
@@ -176,6 +187,7 @@
// WARNING: Order of these macros must match ..._INDEX values (see index.hpp).
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS(decl) \
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_DONE_( \
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_PRECONDITION_PARSE_( \
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_VIRT_PARSE_( \
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_TRAILING_RETURN_PARSE_( \
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_EXCEPT_PARSE_( \
@@ -191,7 +203,7 @@
BOOST_CONTRACT_EXT_PP_TRAITS_FUNC_ACCESS_PARSE_( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_INIT( \
decl \
)))))))))))))))
))))))))))))))))
#endif // #include guard

View File

@@ -44,7 +44,9 @@
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_VIRT_INDEX \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_OVERRIDE_INDEX
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_DONE_INDEX 22
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_PRECONDITION_INDEX 22
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_AUX_DONE_INDEX 23
#endif // #include guard

View File

@@ -0,0 +1,47 @@
#ifndef BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_HPP_
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_HPP_
#include <boost/contract/ext_/preprocessor/traits/assertions.hpp>
#include <boost/contract/ext_/preprocessor/keyword/contract/precondition.hpp>
/* PRIVATE */
// Precondition: decl = `(,,,) ...` from `precondition(,,,) ...` originally in
// decl. This macro will also parse `(,,,)` into a pp-list of assertion traits.
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_(decl, traits) \
( \
BOOST_PP_TUPLE_EAT(0) decl \
, \
BOOST_CONTRACT_EXT_PP_ASSERTIONS_TRAITS( \
BOOST_CONTRACT_EXT_PP_PAREN_FRONT(decl)) \
)
// Precondition: decl = `precondition(,,,) ...`.
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_YES_(decl, traits) \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_( \
BOOST_CONTRACT_EXT_PP_KEYWORD_PRECONDITION_REMOVE_FRONT(decl), \
traits \
)
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_NO_(decl, traits) \
(decl, BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK(traits, BOOST_PP_NIL))
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_PARSE_ARGS_( \
decl, traits) \
BOOST_PP_IIF(BOOST_CONTRACT_EXT_PP_KEYWORD_IS_PRECONDITION_FRONT(decl), \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_YES_ \
, \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_NO_ \
)(decl, traits)
/* PUBLIC */
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_PARSE(decl_traits) \
BOOST_CONTRACT_EXT_PP_EXPAND_ONCE( \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_PRECONDITION_PARSE_ARGS_ \
decl_traits \
)
#endif // #include guard

View File

@@ -3,19 +3,20 @@
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_TEMPLATE_HPP_
#include <boost/contract/ext_/preprocessor/traits/params.hpp>
#include <boost/contract/ext_/preprocessor/traits/aux_/keyword_paren.hpp>
#include <boost/contract/ext_/preprocessor/traits/adt.hpp>
#include <boost/contract/ext_/preprocessor/keyword/template.hpp>
#include <boost/contract/ext_/preprocessor/paren/front.hpp>
#include <boost/preprocessor/tuple/eat.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
/* PRIVATE */
// params = `(,,,)` from `template(,,,) ...` originally in decl, and now this
// also parses params into a pp-list of actual template parameter traits.
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_TEMPLATE_(decl_params, traits) \
// Precondition: decl = `(,,,) ...` from `template(,,,) ...` originally in decl.
// This macro will also parse `(,,,)` into a pp-list of template param traits.
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_TEMPLATE_(decl, traits) \
( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_FIRST(decl_params) \
BOOST_PP_TUPLE_EAT(0) decl \
, \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
BOOST_CONTRACT_EXT_PP_TRAITS_PUSH_BACK( \
@@ -23,19 +24,14 @@
template BOOST_PP_EMPTY \
), \
BOOST_CONTRACT_EXT_PP_TEMPLATE_PARAMS_TRAITS( \
BOOST_CONTRACT_EXT_PP_DECL_TRAITS_SECOND(decl_params)) \
BOOST_CONTRACT_EXT_PP_PAREN_FRONT(decl)) \
) \
)
// Precondition: decl = `template(,,,) ...`.
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_TEMPLATE_YES_(decl, traits) \
BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_TEMPLATE_( \
BOOST_CONTRACT_EXT_PP_TRAITS_AUX_KEYWORD_PAREN( \
decl, \
BOOST_CONTRACT_EXT_PP_KEYWORD_IS_TEMPLATE_FRONT, \
BOOST_CONTRACT_EXT_PP_KEYWORD_TEMPLATE_REMOVE_FRONT \
), \
traits \
)
BOOST_CONTRACT_EXT_PP_KEYWORD_TEMPLATE_REMOVE_FRONT(decl), traits)
#define BOOST_CONTRACT_EXT_PP_FUNC_TRAITS_TEMPLATE_NO_(decl, traits) \
( \