kleopatra
checker.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __KDABTOOLS__CPP__CHECKER_H__
00024 #define __KDABTOOLS__CPP__CHECKER_H__
00025
00026 #include "kdtoolsglobal.h"
00027
00028 #include <cstdlib>
00029
00068 class __KDAB__CheckerImplBase {
00069 public:
00070 virtual ~__KDAB__CheckerImplBase() {}
00071 virtual void checkInvariants() const = 0;
00072 };
00073
00074 template <typename T_Class>
00075 class __KDAB__CheckerImpl : public __KDAB__CheckerImplBase {
00076 KDAB_DISABLE_COPY( __KDAB__CheckerImpl );
00077 const T_Class * const p;
00078 public:
00079 __KDAB__CheckerImpl( const T_Class * t )
00080 : __KDAB__CheckerImplBase(), p( t ) {}
00081 void checkInvariants() const {
00082 try {
00083 p->__KDAB_Checker__checkInvariants__();
00084 } catch( ... ) {
00085 std::abort();
00086 }
00087 }
00088 };
00089
00090 template <bool check_in_ctor, bool check_in_dtor>
00091 class __KDAB__Checker {
00092 KDAB_DISABLE_COPY( __KDAB__Checker );
00093 const __KDAB__CheckerImplBase * const checker;
00094 public:
00095 template <typename T_Class>
00096 __KDAB__Checker( const T_Class * t )
00097 : checker( new __KDAB__CheckerImpl<T_Class>( t ) )
00098 {
00099 if ( check_in_ctor )
00100 checker->checkInvariants();
00101 }
00102 ~__KDAB__Checker() {
00103 if ( check_in_dtor )
00104 checker->checkInvariants();
00105 delete checker;
00106 }
00107 };
00108
00109 #define KDAB_MAKE_CHECKABLE( Class ) \
00110 private: \
00111 void __KDAB_Checker__checkInvariants__() const; \
00112 friend class __KDAB__CheckerImpl<Class>;
00113
00114 #define KDAB_DEFINE_CHECKS( Class ) \
00115 void Class::__KDAB_Checker__checkInvariants__() const
00116
00117 #ifndef NDEBUG
00118 # define __KDAB_CHECK_HELPER__( ctor, dtor ) \
00119 const __KDAB__Checker<ctor,dtor> __checker_uglified__( this )
00120 #else
00121 # define __KDAB_CHECK_HELPER__( ctor, dtor ) \
00122 do {} while (0)
00123 #endif
00124
00125 #define KDAB_CHECK_THIS __KDAB_CHECK_HELPER__( true, true )
00126 #define KDAB_CHECK_CTOR __KDAB_CHECK_HELPER__( false, true )
00127 #define KDAB_CHECK_DTOR __KDAB_CHECK_HELPER__( true, false )
00128
00129 #endif
00130