📄 vnew.cpp
字号:
/****************************************************************
Copyright 1993 Software Development Systems, Inc.
All rights reserved
C++ Runtime Support -- _vector_new/delete/apply
****************************************************************/
#include "new.h"
/********************************************************
Prototypes are needed to avoid warning messages.
They are not in a header file because they are
internal calls generated by the compiler.
********************************************************/
extern "C++" {
void *_vector_new(void *, size_t, size_t, int, void (*)(void *));
void _vector_delete(void *, size_t, size_t, int, void (*)(void *, int));
void _vector_apply(void *, void *, size_t, size_t, void (*)(void *, void *));
}
#define DTOR_DVB 0x02 // must agree with definition in cxx.h!
/****************************************************************
_vector_new: construct array of class objects.
****************************************************************/
void *_vector_new(void *ptr, size_t objsize, size_t totsize, int flags,
void (*ctor)(void *))
{
size_t extra, offset = 0;
char *p;
if (!ptr)
{ // allocate memory
p = (char *)ptr;
extra = flags ? sizeof(size_t) : 0;
p = (char *)operator new(totsize + extra);
if (!p)
return 0; // return 0 if allocation fails
if (extra)
{ // save array size
*(size_t *)p = totsize;
p += extra;
}
ptr = p;
}
p = (char *)ptr;
while (offset < totsize)
{
ctor(p); // call constructor
p += objsize;
offset += objsize;
}
return ptr; // return pointer to array
}
/****************************************************************
_vector_delete: destroy array of class objects.
****************************************************************/
void _vector_delete(void *ptr, size_t objsize, size_t totsize, int flags,
void (*dtor)(void *, int))
{
size_t count = 0;
char *p;
if (!ptr) return; // return if not allocated
p = (char *)ptr;
if (flags)
{ // get size of array
p -= sizeof(size_t);
totsize = *(size_t *)p;
ptr = p;
p += sizeof(size_t);
}
p += totsize;
while (count < totsize)
{
p -= objsize;
dtor(p, DTOR_DVB); // call destructor
count += objsize;
}
if (flags)
operator delete(ptr); // deallocate memory
}
/****************************************************************
_vector_apply: copy array of class objects.
****************************************************************/
void _vector_apply(void *dest, void *src, size_t size, size_t count,
void (*func)(void *, void *))
{
size_t n;
char *dp, *sp;
dp = (char *)dest;
sp = (char *)src;
for (n = 0; n < count; n++)
{
(*func)(dp, sp);
dp += size;
sp += size;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -