mirror of
https://github.com/boostorg/contract.git
synced 2026-02-27 04:52:22 +00:00
started pp parsing of assertions
This commit is contained in:
@@ -108,7 +108,8 @@ entries = [
|
||||
'extends',
|
||||
'verbatim',
|
||||
'ref',
|
||||
'refref'
|
||||
'refref',
|
||||
'as'
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_ \
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) \
|
||||
( \
|
||||
|
||||
Reference in New Issue
Block a user