summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/palloc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/palloc.h')
-rw-r--r--src/lib/netlist/plib/palloc.h29
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; }