From f4e6c155f0a014faea5c698c3aab938d8254a6f9 Mon Sep 17 00:00:00 2001 From: malc Date: Mon, 12 Jul 2010 20:57:54 +0200 Subject: [PATCH] Fix type-punning issues with C++. * include/freetype/internal/ftmemory.h (FT_ASSIGNP) [__cplusplus]: Emulate a `typeof' operator with an inline template which uses `static_cast'. --- ChangeLog | 10 +++++++++- include/freetype/internal/ftmemory.h | 22 +++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 49c22c905..c3da8c07b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,17 @@ +2010-07-12 malc + + Fix type-punning issues with C++. + + * include/freetype/internal/ftmemory.h (FT_ASSIGNP) [__cplusplus]: + Emulate a `typeof' operator with an inline template which uses + `static_cast'. + 2010-07-11 Werner Lemberg Fix C++ compilation issue. * src/tools/apinames.c (names_dump) : Fix - typo of `dot' variable. + type of `dot' variable. 2010-07-10 suzuki toshiya diff --git a/include/freetype/internal/ftmemory.h b/include/freetype/internal/ftmemory.h index 2010ca90d..026aa63ea 100644 --- a/include/freetype/internal/ftmemory.h +++ b/include/freetype/internal/ftmemory.h @@ -4,7 +4,7 @@ /* */ /* The FreeType memory management macros (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007 by */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,15 +58,27 @@ FT_BEGIN_HEADER /* - * C++ refuses to handle statements like p = (void*)anything; where `p' - * is a typed pointer. Since we don't have a `typeof' operator in - * standard C++, we have to use ugly casts. + * C++ refuses to handle statements like p = (void*)anything, with `p' a + * typed pointer. Since we don't have a `typeof' operator in standard + * C++, we have to use a template to emulate it. */ #ifdef __cplusplus -#define FT_ASSIGNP( p, val ) *((void**)&(p)) = (val) + + extern "C++" + template inline T* + cplusplus_typeof( T*, + void *v ) + { + return static_cast ( v ); + } + +#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) + #else + #define FT_ASSIGNP( p, val ) (p) = (val) + #endif