Listing 10: Type-tunneling via c_str_ptr access shim
/* /////////////////////////////////////////////////////////////
* Extract from the Game Framework
*
* www: http://www.gameframework.com/
*
* Copyright (C) 2001, 2002, Scott Patterson, Matthew Wilson.
* (Licensed under the Synesis Software Standard Source License:
* http://www.synesis.com.au/licenses/ssssl.html)
* ////////////////////////////////////////////////////////// */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
void GFAssert2A( gf_char_a_t const *file
, int line
, gf_char_a_t const *expression
, gf_char_a_t const *message);
void GFAssert2W( . . . );
#ifdef __cplusplus
} /* extern "C" */
inline void _GFAssert2( gf_char_a_t const *file
, int line
, gf_char_a_t const *expression
, gf_char_a_t const *message)
{
GFAssert2A(file, line, expression, message);
}
inline void _GFAssert2( gf_char_w_t const *file
, int line
, gf_char_w_t const *expression
, gf_char_w_t const *message)
{
GFAssert2W(file, line, expression, message);
}
template <typename S1, typename S2>
inline void GFAssert2 ( gf_char_a_t const *file
, int line
, S1 const &expression
, S2 const &message)
{
_GFAssert2(file, line, c_str_ptr(expression), c_str_ptr(message));
}
#endif /* __cplusplus */
#ifdef __cplusplus
#define GFASSERTMSG(f, sz) \
((void)((!(f)) ? GFAssert2(__FILE__, __LINE__, #f, sz) : (0)))
#else
. . . // C translation must employ character encoding discrimination
#endif /* __cplusplus */