diff --git a/nsprpub/lib/ds/MANIFEST b/nsprpub/lib/ds/MANIFEST index b4ce1eb05929ee468dd3563af06fe24070eabf43..ce8226bdd8b0804e9cc44acacaa72a16ca421acc 100644 --- a/nsprpub/lib/ds/MANIFEST +++ b/nsprpub/lib/ds/MANIFEST @@ -6,4 +6,3 @@ plarenas.h plarena.h plevent.h plhash.h -plvector.h diff --git a/nsprpub/lib/ds/Makefile b/nsprpub/lib/ds/Makefile index 23e8c7bc8c7c02fe7e03d6946ef3f4d0b0a48f54..6d7b27f7be5e6d078d95ca4023d8b7989d849774 100644 --- a/nsprpub/lib/ds/Makefile +++ b/nsprpub/lib/ds/Makefile @@ -34,7 +34,6 @@ CSRCS = \ plarena.c \ plevent.c \ plhash.c \ - plvector.c \ $(NULL) HEADERS = \ @@ -42,7 +41,6 @@ HEADERS = \ plarena.h \ plevent.h \ plhash.h \ - plvector.h \ $(NULL) ifeq ($(OS_ARCH), WINNT) diff --git a/nsprpub/lib/ds/plvector.c b/nsprpub/lib/ds/plvector.c deleted file mode 100644 index 7cde6f3543161a57a94077feb54187afd89405e0..0000000000000000000000000000000000000000 --- a/nsprpub/lib/ds/plvector.c +++ /dev/null @@ -1,318 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "plvector.h" -#include "prmem.h" -#include <string.h> - -#ifdef XP_WIN16 -#define SIZE_T_MAX 0xFF80 /* a little less than 64K, the max alloc size on win16. */ -#define MAX_ARR_ELEMS SIZE_T_MAX/sizeof(void*) -#endif - -PR_IMPLEMENT(PLVector*) -PL_NewVector(PRUint32 initialSize, PRInt32 initialGrowBy) -{ - PLVector* v = (PLVector*)PR_Malloc(sizeof(PLVector*)); - if (v == NULL) - return NULL; - PL_VectorInitialize(v, initialSize, initialGrowBy); - return v; -} - -PR_IMPLEMENT(void) -PL_VectorDestroy(PLVector* v) -{ - PL_VectorFinalize(v); - PR_Free(v); -} - -/* Initializes an existing vector */ -PR_IMPLEMENT(void) -PL_VectorInitialize(PLVector* v, PRUint32 initialSize, PRInt32 initialGrowBy) -{ - v->data = NULL; - v->size = v->maxSize = v->growBy = 0; - if (initialSize > 0 || initialGrowBy > 0) - PL_VectorSetSize(v, initialSize, initialGrowBy); -} - -/* Destroys the elements, but doesn't free the vector */ -PR_IMPLEMENT(void) -PL_VectorFinalize(PLVector* v) -{ - /* This implementation doesn't do anything to delete the elements - in the vector -- that's up to the caller. (Don't shoot me, - I just copied the code from libmsg.) */ - PR_Free(v->data); -} - -PR_IMPLEMENT(PRBool) -PL_VectorSetSize(PLVector* v, PRUint32 newSize, PRInt32 growBy) -{ - if (growBy != -1) - v->growBy = growBy; /* set new size */ - - if (newSize == 0) { - /* shrink to nothing */ - PR_Free(v->data); - v->data = NULL; - v->size = v->maxSize = 0; - } - else if (v->data == NULL) { - /* create one with exact size */ -#ifdef SIZE_T_MAX - PR_ASSERT(newSize <= SIZE_T_MAX/sizeof(void*)); /* no overflow */ -#endif - v->data = (void**)PR_Malloc(newSize * sizeof(void *)); - if (v->data == NULL) { - v->size = 0; - return PR_FALSE; - } - - memset(v->data, 0, newSize * sizeof(void *)); /* zero fill */ - - v->size = v->maxSize = newSize; - } - else if (newSize <= v->maxSize) { - /* it fits */ - if (newSize > v->size) { - /* initialize the new elements */ - - memset(&v->data[v->size], 0, (newSize-v->size) * sizeof(void *)); - } - v->size = newSize; - } - else { - /* otherwise, grow array */ - PRUint32 newMax; - void** newData; - PRInt32 growBy = v->growBy; - if (growBy == 0) { - /* heuristically determine growth when growBy == 0 - (this avoids heap fragmentation in many situations) */ - growBy = PR_MIN(1024, PR_MAX(4, v->size / 8)); - } -#ifdef MAX_ARR_ELEMS - if (v->size + growBy > MAX_ARR_ELEMS) - growBy = MAX_ARR_ELEMS - v->size; -#endif - if (newSize < v->maxSize + growBy) - newMax = v->maxSize + growBy; /* granularity */ - else - newMax = newSize; /* no slush */ - -#ifdef SIZE_T_MAX - if (newMax >= SIZE_T_MAX/sizeof(void*)) - return PR_FALSE; - PR_ASSERT(newMax <= SIZE_T_MAX/sizeof(void*)); /* no overflow */ -#endif - PR_ASSERT(newMax >= v->maxSize); /* no wrap around */ - newData = (void**)PR_Malloc(newMax * sizeof(void*)); - - if (newData != NULL) { - /* copy new data from old */ - memcpy(newData, v->data, v->size * sizeof(void*)); - - /* construct remaining elements */ - PR_ASSERT(newSize > v->size); - - memset(&newData[v->size], 0, (newSize-v->size) * sizeof(void*)); - - /* get rid of old stuff (note: no destructors called) */ - PR_Free(v->data); - v->data = newData; - v->size = newSize; - v->maxSize = newMax; - } - else { - return PR_FALSE; - } - } - return PR_TRUE; -} - -PR_IMPLEMENT(PRBool) -PL_VectorIsValidIndex(PLVector* v, PRUint32 index) -{ - return (index < v->size) ? PR_TRUE : PR_FALSE; -} - - -PR_IMPLEMENT(void) -PL_VectorCompact(PLVector* v) -{ - if (v->size != v->maxSize) { - /* shrink to desired size */ -#ifdef SIZE_T_MAX - PR_ASSERT(v->size <= SIZE_T_MAX/sizeof(void *)); /* no overflow */ -#endif - void ** newData = NULL; - if (v->size != 0) { - newData = (void **)PR_Malloc(v->size * sizeof(void *)); - /* copy new data from old */ - memcpy(newData, v->data, v->size * sizeof(void *)); - } - - /* get rid of old stuff (note: no destructors called) */ - PR_Free(v->data); - v->data = newData; - v->maxSize = v->size; - } -} - -#if 0 /* becomes Copy */ -PR_IMPLEMENT(void) -PL_VectorSplice(PLVector* v, PRUint32 startIndex, PLVector* newVector) -{ - PRUint32 i; - PR_ASSERT(newVector != NULL); - - if (PL_VectorGetSize(newVector) > 0) { - PL_VectorInsert(v, startIndex, PL_VectorGet(newVector, 0), - PL_VectorGetSize(newVector)); - for (i = 0; i < PL_VectorGetSize(newVector); i++) - PL_VectorSet(v, startIndex + i, PL_VectorGet(newVector, i)); - } -} -#endif - -PR_IMPLEMENT(void) -PL_VectorCopy(PLVector* dstVector, PRUint32 dstPosition, - PLVector* srcVector, PRUint32 srcPosition, PRUint32 length) -{ - PR_ASSERT(0); /* XXX not implemented yet */ -#if 0 - PL_VectorSetSize(dstVector, PR_MAX(PL_VectorGetSize(dstVector), - PL_VectorGetSize(srcVector)), - PL_VECTOR_GROW_DEFAULT); - - if (v->data) - PR_Free(v->data); - v->size = oldA->v->size; - v->maxSize = oldA->v->maxSize; - v->growBy = oldA->v->growBy; - v->data = (void**)PR_Malloc(v->size * sizeof(void *)); - if (v->data == NULL) { - v->size = 0; - } - else { - memcpy(v->data, oldA->v->data, v->size * sizeof(void *)); - } -#endif -} - -PR_IMPLEMENT(PLVector*) -PL_VectorClone(PLVector* v) -{ - PLVector* newVec = PL_NewVector(v->size, v->growBy); - PL_VectorCopy(newVec, 0, v, 0, v->size); - return newVec; -} - -/* Accessing elements */ - -PR_IMPLEMENT(void) -PL_VectorSet(PLVector* v, PRUint32 index, void* newElement) -{ - if (index >= v->size) { - if (!PL_VectorSetSize(v, index+1, PL_VECTOR_GROW_DEFAULT)) - return; - } - v->data[index] = newElement; -} - -/* Adds at the end */ -PR_IMPLEMENT(PRUint32) -PL_VectorAdd(PLVector* v, void* newElement) -{ - PRUint32 index = v->size; -#ifdef XP_WIN16 - if (index >= SIZE_T_MAX / 4L) { - return -1; - } -#endif - PL_VectorSet(v, index, newElement); - return index; -} - -/* Inserts new element count times at index */ -PR_IMPLEMENT(void) -PL_VectorInsert(PLVector* v, PRUint32 index, void* newElement, PRUint32 count) -{ - PR_ASSERT(count > 0); /* zero or negative size not allowed */ - - if (index >= v->size) { - /* adding after the end of the array */ - if (!PL_VectorSetSize(v, index + count, PL_VECTOR_GROW_DEFAULT)) - return; /* grow so index is valid */ - } - else { - /* inserting in the middle of the array */ - PRUint32 nOldSize = v->size; - if (!PL_VectorSetSize(v, v->size + count, PL_VECTOR_GROW_DEFAULT)) - return; /* grow it to new size */ - /* shift old data up to fill gap */ - memmove(&v->data[index+count], &v->data[index], - (nOldSize-index) * sizeof(void *)); - - /* re-init slots we copied from */ - memset(&v->data[index], 0, count * sizeof(void *)); - } - - /* insert new value in the gap */ - PR_ASSERT(index + count <= v->size); - while (count--) - v->data[index++] = newElement; -} - -/* Removes count elements at index */ -PR_IMPLEMENT(void) -PL_VectorRemove(PLVector* v, PRUint32 index, PRUint32 count) -{ - PRUint32 moveCount; - PR_ASSERT(count >= 0); - PR_ASSERT(index + count <= v->size); - - /* just remove a range */ - moveCount = v->size - (index + count); - - if (moveCount) - memmove(&v->data[index], &v->data[index + count], - moveCount * sizeof(void *)); - v->size -= count; -} - -#ifdef DEBUG - -PR_IMPLEMENT(void) -PL_VectorAssertValid(PLVector* v) -{ - if (v->data == NULL) { - PR_ASSERT(v->size == 0); - PR_ASSERT(v->maxSize == 0); - } - else { - PR_ASSERT(v->size >= 0); - PR_ASSERT(v->maxSize >= 0); - PR_ASSERT(v->size <= v->maxSize); - } -} - -#endif - diff --git a/nsprpub/lib/ds/plvector.h b/nsprpub/lib/ds/plvector.h deleted file mode 100644 index a82e849d26262d807a43ee0a95425088e602ea73..0000000000000000000000000000000000000000 --- a/nsprpub/lib/ds/plvector.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef plvector_h__ -#define plvector_h__ - -#include "prtypes.h" -#include "prlog.h" - -PR_BEGIN_EXTERN_C - -/* Vectors are extensible arrays */ - -typedef struct PLVector { - void** data; /* the actual array of data */ - PRUint32 size; /* # of elements (upperBound - 1) */ - PRUint32 maxSize; /* max allocated */ - PRInt32 growBy; /* grow amount */ -} PLVector; - -PR_EXTERN(PLVector*) -PL_NewVector(PRUint32 initialSize, PRInt32 initialGrowBy); - -PR_EXTERN(void) -PL_VectorDestroy(PLVector* v); - -/* Initializes an existing vector */ -PR_EXTERN(void) -PL_VectorInitialize(PLVector* v, PRUint32 initialSize, PRInt32 initialGrowBy); - -/* Destroys the elements, but doesn't free the vector */ -PR_EXTERN(void) -PL_VectorFinalize(PLVector* v); - -#define PL_VectorGetSize(v) ((v)->size) - -#define PL_VECTOR_GROW_DEFAULT (-1) - -PR_EXTERN(PRBool) -PL_VectorSetSize(PLVector* v, PRUint32 newSize, PRInt32 growBy); - -PR_EXTERN(PRBool) -PL_VectorIsValidIndex(PLVector* v, PRUint32 index); - -PR_EXTERN(void) -PL_VectorCompact(PLVector* v); - -PR_EXTERN(void) -PL_VectorCopy(PLVector* dstVector, PRUint32 dstPosition, - PLVector* srcVector, PRUint32 srcPosition, PRUint32 length); - -PR_EXTERN(PLVector*) -PL_VectorClone(PLVector* v); - -/* Accessing elements */ - -#define PL_VectorGetAddr(v, index) (PR_ASSERT((index) < (v)->size), &(v)->data[index]) - -#define PL_VectorGet(v, index) (*PL_VectorGetAddr(v, index)) - -PR_EXTERN(void) -PL_VectorSet(PLVector* v, PRUint32 index, void* newElement); - -/* Adds at the end */ -PR_EXTERN(PRUint32) -PL_VectorAdd(PLVector* v, void* newElement); - -/* Inserts new element count times at index */ -PR_EXTERN(void) -PL_VectorInsert(PLVector* v, PRUint32 index, void* newElement, PRUint32 count); - -/* Removes count elements at index */ -PR_EXTERN(void) -PL_VectorRemove(PLVector* v, PRUint32 index, PRUint32 count); - -#ifdef DEBUG - -PR_EXTERN(void) -PL_VectorAssertValid(PLVector* v); - -#endif - -PR_END_EXTERN_C - -#endif /* plvector_h__ */