summaryrefslogtreecommitdiff
path: root/src/ast/expr_ptr.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast/expr_ptr.hpp')
-rw-r--r--src/ast/expr_ptr.hpp33
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);
+};
+
+}