diff options
Diffstat (limited to 'src/ast/expr_ptr.hpp')
-rw-r--r-- | src/ast/expr_ptr.hpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/ast/expr_ptr.hpp b/src/ast/expr_ptr.hpp new file mode 100644 index 00000000..eb60c49f --- /dev/null +++ b/src/ast/expr_ptr.hpp @@ -0,0 +1,33 @@ +/* + */ +#include <memory> + +namespace AST { + +class ExprNode; +class NodeVisitor; + +typedef ::std::unique_ptr<AST::ExprNode> ExprNodeP; +extern ::std::ostream& operator<<(::std::ostream& os, const ExprNode& node); + +class Expr +{ + ::std::shared_ptr<ExprNode> m_node; +public: + Expr(unique_ptr<ExprNode> 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<ExprNode> 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); +}; + +} |