Index: core/fxcrt/include/fx_memory.h |
diff --git a/core/fxcrt/include/fx_memory.h b/core/fxcrt/include/fx_memory.h |
index c3dafc8d5e0e52acc9c991a574c94347358fb8d2..2614016550d3d57251d9adbffa9c2ab05e309ba8 100644 |
--- a/core/fxcrt/include/fx_memory.h |
+++ b/core/fxcrt/include/fx_memory.h |
@@ -74,6 +74,32 @@ inline void* FX_ReallocOrDie(void* ptr, |
#define FX_Free(ptr) free(ptr) |
+// The FX_ArraySize(arr) macro returns the # of elements in an array arr. |
+// The expression is a compile-time constant, and therefore can be |
+// used in defining new arrays, for example. If you use FX_ArraySize on |
+// a pointer by mistake, you will get a compile-time error. |
+// |
+// One caveat is that FX_ArraySize() doesn't accept any array of an |
+// anonymous type or a type defined inside a function. |
+#define FX_ArraySize(array) (sizeof(ArraySizeHelper(array))) |
+ |
+// This template function declaration is used in defining FX_ArraySize. |
+// Note that the function doesn't need an implementation, as we only |
+// use its type. |
+template <typename T, size_t N> |
+char(&ArraySizeHelper(T(&array)[N]))[N]; |
+ |
+// Used with std::unique_ptr to FX_Free raw memory. |
+struct FxFreeDeleter { |
+ inline void operator()(void* ptr) const { FX_Free(ptr); } |
+}; |
+ |
+// Used with std::unique_ptr to Release() objects that can't be deleted. |
+template <class T> |
+struct ReleaseDeleter { |
+ inline void operator()(T* ptr) const { ptr->Release(); } |
+}; |
+ |
class CFX_DestructObject { |
public: |
virtual ~CFX_DestructObject() {} |