aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2013-09-18 13:56:26 -0700
committerKenneth Graunke <[email protected]>2013-09-21 09:16:02 -0700
commitbfbad9d1a826bb6215e3a061f7b6b2b0ee3828e8 (patch)
treed6f29b6e0c1289e646371097fb1e52345d21a631 /src
parentedbbfac6cfc634e697d7f981155a5072c52d77ac (diff)
ralloc: Introduce new macros for defining C++ new/delete operators.
Most of our C++ classes define placement new and delete operators so we can do convenient allocation via: thing *foo = new(mem_ctx) thing(...) Currently, this is done via a lot of boilerplate. By adding simple macros to ralloc, we can condense this to a single line, making it trivial to add this feature to a new class. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Chad Versace <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/glsl/ralloc.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/glsl/ralloc.h b/src/glsl/ralloc.h
index 67eb93833e6..799d3a9b83f 100644
--- a/src/glsl/ralloc.h
+++ b/src/glsl/ralloc.h
@@ -404,4 +404,30 @@ bool ralloc_vasprintf_append(char **str, const char *fmt, va_list args);
} /* end of extern "C" */
#endif
+#define _RALLOC_OPS(ALLOC, TYPE) \
+ static void* operator new(size_t size, void *mem_ctx) \
+ { \
+ void *p = ALLOC(mem_ctx, size); \
+ assert(p != NULL); \
+ return p; \
+ } \
+ \
+ static void operator delete(void *p) \
+ { \
+ ralloc_free(p); \
+ }
+
+/**
+ * Declare C++ new and delete operators which use ralloc.
+ *
+ * Placing one of these macros in the body of a class makes it possible to do:
+ *
+ * TYPE *var = new(mem_ctx) TYPE(...);
+ * delete var;
+ *
+ * which is more idiomatic in C++ than calling ralloc or rzalloc.
+ */
+#define DECLARE_RALLOC_CXX_OPERATORS(TYPE) _RALLOC_OPS(ralloc_size, TYPE)
+#define DECLARE_RZALLOC_CXX_OPERATORS(TYPE) _RALLOC_OPS(rzalloc_size, TYPE)
+
#endif