33#ifndef _WDL_HEAPBUF_H_
34#define _WDL_HEAPBUF_H_
36#ifndef WDL_HEAPBUF_IMPL_ONLY
38#ifdef WDL_HEAPBUF_TRACE
40#define WDL_HEAPBUF_TRACEPARM(x) ,(x)
42#define WDL_HEAPBUF_TRACEPARM(x)
51#ifdef WDL_HEAPBUF_INTF_ONLY
52 void *
Resize(
int newsize,
bool resizedown=
true);
78 #ifndef WDL_HEAPBUF_TRACE
87 explicit WDL_HeapBuf(
int granul=4096,
const char *tracetype=
"WDL_HeapBuf"
90 m_tracetype = tracetype;
92 wsprintf(tmp,
"WDL_HeapBuf: created type: %s granul=%d\n",tracetype,granul);
93 OutputDebugString(tmp);
99 OutputDebugString(tmp);
107#ifndef WDL_HEAPBUF_INTF_ONLY
108 #ifdef WDL_HEAPBUF_IMPL_ONLY
111 void *
Resize(
int newsize,
bool resizedown=
true)
114 if (newsize<0) newsize=0;
115 #ifdef DEBUG_TIGHT_ALLOC
120 void *newbuf = newsize ?
malloc(newsize) : 0;
121 if (!newbuf && newsize)
123 #ifdef WDL_HEAPBUF_ONMALLOCFAIL
124 WDL_HEAPBUF_ONMALLOCFAIL(newsize)
136 int resizedown_under = 0;
137 if (resizedown && newsize <
m_size)
142 if (resizedown_under < 1) resizedown_under=1;
145 if (newsize >
m_alloc || newsize < resizedown_under)
147 int granul=newsize/2;
151 if (newsize<1) newalloc=0;
152 else if (
m_granul<4096) newalloc=newsize+granul;
156 if (granul< 4096) granul=4096;
157 else if (granul>4*1024*1024) granul=4*1024*1024;
158 newalloc = ((newsize + granul + 96)&~4095)-96;
164 #ifdef WDL_HEAPBUF_TRACE
166 wsprintf(tmp,
"WDL_HeapBuf: type %s realloc(%d) from %d\n",m_tracetype,newalloc,
m_alloc);
167 OutputDebugString(tmp);
177 void *nbuf=realloc(
m_buf,newalloc);
180 if (!(nbuf=
malloc(newalloc)))
182 #ifdef WDL_HEAPBUF_ONMALLOCFAIL
183 WDL_HEAPBUF_ONMALLOCFAIL(newalloc);
205 #ifdef WDL_HEAPBUF_IMPL_ONLY
211 if (exactCopyOfConfig)
215 #ifdef WDL_HEAPBUF_TRACE
216 m_tracetype = hb->m_tracetype;
222 #ifdef WDL_HEAPBUF_ONMALLOCFAIL
239#ifndef WDL_HEAPBUF_IMPL_ONLY
247 #if defined(_WIN64) || defined(__LP64__)
252 #ifdef WDL_HEAPBUF_TRACE
253 const char *m_tracetype;
261 PTRTYPE *
Get()
const {
return (PTRTYPE *)
m_hb.Get(); }
265 PTRTYPE *
Resize(
int newsize,
bool resizedown =
true) {
return (PTRTYPE *)
m_hb.Resize(newsize*
sizeof(PTRTYPE),resizedown); }
266 PTRTYPE *
ResizeOK(
int newsize,
bool resizedown =
true) {
return (PTRTYPE *)
m_hb.ResizeOK(newsize*
sizeof(PTRTYPE), resizedown); }
268 PTRTYPE *
GetAligned(
int align)
const {
return (PTRTYPE *)
m_hb.GetAligned(align); }
281 PTRTYPE *
Add(
const PTRTYPE *buf,
int bufsz)
290 if (buf)
memcpy(
p,buf,bufsz*
sizeof(PTRTYPE));
291 else memset((
char*)
p,0,bufsz*
sizeof(PTRTYPE));
297 PTRTYPE *
Set(
const PTRTYPE *buf,
int bufsz)
304 if (buf)
memcpy(
p,buf,bufsz*
sizeof(PTRTYPE));
305 else memset((
char*)
p,0,bufsz*
sizeof(PTRTYPE));
314 if (idx >= 0 && idx <= sz)
319 memmove(
p+idx+1,
p+idx, (sz-idx)*
sizeof(PTRTYPE));
331 if (idx >= 0 && idx < sz)
333 memmove(
p+idx,
p+idx+1, (sz-idx-1)*
sizeof(PTRTYPE));
342 const PTRTYPE*
p=
Get();
345 for (
i=0;
i < sz; ++
i)
if (
p[
i] ==
val)
return i;
349#ifndef WDL_HEAPBUF_TRACE
365 PTRTYPE *rd =
Get(), *wr = rd;
366 for (
int x = 0;
x < sz;
x ++)
370 if (rd != wr) *wr=*rd;
376 if (cnt < sz)
Resize(cnt,
false);
uint8_t a
Definition Spc_Cpu.h:141
void * Resize(int newsize, bool resizedown=true)
Definition heapbuf.h:111
~WDL_HeapBuf()
Definition heapbuf.h:82
void * m_buf
Definition heapbuf.h:242
void * GetFast() const
Definition heapbuf.h:56
int m_size
Definition heapbuf.h:244
int GetGranul() const
Definition heapbuf.h:61
void * ResizeOK(int newsize, bool resizedown=true)
Definition heapbuf.h:63
void * Get() const
Definition heapbuf.h:55
int GetSize() const
Definition heapbuf.h:57
WDL_HeapBuf & operator=(const WDL_HeapBuf &cp)
Definition heapbuf.h:70
void * GetAligned(int align) const
Definition heapbuf.h:58
void SetGranul(int granul)
Definition heapbuf.h:60
void CopyFrom(const WDL_HeapBuf *hb, bool exactCopyOfConfig=false)
Definition heapbuf.h:208
WDL_HeapBuf(int granul=4096)
Definition heapbuf.h:79
int m_alloc
Definition heapbuf.h:243
int m_granul
Definition heapbuf.h:245
WDL_HeapBuf(const WDL_HeapBuf &cp)
Definition heapbuf.h:65
PTRTYPE * Resize(int newsize, bool resizedown=true)
Definition heapbuf.h:265
~WDL_TypedBuf()
Definition heapbuf.h:354
WDL_TypedBuf(int granul=4096)
Definition heapbuf.h:350
int Find(PTRTYPE val) const
Definition heapbuf.h:340
PTRTYPE * GetFast() const
Definition heapbuf.h:262
WDL_HeapBuf m_hb
Definition heapbuf.h:381
PTRTYPE * Insert(PTRTYPE val, int idx)
Definition heapbuf.h:311
WDL_HeapBuf * GetHeapBuf()
Definition heapbuf.h:358
PTRTYPE * ResizeOK(int newsize, bool resizedown=true)
Definition heapbuf.h:266
PTRTYPE * GetAligned(int align) const
Definition heapbuf.h:268
PTRTYPE * Add(const PTRTYPE *buf, int bufsz)
Definition heapbuf.h:281
void Delete(int idx)
Definition heapbuf.h:327
const WDL_HeapBuf * GetHeapBuf() const
Definition heapbuf.h:359
void SetGranul(int gran)
Definition heapbuf.h:338
PTRTYPE * Set(const PTRTYPE *buf, int bufsz)
Definition heapbuf.h:297
int GetSize() const
Definition heapbuf.h:263
PTRTYPE * Add(PTRTYPE val)
Definition heapbuf.h:270
PTRTYPE * Get() const
Definition heapbuf.h:261
int DeleteBatch(bool(*proc)(PTRTYPE *p, void *ctx), void *ctx=NULL)
Definition heapbuf.h:361
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
#define WDL_HEAPBUF_TRACEPARM(x)
Definition heapbuf.h:42
int val
Definition jpeglib.h:956
uintptr_t UINT_PTR
Definition swell-types.h:43
#define wsprintf
Definition swell-types.h:81
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
char * cp
Definition unix.c:513
typedef int(UZ_EXP MsgFn)()