diff options
author | 2016-05-25 20:28:58 +0200 | |
---|---|---|
committer | 2016-05-27 01:19:59 +0200 | |
commit | fd62273a87b8fe43492e4a466ea97993b88904f8 (patch) | |
tree | 896b1aca134a5396e0dedb31aac26875b3466c60 /src/lib/netlist/plib/palloc.h | |
parent | 111c5a3dc080a4d454dbcadb6c211ccf2c749da7 (diff) |
Moved more code into plib namespace. (nw)
Diffstat (limited to 'src/lib/netlist/plib/palloc.h')
-rw-r--r-- | src/lib/netlist/plib/palloc.h | 134 |
1 files changed, 108 insertions, 26 deletions
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 4d0870e525a..bd994466226 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -16,6 +16,28 @@ #include "pconfig.h" #include "pstring.h" +#if (PSTANDALONE) +#include <cstddef> +#include <new> + +#if defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) +#if !defined(__ppc__) && !defined (__PPC__) && !defined(__ppc64__) && !defined(__PPC64__) +#define ATTR_ALIGN __attribute__ ((aligned(64))) +#else +#define ATTR_ALIGN +#endif +#else +#define ATTR_ALIGN +#endif + +#else + +#define ATTR_ALIGN + +#endif + +PLIB_NAMESPACE_START() + //============================================================ // exception base //============================================================ @@ -36,29 +58,6 @@ private: // Memory allocation //============================================================ -#if (PSTANDALONE) -#include <cstddef> -#include <new> - -#if defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) -#if !defined(__ppc__) && !defined (__PPC__) && !defined(__ppc64__) && !defined(__PPC64__) -#define ATTR_ALIGN __attribute__ ((aligned(64))) -#else -#define ATTR_ALIGN -#endif -#else -#define ATTR_ALIGN -#endif - -#define palloc(T) new T -#define pfree(_ptr) delete _ptr - -#define palloc_array(T, N) new T[N] -#define pfree_array(_ptr) delete[] _ptr -#else - -#define ATTR_ALIGN - template<typename T, typename... Args> T *palloc(Args&&... args) { @@ -77,13 +76,95 @@ inline T* palloc_array(std::size_t num) template<typename T> void pfree_array(T *ptr) { delete [] ptr; } -#endif - template<typename T, typename... Args> std::unique_ptr<T> pmake_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } +template<typename BC, typename DC, typename... Args> +static 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> +class powned_ptr +{ +private: + powned_ptr() + : m_ptr(nullptr), m_is_owned(true) { } +public: + powned_ptr(SC *p, bool owned) + : m_ptr(p), m_is_owned(owned) + { } + powned_ptr(const powned_ptr &r) = delete; + powned_ptr & operator =(const powned_ptr &r) = delete; + + powned_ptr(powned_ptr &&r) + { + m_is_owned = r.m_is_owned; + m_ptr = r.m_ptr; + r.m_is_owned = false; + r.m_ptr = nullptr; + } + + template<typename DC> + powned_ptr(powned_ptr<DC> &&r) + { + SC *dest_ptr = &dynamic_cast<SC &>(*r.get()); + bool o = r.is_owned(); + r.release(); + m_is_owned = o; + m_ptr = dest_ptr; + } + + ~powned_ptr() + { + if (m_is_owned) + delete m_ptr; + } + template<typename DC, typename... Args> + static powned_ptr Create(Args&&... args) + { + powned_ptr a; + DC *x = new DC(std::forward<Args>(args)...); + a.m_ptr = static_cast<SC *>(x); + return a; + } + + template<typename... Args> + static powned_ptr Create(Args&&... args) + { + powned_ptr a; + a.m_ptr = new SC(std::forward<Args>(args)...); + return a; + } + void release() + { + m_is_owned = false; + m_ptr = nullptr; + } + + bool is_owned() const { return m_is_owned; } + + template<typename DC> + powned_ptr<DC> & operator =(powned_ptr<DC> &r) + { + m_is_owned = r.m_is_owned; + m_ptr = r.m_ptr; + r.m_is_owned = false; + r.m_ptr = nullptr; + return *this; + } + SC * operator ->() { return m_ptr; } + SC & operator *() { return *m_ptr; } + SC * get() const { return m_ptr; } +private: + SC *m_ptr; + bool m_is_owned; +}; + class pmempool { private: @@ -117,5 +198,6 @@ public: std::vector<block> m_blocks; }; +PLIB_NAMESPACE_END() -#endif /* NLCONFIG_H_ */ +#endif /* PALLOC_H_ */ |