@@ -39,21 +39,24 @@ using ::tvm::Node;
3939using ::tvm::NodeRef;
4040using ::tvm::AttrVisitor;
4141
42- /* ! \brief Macro to make it easy to define node ref type given node */
43- #define TVM_DEFINE_NODE_REF (TypeName, NodeName ) \
44- class TypeName : public ::tvm::NodeRef { \
45- public: \
46- TypeName () {} \
47- explicit TypeName (::tvm::NodePtr<::tvm::Node> n) : NodeRef(n) {} \
48- const NodeName* operator ->() const { \
49- return static_cast <const NodeName*>(node_.get ()); \
50- } \
51- using ContainerType = NodeName; \
52- }; \
42+ /* !
43+ * \brief Macro to define common node ref methods.
44+ * \param TypeName The name of the NodeRef.
45+ * \param BaseTypeName The Base type.
46+ * \param NodeName The node container type.
47+ */
48+ #define TVM_DEFINE_NODE_REF_METHODS (TypeName, BaseTypeName, NodeName ) \
49+ TypeName () {} \
50+ explicit TypeName (::tvm::NodePtr<::tvm::Node> n) : BaseTypeName(n) {} \
51+ const NodeName* operator ->() const { \
52+ return static_cast <const NodeName*>(node_.get ()); \
53+ } \
54+ operator bool () const { return this ->defined (); } \
55+ using ContainerType = NodeName;
5356
5457/* !
55- * \brief Macro to make it easy to define node ref type that
56- * has a CopyOnWrite member function .
58+ * \brief Macro to define CopyOnWrite function in a NodeRef.
59+ * \param NodeName The Type of the Node .
5760 *
5861 * CopyOnWrite will generate a unique copy of the internal node.
5962 * The node will be copied if it is referenced by multiple places.
@@ -70,25 +73,33 @@ using ::tvm::AttrVisitor;
7073 *
7174 * \endcode
7275 */
73- #define TVM_DEFINE_COW_NODE_REF (TypeName, BaseType, NodeName ) \
74- class TypeName : public BaseType { \
75- public: \
76- TypeName () {} \
77- explicit TypeName (::tvm::NodePtr<::tvm::Node> n) : BaseType(n) {} \
78- const NodeName* operator ->() const { \
79- return static_cast <const NodeName*>(node_.get ()); \
80- } \
81- inline NodeName* CopyOnWrite () { \
76+ #define TVM_DEFINE_NODE_REF_COW (NodeName ) \
77+ NodeName* CopyOnWrite () { \
8278 CHECK (node_ != nullptr ); \
8379 if (!node_.unique ()) { \
8480 NodePtr<NodeName> n = make_node<NodeName>(*(operator ->())); \
8581 NodePtr<Node>(std::move (n)).swap (node_); \
8682 } \
8783 return static_cast <NodeName*>(node_.get ()); \
88- } \
89- using ContainerType = NodeName; \
90- };
84+ }
9185
86+ /* ! \brief Macro to make it easy to define node ref type given node */
87+ #define TVM_DEFINE_NODE_REF (TypeName, NodeName ) \
88+ class TypeName : public ::tvm::NodeRef { \
89+ public: \
90+ TVM_DEFINE_NODE_REF_METHODS (TypeName, ::tvm::NodeRef, NodeName); \
91+ }; \
92+
93+ /* !
94+ * \brief Macro to make it easy to define node ref type that
95+ * has a CopyOnWrite member function.
96+ */
97+ #define TVM_DEFINE_COW_NODE_REF (TypeName, BaseType, NodeName ) \
98+ class TypeName : public BaseType { \
99+ public: \
100+ TVM_DEFINE_NODE_REF_METHODS (TypeName, BaseType, NodeName); \
101+ TVM_DEFINE_NODE_REF_COW (NodeName); \
102+ };
92103
93104/* !
94105 * \brief save the node as well as all the node it depends on as json.
0 commit comments