From 9725d5b21b550da8d17453047d30d8e53df08bfe Mon Sep 17 00:00:00 2001 From: Tomas Reimers Date: Mon, 26 Nov 2018 16:00:37 -0800 Subject: [PATCH] Create a recursive free with cleanup function Reviewed By: davidaurelio Differential Revision: D13119307 fbshipit-source-id: 162bb4fd6d7620f61cbac010d0dc236d81738b71 --- yoga/Yoga.cpp | 11 ++++++++++- yoga/Yoga.h | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index 491cc1ee..463107ee 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -319,7 +319,9 @@ static void YGConfigFreeRecursive(const YGNodeRef root) { } } -void YGNodeFreeRecursive(const YGNodeRef root) { +void YGNodeFreeRecursiveWithCleanupFunc( + const YGNodeRef root, + YGNodeCleanupFunc cleanup) { while (YGNodeGetChildCount(root) > 0) { const YGNodeRef child = YGNodeGetChild(root, 0); if (child->getOwner() != root) { @@ -329,9 +331,16 @@ void YGNodeFreeRecursive(const YGNodeRef root) { YGNodeRemoveChild(root, child); YGNodeFreeRecursive(child); } + if (cleanup != nullptr) { + cleanup(root); + } YGNodeFree(root); } +void YGNodeFreeRecursive(const YGNodeRef root) { + return YGNodeFreeRecursiveWithCleanupFunc(root, nullptr); +} + void YGNodeReset(const YGNodeRef node) { YGAssertWithNode( node, diff --git a/yoga/Yoga.h b/yoga/Yoga.h index dddab8bb..04e0bf1d 100644 --- a/yoga/Yoga.h +++ b/yoga/Yoga.h @@ -70,6 +70,7 @@ typedef float ( *YGBaselineFunc)(YGNodeRef node, const float width, const float height); typedef void (*YGDirtiedFunc)(YGNodeRef node); typedef void (*YGPrintFunc)(YGNodeRef node); +typedef void (*YGNodeCleanupFunc)(YGNodeRef node); typedef int (*YGLogger)( const YGConfigRef config, const YGNodeRef node, @@ -84,6 +85,9 @@ WIN_EXPORT YGNodeRef YGNodeNew(void); WIN_EXPORT YGNodeRef YGNodeNewWithConfig(const YGConfigRef config); WIN_EXPORT YGNodeRef YGNodeClone(const YGNodeRef node); WIN_EXPORT void YGNodeFree(const YGNodeRef node); +WIN_EXPORT void YGNodeFreeRecursiveWithCleanupFunc( + const YGNodeRef node, + YGNodeCleanupFunc cleanup); WIN_EXPORT void YGNodeFreeRecursive(const YGNodeRef node); WIN_EXPORT void YGNodeReset(const YGNodeRef node); WIN_EXPORT int32_t YGNodeGetInstanceCount(void);