Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Do not allow to xbt_new things with (non-trivial) constructors
authorGabriel Corona <gabriel.corona@loria.fr>
Fri, 24 Jul 2015 09:29:01 +0000 (11:29 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 24 Jul 2015 09:29:01 +0000 (11:29 +0200)
include/xbt/sysdep.h

index fae839c..48476d9 100644 (file)
 #ifndef _XBT_SYSDEP_H
 #define _XBT_SYSDEP_H
 
+#ifdef __cplusplus
+#include <type_traits>
+#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<typename T> inline
+T* xbt_new_(size_t count)
+{
+  static_assert(std::is_trivial<T>(),
+    "Cannot xbt_new this type");
+  return (T*) xbt_malloc(sizeof(T) * count);
+}
+
+template<typename T> inline
+T* xbt_new0_(size_t count)
+{
+  static_assert(std::is_trivial<T>(),
+    "Cannot xbt_new0 this type");
+  return (T*) xbt_malloc0(sizeof(T) * count);
+}
+
+#define xbt_new(type, count)  ::xbt_new_<type>(count)
+#define xbt_new0(type, count) ::xbt_new0_<type>(count)
+
+#endif
+
+/** @} */
 
-SG_END_DECL()
 #endif                          /* _XBT_SYSDEP_H */