|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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 |
|
|
|