antlr3collections.h revision 324c4644fee44b9898524c09511bd33c3f12e2df
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef	ANTLR3COLLECTIONS_H
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define	ANTLR3COLLECTIONS_H
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// [The "BSD licence"]
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://www.temporal-wave.com
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://www.linkedin.com/in/jimidle
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// All rights reserved.
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Redistribution and use in source and binary forms, with or without
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// modification, are permitted provided that the following conditions
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// are met:
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// 1. Redistributions of source code must retain the above copyright
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//    notice, this list of conditions and the following disclaimer.
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 2. Redistributions in binary form must reproduce the above copyright
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//    notice, this list of conditions and the following disclaimer in the
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//    documentation and/or other materials provided with the distribution.
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 3. The name of the author may not be used to endorse or promote products
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//    derived from this software without specific prior written permission.
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include    <antlr3defs.h>
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include    <antlr3bitset.h>
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define	ANTLR3_HASH_TYPE_INT	0   /**< Indicates the hashed file has integer keys */
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define	ANTLR3_HASH_TYPE_STR	1   /**< Indicates the hashed file has numeric keys */
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifdef __cplusplus
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)extern "C" {
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef struct ANTLR3_HASH_KEY_struct
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	ANTLR3_UINT8	type;	/**< One of ##ANTLR3_HASH_TYPE_INT or ##ANTLR3_HASH_TYPE_STR	*/
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	union
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	{
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		pANTLR3_UINT8   sKey;	/**< Used if type is ANTLR3_HASH_TYPE_STR			*/
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)		ANTLR3_INTKEY   iKey;	/**< used if type is ANTLR3_HASH_TYPE_INT			*/
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	}
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	key;
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} ANTLR3_HASH_KEY, *pANTLR3_HASH_KEY;
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** Internal structure representing an element in a hash bucket.
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *  Stores the original key so that duplicate keys can be rejected
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *  if necessary, and contains function can be supported. If the hash key
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *  could be unique I would have invented the perfect compression algorithm ;-)
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef	struct	ANTLR3_HASH_ENTRY_struct
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /** Key that created this particular entry
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ANTLR3_HASH_KEY 	keybase;
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /** Pointer to the data for this particular entry
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    void	    * data;
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /** Pointer to routine that knows how to release the memory
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     *  structure pointed at by data. If this is NULL then we assume
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     *  that the data pointer does not need to be freed when the entry
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     *  is deleted from the table.
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    void	    (ANTLR3_CDECL *free)(void * data);
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /** Pointer to the next entry in this bucket if there
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *  is one. Sometimes different keys will hash to the same bucket (especially
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     *  if the number of buckets is small). We could implement dual hashing algorithms
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     *  to minimize this, but that seems over the top for what this is needed for.
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    struct	ANTLR3_HASH_ENTRY_struct * nextEntry;
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ANTLR3_HASH_ENTRY;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** Internal structure of a hash table bucket, which tracks
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *  all keys that hash to the same bucket.
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct	ANTLR3_HASH_BUCKET_struct
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /** Pointer to the first entry in the bucket (if any, it
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     *  may be NULL). Duplicate entries are chained from
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * here.
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    pANTLR3_HASH_ENTRY	entries;
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ANTLR3_HASH_BUCKET;
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/** Structure that tracks a hash table
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef	struct	ANTLR3_HASH_TABLE_struct
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /** Indicates whether the table allows duplicate keys
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int					allowDups;
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /** Number of buckets available in this table
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ANTLR3_UINT32		modulo;
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /** Points to the memory where the array of buckets
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * starts.
115     */
116    pANTLR3_HASH_BUCKET	buckets;
117
118    /** How many elements currently exist in the table.
119     */
120    ANTLR3_UINT32		count;
121
122    /** Whether the hash table should strdup the keys it is given or not.
123     */
124    ANTLR3_BOOLEAN              doStrdup;
125
126    /** Pointer to function to completely delete this table
127     */
128    void				(*free)	    (struct ANTLR3_HASH_TABLE_struct * table);
129
130    /* String keyed hashtable functions */
131    void				(*del)	    (struct ANTLR3_HASH_TABLE_struct * table, void * key);
132    pANTLR3_HASH_ENTRY	(*remove)   (struct ANTLR3_HASH_TABLE_struct * table, void * key);
133    void *				(*get)	    (struct ANTLR3_HASH_TABLE_struct * table, void * key);
134    ANTLR3_INT32		(*put)	    (struct ANTLR3_HASH_TABLE_struct * table, void * key, void * element, void (ANTLR3_CDECL *freeptr)(void *));
135
136    /* Integer based hash functions */
137    void				(*delI)	    (struct ANTLR3_HASH_TABLE_struct * table, ANTLR3_INTKEY key);
138    pANTLR3_HASH_ENTRY	(*removeI)  (struct ANTLR3_HASH_TABLE_struct * table, ANTLR3_INTKEY key);
139    void *				(*getI)	    (struct ANTLR3_HASH_TABLE_struct * table, ANTLR3_INTKEY key);
140    ANTLR3_INT32		(*putI)	    (struct ANTLR3_HASH_TABLE_struct * table, ANTLR3_INTKEY key, void * element, void (ANTLR3_CDECL *freeptr)(void *));
141
142    ANTLR3_UINT32		(*size)	    (struct ANTLR3_HASH_TABLE_struct * table);
143}
144    ANTLR3_HASH_TABLE;
145
146
147/** Internal structure representing an enumeration of a table.
148 *  This is returned by antlr3Enumeration()
149 *  Allows the programmer to traverse the table in hash order without
150 *  knowing what is in the actual table.
151 *
152 *  Note that it is up to the caller to ensure that the table
153 *  structure does not change in the hash bucket that is currently being
154 *  enumerated as this structure just tracks the next pointers in the
155 *  bucket series.
156 */
157typedef struct	ANTLR3_HASH_ENUM_struct
158{
159    /* Pointer to the table we are enumerating
160     */
161    pANTLR3_HASH_TABLE	table;
162
163    /* Bucket we are currently enumerating (if NULL then we are done)
164     */
165    ANTLR3_UINT32	bucket;
166
167    /* Next entry to return, if NULL, then move to next bucket if any
168     */
169    pANTLR3_HASH_ENTRY	entry;
170
171    /* Interface
172     */
173    int		(*next)	    (struct ANTLR3_HASH_ENUM_struct * en, pANTLR3_HASH_KEY *key, void ** data);
174    void	(*free)	    (struct ANTLR3_HASH_ENUM_struct * table);
175}
176    ANTLR3_HASH_ENUM;
177
178/** Structure that represents a LIST collection
179 */
180typedef	struct	ANTLR3_LIST_struct
181{
182    /** Hash table that is storing the list elements
183     */
184    pANTLR3_HASH_TABLE	table;
185
186    void			(*free)		(struct ANTLR3_LIST_struct * list);
187    void			(*del)		(struct ANTLR3_LIST_struct * list, ANTLR3_INTKEY key);
188    void *			(*get)		(struct ANTLR3_LIST_struct * list, ANTLR3_INTKEY key);
189    void *			(*remove)	(struct ANTLR3_LIST_struct * list, ANTLR3_INTKEY key);
190    ANTLR3_INT32    (*add)		(struct ANTLR3_LIST_struct * list, void * element, void (ANTLR3_CDECL *freeptr)(void *));
191    ANTLR3_INT32    (*put)		(struct ANTLR3_LIST_struct * list, ANTLR3_INTKEY key, void * element, void (ANTLR3_CDECL *freeptr)(void *));
192    ANTLR3_UINT32   (*size)		(struct ANTLR3_LIST_struct * list);
193
194}
195    ANTLR3_LIST;
196
197/** Structure that represents a Stack collection
198 */
199typedef	struct	ANTLR3_STACK_struct
200{
201    /** List that supports the stack structure
202     */
203    pANTLR3_VECTOR  vector;
204
205    /** Used for quick access to the top of the stack
206     */
207    void *	    top;
208    void			(*free)	(struct ANTLR3_STACK_struct * stack);
209    void *			(*pop)	(struct ANTLR3_STACK_struct * stack);
210    void *			(*get)	(struct ANTLR3_STACK_struct * stack, ANTLR3_INTKEY key);
211    ANTLR3_BOOLEAN  (*push)	(struct ANTLR3_STACK_struct * stack, void * element, void (ANTLR3_CDECL *freeptr)(void *));
212    ANTLR3_UINT32   (*size)	(struct ANTLR3_STACK_struct * stack);
213    void *			(*peek)	(struct ANTLR3_STACK_struct * stack);
214
215}
216    ANTLR3_STACK;
217
218/* Structure that represents a vector element
219 */
220typedef struct ANTLR3_VECTOR_ELEMENT_struct
221{
222    void    * element;
223    void (ANTLR3_CDECL *freeptr)(void *);
224}
225    ANTLR3_VECTOR_ELEMENT, *pANTLR3_VECTOR_ELEMENT;
226
227#define ANTLR3_VECTOR_INTERNAL_SIZE     16
228/* Structure that represents a vector collection. A vector is a simple list
229 * that contains a pointer to the element and a pointer to a function that
230 * that can free the element if it is removed. It auto resizes but does not
231 * use hash techniques as it is referenced by a simple numeric index. It is not a
232 * sparse list, so if any element is deleted, then the ones following are moved
233 * down in memory and the count is adjusted.
234 */
235typedef struct ANTLR3_VECTOR_struct
236{
237    /** Array of pointers to vector elements
238     */
239    pANTLR3_VECTOR_ELEMENT  elements;
240
241    /** Number of entries currently in the list;
242     */
243    ANTLR3_UINT32   count;
244
245    /** Many times, a vector holds just a few nodes in an AST and it
246     * is too much overhead to malloc the space for elements so
247     * at the expense of a few bytes of memory, we hold the first
248     * few elements internally. It means we must copy them when
249     * we grow beyond this initial size, but that is less overhead than
250     * the malloc/free callas we would otherwise require.
251     */
252    ANTLR3_VECTOR_ELEMENT   internal[ANTLR3_VECTOR_INTERNAL_SIZE];
253
254    /** Indicates if the structure was made by a factory, in which
255     *  case only the factory can free the memory for the actual vector,
256     *  though the vector free function is called and will recurse through its
257     *  entries calling any free pointers for each entry.
258     */
259    ANTLR3_BOOLEAN  factoryMade;
260
261    /** Total number of entries in elements at any point in time
262     */
263    ANTLR3_UINT32   elementsSize;
264
265    void			(ANTLR3_CDECL *free)	(struct ANTLR3_VECTOR_struct * vector);
266    void			(*del)					(struct ANTLR3_VECTOR_struct * vector, ANTLR3_UINT32 entry);
267    void *			(*get)					(struct ANTLR3_VECTOR_struct * vector, ANTLR3_UINT32 entry);
268    void *			(*remove)				(struct ANTLR3_VECTOR_struct * vector, ANTLR3_UINT32 entry);
269    void			(*clear)				(struct ANTLR3_VECTOR_struct * vector);
270    ANTLR3_BOOLEAN              (*swap)                 (struct ANTLR3_VECTOR_struct *, ANTLR3_UINT32 entry1, ANTLR3_UINT32 entry2);
271    ANTLR3_UINT32   (*add)					(struct ANTLR3_VECTOR_struct * vector, void * element, void (ANTLR3_CDECL *freeptr)(void *));
272    ANTLR3_UINT32   (*set)					(struct ANTLR3_VECTOR_struct * vector, ANTLR3_UINT32 entry, void * element, void (ANTLR3_CDECL *freeptr)(void *), ANTLR3_BOOLEAN freeExisting);
273    ANTLR3_UINT32   (*size)					(struct ANTLR3_VECTOR_struct * vector);
274}
275    ANTLR3_VECTOR;
276
277/** Default vector pool size if otherwise unspecified
278 */
279#define ANTLR3_FACTORY_VPOOL_SIZE 256
280
281/** Structure that tracks vectors in a vector and auto deletes the vectors
282 *  in the vector factory when closed.
283 */
284typedef struct ANTLR3_VECTOR_FACTORY_struct
285{
286
287        /** List of all vector pools allocated so far
288         */
289        pANTLR3_VECTOR      *pools;
290
291        /** Count of the vector pools allocated so far (current active pool)
292         */
293        ANTLR3_INT32         thisPool;
294
295        /** The next vector available in the pool
296         */
297        ANTLR3_UINT32        nextVector;
298
299        /** Trick to quickly initialize a new vector via memcpy and not a function call
300         */
301        ANTLR3_VECTOR        unTruc;
302
303		/** Consumers from the factory can release a factory produced vector
304		 * back to the factory so that it may be reused (and thus conserve memory)
305		 * by another caller. The available vectors are stored here. Note that
306		 * the only vectors avaible in the free chain are produced by this factory, so they
307		 * need not be explicitly freed when the factory is closed.
308		 */
309		pANTLR3_STACK		 freeStack;
310
311       	/** Function to close the vector factory
312	 */
313	void                (*close)	    (struct ANTLR3_VECTOR_FACTORY_struct * factory);
314
315	/** Function to supply a new vector
316	 */
317	pANTLR3_VECTOR      (*newVector)    (struct ANTLR3_VECTOR_FACTORY_struct * factory);
318
319	/// Function to return a vector to the factory for reuse
320	///
321	void				(*returnVector)	(struct ANTLR3_VECTOR_FACTORY_struct * factory, pANTLR3_VECTOR vector);
322
323}
324ANTLR3_VECTOR_FACTORY;
325
326
327/* -------------- TRIE Interfaces ---------------- */
328
329
330/** Structure that holds the payload entry in an ANTLR3_INT_TRIE or ANTLR3_STRING_TRIE
331 */
332typedef struct ANTLR3_TRIE_ENTRY_struct
333{
334	ANTLR3_UINT32   type;
335	void (ANTLR3_CDECL *freeptr)(void *);
336	union
337	{
338		ANTLR3_INTKEY     intVal;
339		void		* ptr;
340	} data;
341
342	struct ANTLR3_TRIE_ENTRY_struct	* next;	    /* Allows duplicate entries for same key in insertion order	*/
343}
344ANTLR3_TRIE_ENTRY, * pANTLR3_TRIE_ENTRY;
345
346
347/** Structure that defines an element/node in an ANTLR3_INT_TRIE
348 */
349typedef struct ANTLR3_INT_TRIE_NODE_struct
350{
351    ANTLR3_UINT32							  bitNum;	/**< This is the left/right bit index for traversal along the nodes				*/
352    ANTLR3_INTKEY							  key;		/**< This is the actual key that the entry represents if it is a terminal node  */
353    pANTLR3_TRIE_ENTRY						  buckets;	/**< This is the data bucket(s) that the key indexes, which may be NULL			*/
354    struct ANTLR3_INT_TRIE_NODE_struct	    * leftN;	/**< Pointer to the left node from here when sKey & bitNum = 0					*/
355    struct ANTLR3_INT_TRIE_NODE_struct	    * rightN;	/**< Pointer to the right node from here when sKey & bitNum, = 1				*/
356}
357    ANTLR3_INT_TRIE_NODE, * pANTLR3_INT_TRIE_NODE;
358
359/** Structure that defines an ANTLR3_INT_TRIE. For this particular implementation,
360 *  as you might expect, the key is turned into a "string" by looking at bit(key, depth)
361 *  of the integer key. Using 64 bit keys gives us a depth limit of 64 (or bit 0..63)
362 *  and potentially a huge trie. This is the algorithm for a Patricia Trie.
363 *  Note also that this trie [can] accept multiple entries for the same key and is
364 *  therefore a kind of elastic bucket patricia trie.
365 *
366 *  If you find this code useful, please feel free to 'steal' it for any purpose
367 *  as covered by the BSD license under which ANTLR is issued. You can cut the code
368 *  but as the ANTLR library is only about 50K (Windows Vista), you might find it
369 *  easier to just link the library. Please keep all comments and licenses and so on
370 *  in any version of this you create of course.
371 *
372 *  Jim Idle.
373 *
374 */
375typedef struct ANTLR3_INT_TRIE_struct
376{
377    pANTLR3_INT_TRIE_NODE   root;			/* Root node of this integer trie					*/
378    pANTLR3_INT_TRIE_NODE   current;		/* Used to traverse the TRIE with the next() method	*/
379    ANTLR3_UINT32			count;			/* Current entry count								*/
380    ANTLR3_BOOLEAN			allowDups;		/* Whether this trie accepts duplicate keys			*/
381
382
383    pANTLR3_TRIE_ENTRY	(*get)	(struct ANTLR3_INT_TRIE_struct * trie, ANTLR3_INTKEY key);
384    ANTLR3_BOOLEAN		(*del)	(struct ANTLR3_INT_TRIE_struct * trie, ANTLR3_INTKEY key);
385    ANTLR3_BOOLEAN		(*add)	(struct ANTLR3_INT_TRIE_struct * trie, ANTLR3_INTKEY key, ANTLR3_UINT32 type, ANTLR3_INTKEY intVal, void * data, void (ANTLR3_CDECL *freeptr)(void *));
386    void				(*free)	(struct ANTLR3_INT_TRIE_struct * trie);
387
388}
389    ANTLR3_INT_TRIE;
390
391/**
392 * A topological sort system that given a set of dependencies of a node m on node n,
393 * can sort them in dependency order. This is a generally useful utility object
394 * that does not care what the things are it is sorting. Generally the set
395 * to be sorted will be numeric indexes into some other structure such as an ANTLR3_VECTOR.
396 * I have provided a sort method that given ANTLR3_VECTOR as an input will sort
397 * the vector entries in place, as well as a sort method that just returns an
398 * array of the sorted noded indexes, in case you are not sorting ANTLR3_VECTORS but
399 * some set of your own device.
400 *
401 * Of the two main algorithms that could be used, I chose to use the depth first
402 * search for unvisited nodes as a) This runs in linear time, and b) it is what
403 * we used in the ANTLR Tool to perform a topological sort of the input grammar files
404 * based on their dependencies.
405 */
406typedef struct ANTLR3_TOPO_struct
407{
408    /**
409     * A vector of vectors of edges, built by calling the addEdge method()
410     * to indicate that node number n depends on node number m. Each entry in the vector
411     * contains a bitset, which has a bit index set for each node upon which the
412     * entry node depends.
413     */
414    pANTLR3_BITSET  * edges;
415
416    /**
417     * A vector used to build up the sorted output order. Note that
418     * as the vector contains UINT32 then the maximum node index is
419     * 'limited' to 2^32, as nodes should be zero based.
420     */
421    pANTLR3_UINT32    sorted;
422
423    /**
424     * A vector used to detect cycles in the edge dependecies. It is used
425     * as a stack and each time we descend a node to one of its edges we
426     * add the node into this stack. If we find a node that we have already
427     * visited in the stack, then it means there wasa cycle such as 9->8->1->9
428     * as the only way a node can be on the stack is if we are currently
429     * descnding from it as we remove it from the stack as we exit from
430     * descending its dependencies
431     */
432    pANTLR3_UINT32    cycle;
433
434    /**
435     * A flag that indicates the algorithm found a cycle in the edges
436     * such as 9->8->1->9
437     * If this flag is set after you have called one of the sort routines
438     * then the detected cycle will be contained in the cycle array and
439     * cycleLimit will point to the one after the last entry in the cycle.
440     */
441    ANTLR3_BOOLEAN    hasCycle;
442
443    /**
444     * A watermark used to accumulate potential cycles in the cycle array.
445     * This should be zero when we are done. Check hasCycle after calling one
446     * of the sort methods and if it is ANTLR3_TRUE then you can find the cycle
447     * in cycle[0]...cycle[cycleMark-1]
448     */
449    ANTLR3_UINT32     cycleMark;
450
451    /**
452     * One more than the largest node index that is contained in edges/sorted.
453     */
454    ANTLR3_UINT32     limit;
455
456    /**
457     * The set of visited nodes as determined by a set entry in
458     * the bitmap.
459     */
460    pANTLR3_BITSET    visited;
461
462    /**
463     * A method that adds an edge from one node to another. An edge
464     * of n -> m indicates that node n is dependent on node m. Note that
465     * while building these edges, it is perfectly OK to add nodes out of
466     * sequence. So, if you have edges:
467     *
468     * 3 -> 0
469     * 2 -> 1
470     * 1 -> 3
471     *
472     * The you can add them in that order and so add node 3 before nodes 2 and 1
473     *
474     */
475    void            (*addEdge)          (struct ANTLR3_TOPO_struct * topo, ANTLR3_UINT32 edge, ANTLR3_UINT32 dependency);
476
477
478    /**
479     * A method that returns a pointer to an array of sorted node indexes.
480     * The array is sorted in topological sorted order. Note that the array
481     * is only as large as the largest node index you created an edge for. This means
482     * that if you had an input of 32 nodes, but that largest node with an edge
483     * was 16, then the returned array will be the sorted order of the first 16
484     * nodes and the last 16 nodes of your array are basically fine as they are
485     * as they had no dependencies and do not need any particular sort order.
486     *
487     * NB: If the structure that contains the array is freed, then the sorted
488     * array will be freed too so you should use the value of limit to
489     * make a long term copy of this array if you do not want to keep the topo
490     * structure around as well.
491     */
492    pANTLR3_UINT32  (*sortToArray)      (struct ANTLR3_TOPO_struct * topo);
493
494    /**
495     * A method that sorts the supplied ANTLR3_VECTOR in place based
496     * on the previously supplied edge data.
497     */
498    void            (*sortVector)       (struct ANTLR3_TOPO_struct * topo, pANTLR3_VECTOR v);
499
500    /**
501     *  A method to free this structure and any associated memory.
502     */
503    void            (*free)             (struct ANTLR3_TOPO_struct * topo);
504}
505    ANTLR3_TOPO;
506
507#ifdef __cplusplus
508}
509#endif
510
511#endif
512
513
514