Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Macro BOOST_CONTRACT_CONSTRUCTOR_PRECONDITION

BOOST_CONTRACT_CONSTRUCTOR_PRECONDITION — Program preconditions that can be disabled at compile-time for constructors.

Synopsis

// In header: <boost/contract_macro.hpp>

BOOST_CONTRACT_CONSTRUCTOR_PRECONDITION(...)

Description

This is used together with BOOST_CONTRACT_CONSTRUCTOR to specify contracts for constructors. Constructors that do not have preconditions do not use this macro. When at least one of the class constructors uses this macro, boost::contract::constructor_precondition must be the first and private base class of the class declaring the constructor for which preconditions are programmed:

class u
    #define BASES private boost::contract::constructor_precondition<u>, \
            public b
    : BASES
{
    ...
    #undef BASES

public:
    explicit u(unsigned x) :
        BOOST_CONTRACT_CONSTRUCTOR_PRECONDITION(u)([&] {
            BOOST_CONTRACT_ASSERT(x != 0);
        }),
        b(1.0 / float(x))
    {
        ...
    }

    ...
};

BOOST_CONTRACT_CONSTRUCTOR_PRECONDITION(class_type)(f) expands to code equivalent to the following (note that when BOOST_CONTRACT_NO_PRECONDITIONS is defined, this macro trivially expands to a default constructor call that is internally implemented to do nothing so this should have minimal to no overhead):

// Guarded only by NO_PRECONDITIONS (and not also by NO_CONSTRUCTORS)
// because for constructor's preconditions (not for postconditions, etc.).
#ifndef BOOST_CONTRACT_NO_PRECONDITIONS
    boost::contract::constructor_precondition<class_type>(f)
#else
    // No-op call (likely optimized away, minimal to no overhead).
    boost::contract::constructor_precondition<class_type>()
#endif

Where:

  • class_type is the type of the class containing the constructor for which preconditions are being programmed. (This is a variadic macro parameter so it can contain commas not protected by round parenthesis.)

  • f is the nullary functor called by this library to check constructor preconditions f(). Assertions within this functor call are usually programmed using BOOST_CONTRACT_ASSERT, but any exception thrown by a call to this functor indicates a contract failure (and will result in this library calling boost::contract::precondition_failure). This functor should capture variables by (constant) value, or better by (constant) reference to avoid extra copies. (This is a variadic macro parameter so it can contain commas not protected by round parenthesis.)

See Also:

Disable Contract Compilation, Constructors


PrevUpHomeNext