+#define LL_CLEAR(...) EVAL_LL_CLEAR(OVERLOAD(LL_CLEAR, __VA_ARGS__))
+#define EVAL_LL_CLEAR(...) __VA_ARGS__
+#define LL_CLEAR_1(this) LL_CLEAR_2(this, LAMBDA())
+#define LL_CLEAR_2(this, dtor) \
+ MACRO_BEGIN \
+ LinkedList _ll = this; \
+ assert(_ll); \
+ while (_ll.ll_tail) \
+ { \
+ entity it = LL_POP(_ll); \
+ if (!it) continue; \
+ dtor \
+ delete(it); \
+ } \
+ MACRO_END
+
+#define LL_DELETE(...) EVAL_LL_DELETE(OVERLOAD(LL_DELETE, __VA_ARGS__))
+#define EVAL_LL_DELETE(...) __VA_ARGS__
+#define LL_DELETE_1(this) LL_DELETE_2(this, LAMBDA())
+#define LL_DELETE_2(this, dtor) \
+ MACRO_BEGIN \
+ LL_CLEAR_2(this, dtor); \
+ delete(this); \
+ this = NULL; \
+ MACRO_END
+