With this commit, OpManager now allows users to destroy a Op tree via
destroy_all method.
Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
//
// NOTE destroy(op) WILL NOT update op->parent(). Client SHOULD detach op before destroy(op) call
void destroy(Op *);
+
+ // @brief Destroy a Op tree
+ //
+ // @require op->parent() == nullptr && op->up() == nullptr
+ void destroy_all(Op *);
};
} // namespace coco
#include <nncc/foundation/Memory.h>
#include <cassert>
+#include <queue>
using nncc::foundation::make_unique;
release(op);
}
+void OpManager::destroy_all(Op *op)
+{
+ assert(op->parent() == nullptr);
+ assert(op->up() == nullptr);
+
+ std::queue<coco::Op *> q;
+
+ q.emplace(op);
+
+ while (q.size() > 0)
+ {
+ auto cur = q.front();
+ q.pop();
+
+ // Insert child op nodes
+ for (uint32_t n = 0; n < cur->arity(); ++n)
+ {
+ q.emplace(cur->arg(n));
+ }
+
+ // Destroy the current op node
+ destroy(cur);
+ }
+}
+
} // namespace coco
mgr.destroy(op);
ASSERT_EQ(mgr.size(), 0);
}
+
+TEST_F(OpManagerTest, destroy_all)
+{
+ // Create a Op tree
+ auto load_op = mgr.create<coco::Load>();
+ auto conv_op = mgr.create<coco::Conv2D>();
+
+ conv_op->arg(load_op);
+
+ mgr.destroy_all(conv_op);
+
+ ASSERT_EQ(mgr.size(), 0);
+}