From: Gabriel Corona Date: Fri, 24 Jul 2015 09:29:01 +0000 (+0200) Subject: [mc] Do not allow to xbt_new things with (non-trivial) constructors X-Git-Tag: v3_12~438^2~8 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/ff6cb26262ba25fefdf1265628265a75d790ebd6?hp=39aa88227f8cff926c10773ec34cf8decb85a05b [mc] Do not allow to xbt_new things with (non-trivial) constructors --- diff --git a/include/xbt/sysdep.h b/include/xbt/sysdep.h index fae839c089..48476d9bcc 100644 --- a/include/xbt/sysdep.h +++ b/include/xbt/sysdep.h @@ -11,6 +11,10 @@ #ifndef _XBT_SYSDEP_H #define _XBT_SYSDEP_H +#ifdef __cplusplus +#include +#endif + #include "xbt/log.h" #include "xbt/misc.h" #include "xbt/asserts.h" @@ -149,15 +153,44 @@ XBT_PUBLIC(void) xbt_free_f(void *p); /** @brief should be given a pointer to pointer, and frees the second one */ XBT_PUBLIC(void) xbt_free_ref(void *d); +SG_END_DECL() + /** @brief like calloc, but xbt_die() on error and don't memset to 0 @hideinitializer */ +#ifndef __cplusplus + #define xbt_new(type, count) ((type*)xbt_malloc (sizeof (type) * (count))) /** @brief like calloc, but xbt_die() on error @hideinitializer */ #define xbt_new0(type, count) ((type*)xbt_malloc0 (sizeof (type) * (count))) -/** @} */ +#else +/** C++ wrapper for xtb_new + * + * This ensures that we do not xbt_new things that need a constructor. + */ +template inline +T* xbt_new_(size_t count) +{ + static_assert(std::is_trivial(), + "Cannot xbt_new this type"); + return (T*) xbt_malloc(sizeof(T) * count); +} + +template inline +T* xbt_new0_(size_t count) +{ + static_assert(std::is_trivial(), + "Cannot xbt_new0 this type"); + return (T*) xbt_malloc0(sizeof(T) * count); +} + +#define xbt_new(type, count) ::xbt_new_(count) +#define xbt_new0(type, count) ::xbt_new0_(count) + +#endif + +/** @} */ -SG_END_DECL() #endif /* _XBT_SYSDEP_H */