[libbluray-devel] automatic cast from void* (malloc/calloc/realloc) for C++ compilers

hpi1 git at videolan.org
Wed Sep 12 22:02:04 CEST 2012


libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Wed Sep 12 11:40:57 2012 +0300| [b176a16cdf0475aaf902f278ffc83a66a96b5446] | committer: hpi1

automatic cast from void* (malloc/calloc/realloc) for C++ compilers

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=b176a16cdf0475aaf902f278ffc83a66a96b5446
---

 src/util/macro.h  |   34 ++++++++++++++++++++++++++++++++++
 src/util/strutl.c |    2 ++
 2 files changed, 36 insertions(+)

diff --git a/src/util/macro.h b/src/util/macro.h
index 81a08e3..7df96e8 100644
--- a/src/util/macro.h
+++ b/src/util/macro.h
@@ -30,4 +30,38 @@
 #define MKINT_BE32(X) ( (X)[0] << 24 | (X)[1] << 16 |  (X)[2] << 8 | (X)[3] )
 #define X_FREE(X)     ( free(X), X = NULL )
 
+/*
+ * automatic cast from void* (malloc/calloc/realloc)
+ */
+
+#ifdef __cplusplus
+
+template <typename T>
+class auto_cast_wrapper
+{
+public:
+    template <typename R> friend auto_cast_wrapper<R> auto_cast(const R& x);
+    template <typename U> operator U() { return static_cast<U>(p); }
+
+private:
+    auto_cast_wrapper(const T& x) : p(x) {}
+    auto_cast_wrapper(const auto_cast_wrapper& o) : p(o.p) {}
+
+    auto_cast_wrapper& operator=(const auto_cast_wrapper&);
+
+    const T& p;
+};
+
+template <typename R>
+auto_cast_wrapper<R> auto_cast(const R& x)
+{
+    return auto_cast_wrapper<R>(x);
+}
+
+#  define calloc(n,s)  auto_cast(calloc(n,s))
+#  define malloc(s)    auto_cast(malloc(s))
+#  define realloc(p,s) auto_cast(realloc(p,s))
+#endif /* __cplusplus */
+
+
 #endif /* MACRO_H_ */
diff --git a/src/util/strutl.c b/src/util/strutl.c
index 9831ebc..ea29067 100644
--- a/src/util/strutl.c
+++ b/src/util/strutl.c
@@ -19,6 +19,8 @@
 
 #include "strutl.h"
 
+#include "macro.h"
+
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>



More information about the libbluray-devel mailing list