diff options
Diffstat (limited to 'src/lib/netlist/plib/palloc.h')
-rw-r--r-- | src/lib/netlist/plib/palloc.h | 83 |
1 files changed, 44 insertions, 39 deletions
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index da404be279f..793ad1ce553 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -46,40 +46,37 @@ namespace plib { delete [] ptr; } - template<typename T, typename... Args> - std::unique_ptr<T> make_unique(Args&&... args) - { - return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); - } - - template<typename BC, typename DC, typename... Args> - std::unique_ptr<BC> make_unique_base(Args&&... args) - { - std::unique_ptr<BC> ret(new DC(std::forward<Args>(args)...)); - return ret; - } - - template <typename SC> + template <typename SC, typename D = std::default_delete<SC>> class owned_ptr { - private: + public: owned_ptr() : m_ptr(nullptr), m_is_owned(true) { } - public: + + template <typename, typename> + friend class owned_ptr; + owned_ptr(SC *p, bool owned) noexcept - : m_ptr(p), m_is_owned(owned) + : m_ptr(p), m_deleter(), m_is_owned(owned) + { } + + owned_ptr(SC *p, bool owned, D deleter) noexcept + : m_ptr(p), m_deleter(deleter), m_is_owned(owned) { } + owned_ptr(const owned_ptr &r) = delete; owned_ptr & operator =(owned_ptr &r) = delete; - template<typename DC> - owned_ptr & operator =(owned_ptr<DC> &&r) + template<typename DC, typename DC_D> + owned_ptr & operator =(owned_ptr<DC, DC_D> &&r) { if (m_is_owned && (m_ptr != nullptr)) - delete m_ptr; + //delete m_ptr; + m_deleter(m_ptr); m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; + m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; return *this; @@ -89,50 +86,43 @@ namespace plib { { m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; + m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; } owned_ptr &operator=(owned_ptr &&r) noexcept { + if (m_is_owned && (m_ptr != nullptr)) + //delete m_ptr; + m_deleter(m_ptr); m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; + m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; return *this; } - template<typename DC> - owned_ptr(owned_ptr<DC> &&r) noexcept + template<typename DC, typename DC_D> + owned_ptr(owned_ptr<DC, DC_D> &&r) noexcept { m_ptr = static_cast<SC *>(r.get()); m_is_owned = r.is_owned(); + m_deleter = r.m_deleter; r.release(); } ~owned_ptr() { if (m_is_owned && (m_ptr != nullptr)) - delete m_ptr; + { + //delete m_ptr; + m_deleter(m_ptr); + } m_is_owned = false; m_ptr = nullptr; } - template<typename DC, typename... Args> - static owned_ptr Create(Args&&... args) - { - owned_ptr a; - auto *x = new DC(std::forward<Args>(args)...); - a.m_ptr = static_cast<SC *>(x); - return std::move(a); - } - - template<typename... Args> - static owned_ptr Create(Args&&... args) - { - owned_ptr a; - a.m_ptr = new SC(std::forward<Args>(args)...); - return std::move(a); - } SC * release() { SC *tmp = m_ptr; @@ -148,9 +138,24 @@ namespace plib { SC * get() const { return m_ptr; } private: SC *m_ptr; + D m_deleter; bool m_is_owned; }; + + template<typename T, typename... Args> + std::unique_ptr<T> make_unique(Args&&... args) + { + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); + } + + template<typename T, typename... Args> + static owned_ptr<T> make_owned(Args&&... args) + { + owned_ptr<T> a(new T(std::forward<Args>(args)...), true); + return std::move(a); + } + } // namespace plib #endif /* PALLOC_H_ */ |