diff options
Diffstat (limited to 'src/lib/netlist/plib/palloc.h')
-rw-r--r-- | src/lib/netlist/plib/palloc.h | 188 |
1 files changed, 113 insertions, 75 deletions
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index bc0b18a2ff8..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,97 +58,112 @@ 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 - -class pmemory_pool; - -extern pmemory_pool *ppool; - -void *palloc_raw(const size_t size); -void pfree_raw(void *p); - -void* operator new(std::size_t size, pmemory_pool *pool) throw (std::bad_alloc); +template<typename T, typename... Args> +T *palloc(Args&&... args) +{ + return new T(std::forward<Args>(args)...); +} -void operator delete(void *ptr, pmemory_pool *pool); +template<typename T> +void pfree(T *ptr) { delete ptr; } template<typename T> -inline void pfree_t(T *p) +inline T* palloc_array(std::size_t num) { - p->~T(); - pfree_raw(p); + return new T[num](); } -template <typename T> -inline T *palloc_array_t(size_t N) -{ - char *buf = reinterpret_cast<char *>(palloc_raw(N * sizeof(T) + 64*2)); - size_t *s = reinterpret_cast<size_t *>(buf); - *s = N; - buf += 64; - T *p = reinterpret_cast<T *>(buf); - for (size_t i = 0; i < N; i++) - new(reinterpret_cast<void *>(&p[i])) T(); - return p; +template<typename T> +void pfree_array(T *ptr) { delete [] ptr; } + +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 T> -inline void pfree_array_t(T *p) +template<typename BC, typename DC, typename... Args> +static std::unique_ptr<BC> make_unique_base(Args&&... args) { - char *buf = reinterpret_cast<char *>(p); - buf -= 64; - size_t *s = reinterpret_cast<size_t *>(buf); - size_t N = *s; - while (N > 0) - { - p->~T(); - p++; - N--; - } - pfree_raw(s); + std::unique_ptr<BC> ret(new DC(std::forward<Args>(args)...)); + return ret; } -#if 0 -#define palloc(T) new(ppool) T -#define pfree(_ptr) pfree_t(_ptr) - -#define palloc_array(T, N) palloc_array_t<T>(N) -#define pfree_array(_ptr) pfree_array_t(_ptr) -#else -#define palloc(T) new T -#define pfree(_ptr) delete _ptr +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; -#define palloc_array(T, N) new T[N] -#define pfree_array(_ptr) delete[] _ptr -#endif -#else -#include "corealloc.h" + 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; + } -#define ATTR_ALIGN + 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; + } -#define palloc(T) global_alloc(T) -#define pfree(_ptr) global_free(_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; + } -#define palloc_array(T, N) global_alloc_array(T, N) -#define pfree_array(_ptr) global_free_array(_ptr) + 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; + } -#endif + bool is_owned() const { return m_is_owned; } -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 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 { @@ -161,5 +198,6 @@ public: std::vector<block> m_blocks; }; +PLIB_NAMESPACE_END() -#endif /* NLCONFIG_H_ */ +#endif /* PALLOC_H_ */ |