📄 cyg_ass.h
字号:
#endif
#ifdef CYGDBG_INFRA_DEBUG_LOOP_INVARIANTS
# define CYG_LOOP_INVARIANT( _bool_ , _msg_ ) CYG_ASSERT( _bool_, _msg_ )
# define CYG_LOOP_INVARIANTC( _bool_ ) \ CYG_ASSERT( _bool_, "loop invariant " #_bool_ )
#else
# define CYG_LOOP_INVARIANT( _bool_ , _msg_ ) CYG_EMPTY_STATEMENT
# define CYG_LOOP_INVARIANTC( _bool_ ) CYG_EMPTY_STATEMENT
#endif
#ifdef __cplusplus
// All variants of _CLASS
# define CYG_PRECONDITION_CLASS( _pobj_, _msg_ ) \ CYG_PRECONDITION( ((0 != (_pobj_)) && \ (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
# define CYG_PRECONDITION_CLASSC( _pobj_ ) \ CYG_PRECONDITION_CLASS( (_pobj_), \ "precondition, class pointer (" #_pobj_ ") is valid" )
# define CYG_POSTCONDITION_CLASS( _pobj_, _msg_ ) \ CYG_POSTCONDITION( ((0 != (_pobj_)) && \ (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
# define CYG_POSTCONDITION_CLASSC( _pobj_ ) \ CYG_POSTCONDITION_CLASS( (_pobj_), \ "postcondition, class pointer (" #_pobj_ ") is valid" )
# define CYG_LOOP_INVARIANT_CLASS( _pobj_, _msg_) \ CYG_LOOP_INVARIANT( ((0 != (_pobj_)) && \ (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
# define CYG_LOOP_INVARIANT_CLASSC( _pobj_ ) \ CYG_LOOP_INVARIANT_CLASS( (_pobj_), \ "loop invariant, class pointer (" #_pobj_ ") is valid" )
// All variants of _CLASSO
# define CYG_PRECONDITION_CLASSO( _obj_, _msg_ ) \ CYG_PRECONDITION( (_obj_).check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
# define CYG_PRECONDITION_CLASSOC( _obj_ ) \ CYG_PRECONDITION_CLASSO( (_obj_), \ "precondition, object (" #_obj_ ") is valid" )
# define CYG_POSTCONDITION_CLASSO( _obj_, _msg_ ) \ CYG_POSTCONDITION( (_obj_).check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
# define CYG_POSTCONDITION_CLASSOC( _obj_ ) \ CYG_POSTCONDITION_CLASSO( (_obj_), \ "postcondition, object (" #_obj_ ") is valid" )
# define CYG_LOOP_INVARIANT_CLASSO( _obj_, _msg_) \ CYG_LOOP_INVARIANT( (_obj_).check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
# define CYG_LOOP_INVARIANT_CLASSOC( _obj_ ) \ CYG_LOOP_INVARIANT_CLASSO( (_obj_), \ "loop invariant, object (" #_obj_ ") is valid" )
// All variants of _ZERO_OR_CLASS
# define CYG_PRECONDITION_ZERO_OR_CLASS( _pobj_, _msg_ ) \ CYG_PRECONDITION( ((0 == (_pobj_)) || \ (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
# define CYG_PRECONDITION_ZERO_OR_CLASSC( _pobj_ ) \ CYG_PRECONDITION_ZERO_OR_CLASS( (_pobj_), \ "precondition, class pointer (" #_pobj_ ") is zero or valid" )
# define CYG_POSTCONDITION_ZERO_OR_CLASS( _pobj_, _msg_ ) \ CYG_POSTCONDITION( ((0 == (_pobj_)) || \ (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
# define CYG_POSTCONDITION_ZERO_OR_CLASSC( _pobj_ ) \ CYG_POSTCONDITION_ZERO_OR_CLASS( (_pobj_), \ "postcondition, class pointer (" #_pobj_ ") is zero or valid" )
# define CYG_LOOP_INVARIANT_ZERO_OR_CLASS( _pobj_, _msg_) \ CYG_LOOP_INVARIANT( ((0 == (_pobj_)) || \ (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
# define CYG_LOOP_INVARIANT_ZERO_OR_CLASSC( _pobj_ ) \ CYG_LOOP_INVARIANT_ZERO_OR_CLASS( (_pobj_), \ "loop invariant, class pointer (" #_pobj_ ") is zero or valid" )
// All variants of _THIS
# define CYG_PRECONDITION_THIS( _msg_ ) \ CYG_PRECONDITION( this->check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
# define CYG_PRECONDITION_THISC() \ CYG_PRECONDITION_THIS( "precondition, \"this\" is valid" )
# define CYG_POSTCONDITION_THIS( _msg_ ) \ CYG_POSTCONDITION( this->check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
# define CYG_POSTCONDITION_THISC() \ CYG_POSTCONDITION_THIS( "postcondition, \"this\" is valid" )
# define CYG_LOOP_INVARIANT_THIS( _msg_) \ CYG_LOOP_INVARIANT( this->check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
# define CYG_LOOP_INVARIANT_THISC() \ CYG_LOOP_INVARIANT_THIS( "loop invariant, \"this\" is valid" )
#endif // __cplusplus
// -------------------------------------------------------------------------
// Invariants. These are a bit more interesting. The ordinary invariants
// take an arbitrary boolean expression, and C++ does not provide any way
// of evaluating this expression automatically on entry and exit - any
// attempt to use local objects leads to trying to evaluate the expression
// when it is not in scope. This problem does not arise with objects.
//
// For C++ objects it is possible to do a bit better. A template can be
// used to create a local object whose constructor will validate the
// target object and whose destructor will validate the target object
// again. Unfortunately it is necessary to pass the type as well as
// the object: typeof() is a gcc extension, and RTTI's typeid facility
// would provide the derived class and not what we actually want.
#ifdef CYGDBG_INFRA_DEBUG_INVARIANTS
# define CYG_INVARIANT( _bool_, _msg_ ) \ CYG_MACRO_START \ if ( ! ( _bool_ ) ) \ CYG_ASSERT_DOCALL( _msg_ ); \ CYG_MACRO_END
# define CYG_INVARIANTC( _bool_ ) \ CYG_MACRO_START \ if ( ! ( _bool_ ) ) \ CYG_ASSERT_DOCALL( "invariant (" #_bool_ ")" ); \ CYG_MACRO_END
# ifdef __cplusplus
// NOTE: if the compiler does not manage to inline the appropriate
// template functions then the impact on code size and performance becomes
// rather large. But there are significant performance overheads anyway
// simply because of the call to check_this()...
//
template<class X> class __CygInvariantObject {
const X* rep;
private:
// Prevent access to the default constructors.
__CygInvariantObject() { }
__CygInvariantObject( const __CygInvariantObject& arg ) { }
__CygInvariantObject & operator=( const __CygInvariantObject & arg) { return *this; }
public:
__CygInvariantObject( X* arg, const char* msg ) : rep(arg) {
if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
CYG_ASSERT_DOCALL( msg );
}
__CygInvariantObject( X& arg, const char* msg ) : rep(&arg) {
if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
CYG_ASSERT_DOCALL( msg );
}
__CygInvariantObject( const X* arg, const char* msg ) : rep(arg) {
if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
CYG_ASSERT_DOCALL( msg );
}
__CygInvariantObject( const X& arg, const char* msg ) : rep(&arg) {
if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
CYG_ASSERT_DOCALL( msg );
}
~__CygInvariantObject( ) {
if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
CYG_ASSERT_DOCALL( "invariant, object valid on exit" );
rep = 0;
};
};
//
// These macros provide sensible concatenation facilities at
// the C preprocessor level, getting around complications in the
// macro expansion rules related to __LINE__ and __FILE__.
# define __CYG_INVARIANT_CLASSNAME_AUX( a, b) a ## b
# define __CYG_INVARIANT_CLASSNAME( a, b ) \ __CYG_INVARIANT_CLASSNAME_AUX( a, b )
// These macro definitions do not use CYG_MACRO_START because
// I do not want the scope of the local objects to get confused.
//
// The first line of the macro expansion specifies the type of
// the local object being created. The second line invents a
// name for this object. The third line provides command-line
// arguments.
# define CYG_INVARIANT_CLASS( _type_, _pobj_, _msg_ ) \ __CygInvariantObject<_type_> \ __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \ ( _pobj_, _msg_ )
# define CYG_INVARIANT_CLASSC( _type_, _pobj_ ) \ __CygInvariantObject<_type_> \ __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \ ( _pobj_, "invariant, class pointer (" #_pobj_ ") is valid" )
# define CYG_INVARIANT_CLASSO( _type_, _obj_, _msg_ ) \ __CygInvariantObject<_type_> \ __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \ ( _obj_, _msg_ )
# define CYG_INVARIANT_CLASSOC( _type_, _obj_ ) \ __CygInvariantObject<_type_> \ __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \ ( _obj_, "invariant, object (" #_obj_ ") is valid" )
# define CYG_INVARIANT_THIS( _type_, _msg_ ) \ __CygInvariantObject<_type_> \ __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \ ( this, _msg_ )
# define CYG_INVARIANT_THISC( _type_ ) \ __CygInvariantObject<_type_> \ __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \ ( this, "invariant, \"this\" is valid" )
# endif // __cplusplus
#else // !CYGDBG_INFRA_DEBUG_INVARIANTS
# define CYG_INVARIANT( _bool_, _msg_ ) CYG_EMPTY_STATEMENT
# define CYG_INVARIANTC( _bool_ ) CYG_EMPTY_STATEMENT
# ifdef __cplusplus
# define CYG_INVARIANT_CLASS( _type_, _pobj_, _msg_ )
# define CYG_INVARIANT_CLASSC( _type_, _pobj_ )
# define CYG_INVARIANT_CLASSO( _type_, _obj_, _msg_ )
# define CYG_INVARIANT_CLASSOC( _type_, _obj_ )
# define CYG_INVARIANT_THIS( _type_, _msg_ )
# define CYG_INVARIANT_THISC( _type_ )
# endif
#endif // CYGDBG_INFRA_DEBUG_INVARIANTS
// -------------------------------------------------------------------------
// Compile time failure; like #error but in a macro so we can use it in
// other definitions.
//
// Usage:
// #define new CYG_COMPILETIMEFAIL( "Do NOT use new!")
#define CYG_COMPILETIMEFAIL( _msg_ ) !!!-- _msg_ --!!!
// -------------------------------------------------------------------------
// The host-side implementation of the infrastructure provides a number
// of additional functions that allow applications to provide their own
// implementation of cyg_assert_fail(). This is not strictly necessary
// since the presence of cyg_assert_fail() in the application would
// override the one in the library anyway, but it is useful to make
// certain functionality more readily available.
//
// These declarations are only available if the symbol
// CYG_DECLARE_HOST_ASSERTION_SUPPORT is defined.
#ifdef CYG_DECLARE_HOST_ASSERTION_SUPPORT
// The default assertion handler writes its output to a file and
// if possible a suitable message to stdout. It is possible to
// install an alternative handler. If this alternative returns false
// then the default handler will be invoked instead, otherwise the
// application will exit.
externC void cyg_assert_install_failure_handler(
bool (*)(const char* /* psz_func */,
const char* /* psz_file */,
cyg_uint32 /* linenum */,
const char* /* psz_msg */) );
// Register a callback that should get invoked as part of handling an
// assertion failure and that will typically produce some additional
// output. For example the trace code will install a callback to output
// trace information.
//
// The first argument is a string identifying the callback. The second
// argument is a function pointer for the callback itself, whose
// argument is another function that can be invoked for output.
externC void cyg_assert_install_failure_callback(
const char* /* name */,
void (*)( void (*)(const char*) ));
// This function can be called by assert failure handlers to invoke
// the installed callbacks. The three arguments are function pointers
// that get invoked prior to callback invocation, by the callback itself,
// and after each callback. In the first case the argument will be the
// callback name.
externC void cyg_assert_failure_invoke_callbacks(
void (*)(const char* /* name */),
void (*)(const char* /* callback data */ ),
void (*)(void) );
// This function is intended to be called from inside gdb instead of
// cyg_assert_fail(),, without the need to specify a filename or
// anything else.
externC void cyg_assert_quickfail(void);
#endif // CYG_DECLARE_HOST_ASSERTION_SUPPORT
// -------------------------------------------------------------------------
#endif // CYGONCE_INFRA_CYG_ASS_H multiple inclusion protection
// EOF cyg_ass.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -