diff options
author | John Hodge <tpg@mutabah.net> | 2016-11-18 08:30:01 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-11-18 08:30:01 +0800 |
commit | 2cbced9aea31eb58ec87c4fa58761cdce5da47d3 (patch) | |
tree | 8a37832b31b4a1b6d17d7474b132c83778202892 | |
parent | 0fd8242037236ed20e4c6d3d4d5c7c57cb495af3 (diff) | |
download | mrust-2cbced9aea31eb58ec87c4fa58761cdce5da47d3.tar.gz |
HIR - Clean up ExprPtr a little and add erased type types
-rw-r--r-- | src/hir/expr_ptr.cpp | 32 | ||||
-rw-r--r-- | src/hir/expr_ptr.hpp | 69 |
2 files changed, 64 insertions, 37 deletions
diff --git a/src/hir/expr_ptr.cpp b/src/hir/expr_ptr.cpp index 8231239c..1f4cb1c3 100644 --- a/src/hir/expr_ptr.cpp +++ b/src/hir/expr_ptr.cpp @@ -1,28 +1,34 @@ /* + * MRustC - Rust Compiler + * - By John Hodge (Mutabah/thePowersGang) + * + * hir/expr_ptr.cpp + * - HIR Expression */ #include <hir/expr_ptr.hpp> #include <hir/expr.hpp> -::HIR::ExprPtr::ExprPtr(): - node(nullptr) +::HIR::ExprPtr::ExprPtr(::std::unique_ptr< ::HIR::ExprNode> v): + node( mv$(v) ) { } -::HIR::ExprPtr::ExprPtr(::std::unique_ptr< ::HIR::ExprNode> v): - node( v.release() ) +::std::unique_ptr< ::HIR::ExprNode> HIR::ExprPtr::into_unique() { + return node.into_unique(); } -::HIR::ExprPtr::~ExprPtr() + + +::HIR::ExprPtrInner::ExprPtrInner(::std::unique_ptr< ::HIR::ExprNode> v): + ptr( v.release() ) { - delete node; } -::std::unique_ptr< ::HIR::ExprNode> HIR::ExprPtr::into_unique() +::HIR::ExprPtrInner::~ExprPtrInner() { - ::std::unique_ptr< ::HIR::ExprNode> rv( this->node ); - this->node = nullptr; - return rv; + delete ptr; } -void ::HIR::ExprPtr::reset(::HIR::ExprNode* p) +::std::unique_ptr< ::HIR::ExprNode> HIR::ExprPtrInner::into_unique() { - delete node; - node = p; + ::std::unique_ptr< ::HIR::ExprNode> rv( this->ptr ); + this->ptr = nullptr; + return rv; } diff --git a/src/hir/expr_ptr.hpp b/src/hir/expr_ptr.hpp index 4060c551..21bc9e9d 100644 --- a/src/hir/expr_ptr.hpp +++ b/src/hir/expr_ptr.hpp @@ -16,44 +16,65 @@ namespace HIR { class TypeRef; class ExprNode; +class ExprPtrInner +{ + ::HIR::ExprNode* ptr; +public: + ExprPtrInner(): + ptr(nullptr) + {} + ExprPtrInner(::std::unique_ptr< ::HIR::ExprNode> _); + ExprPtrInner(ExprPtrInner&& x): + ptr(x.ptr) + { + x.ptr = nullptr; + } + ~ExprPtrInner(); + + ExprPtrInner& operator=(ExprPtrInner&& x) + { + this->~ExprPtrInner(); + ptr = x.ptr; + x.ptr = nullptr; + return *this; + } + + ::std::unique_ptr< ::HIR::ExprNode> into_unique(); + operator bool () const { return ptr != nullptr; } + ::HIR::ExprNode* get() const { return ptr; } + void reset(::HIR::ExprNode* p) { + this->~ExprPtrInner(); + this->ptr = p; + } + + ::HIR::ExprNode& operator*() { return *ptr; } + const ::HIR::ExprNode& operator*() const { return *ptr; } + ::HIR::ExprNode* operator->() { return ptr; } + const ::HIR::ExprNode* operator->() const { return ptr; } +}; + class ExprPtr { - ::HIR::ExprNode* node; + ::HIR::ExprPtrInner node; public: ::std::vector< ::HIR::TypeRef> m_bindings; + ::std::vector< ::HIR::TypeRef> m_erased_types; ::MIR::FunctionPointer m_mir; public: - ExprPtr(); + ExprPtr() {} ExprPtr(::std::unique_ptr< ::HIR::ExprNode> _); - ExprPtr(ExprPtr&& x): - node(x.node), - m_bindings( ::std::move(x.m_bindings) ), - m_mir( ::std::move(x.m_mir) ) - { - x.node = nullptr; - } - ExprPtr& operator=(ExprPtr&& x) - { - this->~ExprPtr(); - node = x.node; - m_bindings = ::std::move(x.m_bindings); - m_mir = ::std::move(x.m_mir); - x.node = nullptr; - return *this; - } - ~ExprPtr(); ::std::unique_ptr< ::HIR::ExprNode> into_unique(); - operator bool () const { return node != nullptr; } - ::HIR::ExprNode* get() const { return node; } - void reset(::HIR::ExprNode* p); + operator bool () const { return node; } + ::HIR::ExprNode* get() const { return node.get(); } + void reset(::HIR::ExprNode* p) { node.reset(p); } ::HIR::ExprNode& operator*() { return *node; } const ::HIR::ExprNode& operator*() const { return *node; } - ::HIR::ExprNode* operator->() { return node; } - const ::HIR::ExprNode* operator->() const { return node; } + ::HIR::ExprNode* operator->() { return &*node; } + const ::HIR::ExprNode* operator->() const { return &*node; } }; } // namespace HIR |