diff options
Diffstat (limited to 'src/lib/netlist/plib/palloc.h')
-rw-r--r-- | src/lib/netlist/plib/palloc.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 1529cd38194..72617aa603b 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -79,8 +79,15 @@ public: : m_ptr(p), m_is_owned(owned) { } owned_ptr(const owned_ptr &r) = delete; - owned_ptr & operator =(const owned_ptr &r) = delete; - + owned_ptr & operator =(owned_ptr &r) = delete; + owned_ptr & operator =(owned_ptr &&r) + { + m_is_owned = r.m_is_owned; + m_ptr = r.m_ptr; + r.m_is_owned = false; + r.m_ptr = nullptr; + return *this; + } owned_ptr(owned_ptr &&r) { m_is_owned = r.m_is_owned; @@ -92,17 +99,17 @@ public: template<typename DC> owned_ptr(owned_ptr<DC> &&r) { - SC *dest_ptr = &dynamic_cast<SC &>(*r.get()); - bool o = r.is_owned(); + m_ptr = static_cast<SC *>(r.get()); + m_is_owned = r.is_owned(); r.release(); - m_is_owned = o; - m_ptr = dest_ptr; } ~owned_ptr() { - if (m_is_owned) + if (m_is_owned && m_ptr != nullptr) delete m_ptr; + m_is_owned = false; + m_ptr = nullptr; } template<typename DC, typename... Args> static owned_ptr Create(Args&&... args) @@ -110,7 +117,7 @@ public: owned_ptr a; DC *x = new DC(std::forward<Args>(args)...); a.m_ptr = static_cast<SC *>(x); - return a; + return std::move(a); } template<typename... Args> @@ -118,7 +125,7 @@ public: { owned_ptr a; a.m_ptr = new SC(std::forward<Args>(args)...); - return a; + return std::move(a); } void release() { @@ -128,8 +135,9 @@ public: bool is_owned() const { return m_is_owned; } +#if 1 template<typename DC> - owned_ptr<DC> & operator =(owned_ptr<DC> &r) + owned_ptr & operator =(owned_ptr<DC> &&r) { m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; @@ -137,6 +145,7 @@ public: r.m_ptr = nullptr; return *this; } +#endif SC * operator ->() const { return m_ptr; } SC & operator *() const { return *m_ptr; } SC * get() const { return m_ptr; } |