/* */ #include namespace AST { class ExprNode; class NodeVisitor; typedef ::std::unique_ptr ExprNodeP; extern ::std::ostream& operator<<(::std::ostream& os, const ExprNode& node); class Expr { ::std::shared_ptr m_node; public: Expr(unique_ptr node); Expr(ExprNode* node); Expr(); bool is_valid() const { return m_node.get() != nullptr; } const ExprNode& node() const { assert(m_node.get()); return *m_node; } ExprNode& node() { assert(m_node.get()); return *m_node; } ::std::shared_ptr take_node() { assert(m_node.get()); return ::std::move(m_node); } void visit_nodes(NodeVisitor& v); void visit_nodes(NodeVisitor& v) const; Expr clone() const; friend ::std::ostream& operator<<(::std::ostream& os, const Expr& pat); }; }