| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef __EI_ALLOC__H__ |
| #define __EI_ALLOC__H__ |
|
|
| #include "memory.hpp" |
|
|
| #if EIDSP_TRACK_ALLOCATIONS |
| #include <map> |
| #endif |
|
|
| namespace ei { |
|
|
| template <class T> |
| struct EiAlloc |
| { |
| typedef T value_type; |
| EiAlloc() = default; |
| template <class U> |
| constexpr EiAlloc(const EiAlloc<U> &) noexcept {} |
|
|
| T *allocate(size_t n) |
| { |
| auto bytes = n * sizeof(T); |
| auto ptr = ei_dsp_malloc(bytes); |
| #if EIDSP_TRACK_ALLOCATIONS |
| get_allocs()[ptr] = bytes; |
| #endif |
| return (T *)ptr; |
| } |
|
|
| void deallocate(T *p, size_t n) noexcept |
| { |
| #if EIDSP_TRACK_ALLOCATIONS |
| auto size_p = get_allocs().find(p); |
| ei_dsp_free(p,size_p->second); |
| get_allocs().erase(size_p); |
| #else |
| ei_dsp_free(p,0); |
| #endif |
| } |
| #if EIDSP_TRACK_ALLOCATIONS |
| private: |
| |
| typedef std::map<void*,size_t> map_t; |
| static map_t& get_allocs() { |
| static map_t allocs; |
| return allocs; |
| } |
| #endif |
| }; |
|
|
| template <class T, class U> |
| bool operator==(const EiAlloc<T> &, const EiAlloc<U> &) { return true; } |
| template <class T, class U> |
| bool operator!=(const EiAlloc<T> &, const EiAlloc<U> &) { return false; } |
| } |
|
|
| #endif |
|
|