FreeWRL / FreeX3D 4.3.0
Vector.h
1/*
2Vector.h
3General purpose containers - vector and stack (implemented on top of it)
4*/
5
6/****************************************************************************
7 This file is part of the FreeWRL/FreeX3D Distribution.
8
9 Copyright 2009 CRC Canada. (http://www.crc.gc.ca)
10
11 FreeWRL/FreeX3D is free software: you can redistribute it and/or modify
12 it under the terms of the GNU Lesser Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 FreeWRL/FreeX3D is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with FreeWRL/FreeX3D. If not, see <http://www.gnu.org/licenses/>.
23****************************************************************************/
24
25
26#ifndef VECTOR_H
27#define VECTOR_H
28
29#include <stddef.h>
30
31/* ************************************************************************** */
32/* ******************************** Vector ********************************** */
33/* ************************************************************************** */
34
35/* This is the vector structure. */
36struct Vector
37{
38 int n;
39 int allocn;
40 void* data;
41};
42
43/* Constructor/destructor */
44struct Vector* newVector_(int elSize, int initSize,char *,int);
45#define newVector(type, initSize) \
46 newVector_((int)sizeof(type), initSize,__FILE__,__LINE__)
47
48#if defined(WRAP_MALLOC) || defined(DEBUG_MALLOC)
49 void deleteVectorDebug_(char *file, int line, int elSize, struct Vector**);
50 #define deleteVector(type, me) deleteVectorDebug_(__FILE__,__LINE__,(int)sizeof(type), &(me))
51#else
52 void deleteVector_(int elSize, struct Vector**);
53 #define deleteVector(type, me) deleteVector_((int)sizeof(type), ((struct Vector**)(&me)))
54#endif
55
56/* Ensures there's at least one space free. */
57void vector_ensureSpace_(int, struct Vector*, char *fi, int line);
58void testVector_(int elSize, struct Vector* me);
59#define testVector(type,me) \
60 testVector_(sizeof(type),me);
61
62/* Element retrieval. */
63#define vector_get(type, me, ind) \
64 ((type*)((struct Vector*)me)->data)[ind]
65
66/* pointer to element retrieval */
67#define vector_get_ptr(type, me, ind) \
68 &((type*)((struct Vector*)me)->data)[ind]
69
70
71/* Element set. */
72#define vector_set(type,me,element,value) \
73 ((type*)((struct Vector *) (me))->data)[element]=value
74
75void vector_removeElement(int elSize,struct Vector* myp, int element);
76#define vector_remove_elem(type,me,element) \
77 vector_removeElement((int)sizeof(type),me,element)
78
79/* Size of vector */
80#define vectorSize(me) \
81 (((struct Vector*)me)->n)
82
83/* Back of a vector */
84#define vector_back(type, me) \
85 vector_get(type, me, vectorSize(me)-1)
86
87/* Is the vector empty? */
88#define vector_empty(me) \
89 (!vectorSize(me))
90
91/* Shrink the vector to minimum required space. */
92void vector_shrink_(int, struct Vector*);
93#define vector_shrink(type, me) \
94 vector_shrink_((int)sizeof(type), me)
95
96 /* clear out allocated data, n=0,nalloc=0 so ready for pushBack*/
97 void vector_clear(struct Vector* me);
98
99/* Push back operation. */
100#define vector_pushBack(type, me, el) \
101 { \
102 vector_ensureSpace_((int)sizeof(type), me,__FILE__,__LINE__); \
103 ASSERT(((struct Vector*)me)->n<((struct Vector*)me)->allocn); \
104 vector_get(type, me, ((struct Vector*)me)->n)=el; \
105 ++((struct Vector*)me)->n; \
106 }
107
108/* Pop back operation */
109void vector_popBack_(struct Vector*, size_t count);
110#define vector_popBack(type, me) \
111 { \
112 ASSERT(!vector_empty(me)); \
113 --((struct Vector*)me)->n; \
114 }
115#define vector_popBackN(type, me, popn) \
116 { \
117 ASSERT(popn<=vectorSize(me)); \
118 ((struct Vector*)me)->n-=popn; \
119 }
120
121/* Release and get vector data. */
122void* vector_releaseData_(int, struct Vector*);
123#define vector_releaseData(type, me) \
124 vector_releaseData_((int)sizeof(type), me)
125
126/* ************************************************************************** */
127/* ************************************ Stack ******************************* */
128/* ************************************************************************** */
129
130/* A stack is essentially a vector */
131typedef struct Vector Stack;
132
133/* Constructor and destructor */
134#define newStack(type) \
135 newVector(type, 4)
136#define deleteStack(type, me) \
137 deleteVector(type, me)
138#define clearStack(me) \
139 vector_clear(me)
140
141/* Push and pop */
142#define stack_push(type, me, el) \
143 vector_pushBack(type, me, el)
144#define stack_pop(type, me) \
145 vector_popBack(type, me)
146
147/* Top of stack */
148#define stack_top(type, me) \
149 vector_get(type, me, vectorSize(me)-1)
150
151#define stack_top_ptr(type, me) \
152 vector_get_ptr(type, me, vectorSize(me)-1)
153
154
155/* Is the stack empty? */
156#define stack_empty(me) \
157 vector_empty(me)
158
159/* tie assert in here to give better failure methodology */
160/* #define ASSERT(cond) if(!(cond)){fw_assert(__FILE__,__LINE__);} */
161/* void fw_assert(char *,int); */
162
163#endif /* Once-check */