// cast.h definitions for assert_cast
#ifndef CAST_H_A2434B93
#define CAST_H_A2434B93
#include <assert.h>
// assert_cast is similar to dynamic_cast; it differs in that
// (1) RTTI, with its (small) associated cost in executable size
// and speed, is used only in Debug mode (i.e., when NDEBUG is
// not #defined), and (2) a bad cast is signalled by raising an
// assertion, rather than by returning 0 or throwing
// std::bad_cast.
// for pointers
template<typename Result_ptr, typename Source>
inline Result_ptr assert_cast(Source* pSource)
{
assert ( static_cast<Result_ptr>(pSource) ==
dynamic_cast<Result_ptr>(pSource) );
return static_cast<Result_ptr>(pSource);
}
// for references
template<typename Result_ref, typename Source>
inline Result_ref assert_cast(Source& rSource)
{
#ifndef NDEBUG
try
{
assert ( &static_cast<Result_ref>(rSource) ==
&dynamic_cast<Result_ref>(rSource) );
}
catch(...)
{
// convert exceptions to assertions to prevent them
// from being "handled"
assert(false);
}
#endif
return static_cast<Result_ref>(rSource);
}
#endif // CAST_H_A2434B93