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.h83
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_ */