/* Vector API for GNU compiler.
   Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010
   Free Software Foundation, Inc.
   Contributed by Nathan Sidwell <nathan@codesourcery.com>

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef GCC_VEC_H
#define GCC_VEC_H

/* The macros here implement a set of templated vector types and
   associated interfaces.  These templates are implemented with
   macros, as we're not in C++ land.  The interface functions are
   typesafe and use static inline functions, sometimes backed by
   out-of-line generic functions.  The vectors are designed to
   interoperate with the GTY machinery.

   Because of the different behavior of structure objects, scalar
   objects and of pointers, there are three flavors, one for each of
   these variants.  Both the structure object and pointer variants
   pass pointers to objects around -- in the former case the pointers
   are stored into the vector and in the latter case the pointers are
   dereferenced and the objects copied into the vector.  The scalar
   object variant is suitable for int-like objects, and the vector
   elements are returned by value.

   There are both 'index' and 'iterate' accessors.  The iterator
   returns a boolean iteration condition and updates the iteration
   variable passed by reference.  Because the iterator will be
   inlined, the address-of can be optimized away.

   The vectors are implemented using the trailing array idiom, thus
   they are not resizeable without changing the address of the vector
   object itself.  This means you cannot have variables or fields of
   vector type -- always use a pointer to a vector.  The one exception
   is the final field of a structure, which could be a vector type.
   You will have to use the embedded_size & embedded_init calls to
   create such objects, and they will probably not be resizeable (so
   don't use the 'safe' allocation variants).  The trailing array
   idiom is used (rather than a pointer to an array of data), because,
   if we allow NULL to also represent an empty vector, empty vectors
   occupy minimal space in the structure containing them.

   Each operation that increases the number of active elements is
   available in 'quick' and 'safe' variants.  The former presumes that
   there is sufficient allocated space for the operation to succeed
   (it dies if there is not).  The latter will reallocate the
   vector, if needed.  Reallocation causes an exponential increase in
   vector size.  If you know you will be adding N elements, it would
   be more efficient to use the reserve operation before adding the
   elements with the 'quick' operation.  This will ensure there are at
   least as many elements as you ask for, it will exponentially
   increase if there are too few spare slots.  If you want reserve a
   specific number of slots, but do not want the exponential increase
   (for instance, you know this is the last allocation), use the
   reserve_exact operation.  You can also create a vector of a
   specific size from the get go.

   You should prefer the push and pop operations, as they append and
   remove from the end of the vector. If you need to remove several
   items in one go, use the truncate operation.  The insert and remove
   operations allow you to change elements in the middle of the
   vector.  There are two remove operations, one which preserves the
   element ordering 'ordered_remove', and one which does not
   'unordered_remove'.  The latter function copies the end element
   into the removed slot, rather than invoke a memmove operation.  The
   'lower_bound' function will determine where to place an item in the
   array using insert that will maintain sorted order.

   When a vector type is defined, first a non-memory managed version
   is created.  You can then define either or both garbage collected
   and heap allocated versions.  The allocation mechanism is specified
   when the type is defined, and is therefore part of the type.  If
   you need both gc'd and heap allocated versions, you still must have
   *exactly* one definition of the common non-memory managed base vector.

   If you need to directly manipulate a vector, then the 'address'
   accessor will return the address of the start of the vector.  Also
   the 'space' predicate will tell you whether there is spare capacity
   in the vector.  You will not normally need to use these two functions.

   Vector types are defined using a DEF_VEC_{O,P,I}(TYPEDEF) macro, to
   get the non-memory allocation version, and then a
   DEF_VEC_ALLOC_{O,P,I}(TYPEDEF,ALLOC) macro to get memory managed
   vectors.  Variables of vector type are declared using a
   VEC(TYPEDEF,ALLOC) macro.  The ALLOC argument specifies the
   allocation strategy, and can be either 'gc' or 'heap' for garbage
   collected and heap allocated respectively.  It can be 'none' to get
   a vector that must be explicitly allocated (for instance as a
   trailing array of another structure).  The characters O, P and I
   indicate whether TYPEDEF is a pointer (P), object (O) or integral
   (I) type.  Be careful to pick the correct one, as you'll get an
   awkward and inefficient API if you use the wrong one.  There is a
   check, which results in a compile-time warning, for the P and I
   versions, but there is no check for the O versions, as that is not
   possible in plain C.  Due to the way GTY works, you must annotate
   any structures you wish to insert or reference from a vector with a
   GTY(()) tag.  You need to do this even if you never declare the GC
   allocated variants.

   An example of their use would be,

   DEF_VEC_P(tree);   // non-managed tree vector.
   DEF_VEC_ALLOC_P(tree,gc);	// gc'd vector of tree pointers.  This must
   			        // appear at file scope.

   struct my_struct {
     VEC(tree,gc) *v;      // A (pointer to) a vector of tree pointers.
   };

   struct my_struct *s;

   if (VEC_length(tree,s->v)) { we have some contents }
   VEC_safe_push(tree,gc,s->v,decl); // append some decl onto the end
   for (ix = 0; VEC_iterate(tree,s->v,ix,elt); ix++)
     { do something with elt }

*/

/* Macros to invoke API calls.  A single macro works for both pointer
   and object vectors, but the argument and return types might well be
   different.  In each macro, T is the typedef of the vector elements,
   and A is the allocation strategy.  The allocation strategy is only
   present when it is required.  Some of these macros pass the vector,
   V, by reference (by taking its address), this is noted in the
   descriptions.  */

/* Length of vector
   unsigned VEC_T_length(const VEC(T) *v);

   Return the number of active elements in V.  V can be NULL, in which
   case zero is returned.  */

#define VEC_length(T,V)	(VEC_OP(T,base,length)(VEC_BASE(V)))


/* Check if vector is empty
   int VEC_T_empty(const VEC(T) *v);

   Return nonzero if V is an empty vector (or V is NULL), zero otherwise.  */

#define VEC_empty(T,V)	(VEC_length (T,V) == 0)


/* Get the final element of the vector.
   T VEC_T_last(VEC(T) *v); // Integer
   T VEC_T_last(VEC(T) *v); // Pointer
   T *VEC_T_last(VEC(T) *v); // Object

   Return the final element.  V must not be empty.  */

#define VEC_last(T,V)	(VEC_OP(T,base,last)(VEC_BASE(V) VEC_CHECK_INFO))

/* Index into vector
   T VEC_T_index(VEC(T) *v, unsigned ix); // Integer
   T VEC_T_index(VEC(T) *v, unsigned ix); // Pointer
   T *VEC_T_index(VEC(T) *v, unsigned ix); // Object

   Return the IX'th element.  If IX must be in the domain of V.  */

#define VEC_index(T,V,I) (VEC_OP(T,base,index)(VEC_BASE(V),I VEC_CHECK_INFO))

/* Iterate over vector
   int VEC_T_iterate(VEC(T) *v, unsigned ix, T &ptr); // Integer
   int VEC_T_iterate(VEC(T) *v, unsigned ix, T &ptr); // Pointer
   int VEC_T_iterate(VEC(T) *v, unsigned ix, T *&ptr); // Object

   Return iteration condition and update PTR to point to the IX'th
   element.  At the end of iteration, sets PTR to NULL.  Use this to
   iterate over the elements of a vector as follows,

     for (ix = 0; VEC_iterate(T,v,ix,ptr); ix++)
       continue;  */

#define VEC_iterate(T,V,I,P)	(VEC_OP(T,base,iterate)(VEC_BASE(V),I,&(P)))

/* Allocate new vector.
   VEC(T,A) *VEC_T_A_alloc(int reserve);

   Allocate a new vector with space for RESERVE objects.  If RESERVE
   is zero, NO vector is created.  */

#define VEC_alloc(T,A,N)	(VEC_OP(T,A,alloc)(N MEM_STAT_INFO))

/* Free a vector.
   void VEC_T_A_free(VEC(T,A) *&);

   Free a vector and set it to NULL.  */

#define VEC_free(T,A,V)	(VEC_OP(T,A,free)(&V))

/* Use these to determine the required size and initialization of a
   vector embedded within another structure (as the final member).

   size_t VEC_T_embedded_size(int reserve);
   void VEC_T_embedded_init(VEC(T) *v, int reserve);

   These allow the caller to perform the memory allocation.  */

#define VEC_embedded_size(T,N)	 (VEC_OP(T,base,embedded_size)(N))
#define VEC_embedded_init(T,O,N) (VEC_OP(T,base,embedded_init)(VEC_BASE(O),N))

/* Copy a vector.
   VEC(T,A) *VEC_T_A_copy(VEC(T) *);

   Copy the live elements of a vector into a new vector.  The new and
   old vectors need not be allocated by the same mechanism.  */

#define VEC_copy(T,A,V) (VEC_OP(T,A,copy)(VEC_BASE(V) MEM_STAT_INFO))

/* Determine if a vector has additional capacity.

   int VEC_T_space (VEC(T) *v,int reserve)

   If V has space for RESERVE additional entries, return nonzero.  You
   usually only need to use this if you are doing your own vector
   reallocation, for instance on an embedded vector.  This returns
   nonzero in exactly the same circumstances that VEC_T_reserve
   will.  */

#define VEC_space(T,V,R) \
	(VEC_OP(T,base,space)(VEC_BASE(V),R VEC_CHECK_INFO))

/* Reserve space.
   int VEC_T_A_reserve(VEC(T,A) *&v, int reserve);

   Ensure that V has at least RESERVE slots available.  This will
   create additional headroom.  Note this can cause V to be
   reallocated.  Returns nonzero iff reallocation actually
   occurred.  */

#define VEC_reserve(T,A,V,R)	\
	(VEC_OP(T,A,reserve)(&(V),R VEC_CHECK_INFO MEM_STAT_INFO))

/* Reserve space exactly.
   int VEC_T_A_reserve_exact(VEC(T,A) *&v, int reserve);

   Ensure that V has at least RESERVE slots available.  This will not
   create additional headroom.  Note this can cause V to be
   reallocated.  Returns nonzero iff reallocation actually
   occurred.  */

#define VEC_reserve_exact(T,A,V,R)	\
	(VEC_OP(T,A,reserve_exact)(&(V),R VEC_CHECK_INFO MEM_STAT_INFO))

/* Push object with no reallocation
   T *VEC_T_quick_push (VEC(T) *v, T obj); // Integer
   T *VEC_T_quick_push (VEC(T) *v, T obj); // Pointer
   T *VEC_T_quick_push (VEC(T) *v, T *obj); // Object

   Push a new element onto the end, returns a pointer to the slot
   filled in. For object vectors, the new value can be NULL, in which
   case NO initialization is performed.  There must
   be sufficient space in the vector.  */

#define VEC_quick_push(T,V,O)	\
	(VEC_OP(T,base,quick_push)(VEC_BASE(V),O VEC_CHECK_INFO))

/* Push object with reallocation
   T *VEC_T_A_safe_push (VEC(T,A) *&v, T obj); // Integer
   T *VEC_T_A_safe_push (VEC(T,A) *&v, T obj); // Pointer
   T *VEC_T_A_safe_push (VEC(T,A) *&v, T *obj); // Object

   Push a new element onto the end, returns a pointer to the slot
   filled in. For object vectors, the new value can be NULL, in which
   case NO initialization is performed.  Reallocates V, if needed.  */

#define VEC_safe_push(T,A,V,O)		\
	(VEC_OP(T,A,safe_push)(&(V),O VEC_CHECK_INFO MEM_STAT_INFO))

/* Pop element off end
   T VEC_T_pop (VEC(T) *v);		// Integer
   T VEC_T_pop (VEC(T) *v);		// Pointer
   void VEC_T_pop (VEC(T) *v);		// Object

   Pop the last element off the end. Returns the element popped, for
   pointer vectors.  */

#define VEC_pop(T,V)	(VEC_OP(T,base,pop)(VEC_BASE(V) VEC_CHECK_INFO))

/* Truncate to specific length
   void VEC_T_truncate (VEC(T) *v, unsigned len);

   Set the length as specified.  The new length must be less than or
   equal to the current length.  This is an O(1) operation.  */

#define VEC_truncate(T,V,I)		\
	(VEC_OP(T,base,truncate)(VEC_BASE(V),I VEC_CHECK_INFO))

/* Grow to a specific length.
   void VEC_T_A_safe_grow (VEC(T,A) *&v, int len);

   Grow the vector to a specific length.  The LEN must be as
   long or longer than the current length.  The new elements are
   uninitialized.  */

#define VEC_safe_grow(T,A,V,I)		\
	(VEC_OP(T,A,safe_grow)(&(V),I VEC_CHECK_INFO MEM_STAT_INFO))

/* Grow to a specific length.
   void VEC_T_A_safe_grow_cleared (VEC(T,A) *&v, int len);

   Grow the vector to a specific length.  The LEN must be as
   long or longer than the current length.  The new elements are
   initialized to zero.  */

#define VEC_safe_grow_cleared(T,A,V,I)		\
	(VEC_OP(T,A,safe_grow_cleared)(&(V),I VEC_CHECK_INFO MEM_STAT_INFO))

/* Replace element
   T VEC_T_replace (VEC(T) *v, unsigned ix, T val); // Integer
   T VEC_T_replace (VEC(T) *v, unsigned ix, T val); // Pointer
   T *VEC_T_replace (VEC(T) *v, unsigned ix, T *val);  // Object

   Replace the IXth element of V with a new value, VAL.  For pointer
   vectors returns the original value. For object vectors returns a
   pointer to the new value.  For object vectors the new value can be
   NULL, in which case no overwriting of the slot is actually
   performed.  */

#define VEC_replace(T,V,I,O)		\
	(VEC_OP(T,base,replace)(VEC_BASE(V),I,O VEC_CHECK_INFO))

/* Insert object with no reallocation
   T *VEC_T_quick_insert (VEC(T) *v, unsigned ix, T val); // Integer
   T *VEC_T_quick_insert (VEC(T) *v, unsigned ix, T val); // Pointer
   T *VEC_T_quick_insert (VEC(T) *v, unsigned ix, T *val); // Object

   Insert an element, VAL, at the IXth position of V. Return a pointer
   to the slot created.  For vectors of object, the new value can be
   NULL, in which case no initialization of the inserted slot takes
   place. There must be sufficient space.  */

#define VEC_quick_insert(T,V,I,O)	\
	(VEC_OP(T,base,quick_insert)(VEC_BASE(V),I,O VEC_CHECK_INFO))

/* Insert object with reallocation
   T *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Integer
   T *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Pointer
   T *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T *val); // Object

   Insert an element, VAL, at the IXth position of V. Return a pointer
   to the slot created.  For vectors of object, the new value can be
   NULL, in which case no initialization of the inserted slot takes
   place. Reallocate V, if necessary.  */

#define VEC_safe_insert(T,A,V,I,O)	\
	(VEC_OP(T,A,safe_insert)(&(V),I,O VEC_CHECK_INFO MEM_STAT_INFO))

/* Remove element retaining order
   T VEC_T_ordered_remove (VEC(T) *v, unsigned ix); // Integer
   T VEC_T_ordered_remove (VEC(T) *v, unsigned ix); // Pointer
   void VEC_T_ordered_remove (VEC(T) *v, unsigned ix); // Object

   Remove an element from the IXth position of V. Ordering of
   remaining elements is preserved.  For pointer vectors returns the
   removed object.  This is an O(N) operation due to a memmove.  */

#define VEC_ordered_remove(T,V,I)	\
	(VEC_OP(T,base,ordered_remove)(VEC_BASE(V),I VEC_CHECK_INFO))

/* Remove element destroying order
   T VEC_T_unordered_remove (VEC(T) *v, unsigned ix); // Integer
   T VEC_T_unordered_remove (VEC(T) *v, unsigned ix); // Pointer
   void VEC_T_unordered_remove (VEC(T) *v, unsigned ix); // Object

   Remove an element from the IXth position of V. Ordering of
   remaining elements is destroyed.  For pointer vectors returns the
   removed object.  This is an O(1) operation.  */

#define VEC_unordered_remove(T,V,I)	\
	(VEC_OP(T,base,unordered_remove)(VEC_BASE(V),I VEC_CHECK_INFO))

/* Remove a block of elements
   void VEC_T_block_remove (VEC(T) *v, unsigned ix, unsigned len);

   Remove LEN elements starting at the IXth.  Ordering is retained.
   This is an O(1) operation.  */

#define VEC_block_remove(T,V,I,L)	\
	(VEC_OP(T,base,block_remove)(VEC_BASE(V),I,L VEC_CHECK_INFO))

/* Get the address of the array of elements
   T *VEC_T_address (VEC(T) v)

   If you need to directly manipulate the array (for instance, you
   want to feed it to qsort), use this accessor.  */

#define VEC_address(T,V)		(VEC_OP(T,base,address)(VEC_BASE(V)))

/* Find the first index in the vector not less than the object.
   unsigned VEC_T_lower_bound (VEC(T) *v, const T val,
                               bool (*lessthan) (const T, const T)); // Integer
   unsigned VEC_T_lower_bound (VEC(T) *v, const T val,
                               bool (*lessthan) (const T, const T)); // Pointer
   unsigned VEC_T_lower_bound (VEC(T) *v, const T *val,
                               bool (*lessthan) (const T*, const T*)); // Object

   Find the first position in which VAL could be inserted without
   changing the ordering of V.  LESSTHAN is a function that returns
   true if the first argument is strictly less than the second.  */

#define VEC_lower_bound(T,V,O,LT)    \
       (VEC_OP(T,base,lower_bound)(VEC_BASE(V),O,LT VEC_CHECK_INFO))

/* Reallocate an array of elements with prefix.  */
extern void *vec_gc_p_reserve (void *, int MEM_STAT_DECL);
extern void *vec_gc_p_reserve_exact (void *, int MEM_STAT_DECL);
extern void *vec_gc_o_reserve (void *, int, size_t, size_t MEM_STAT_DECL);
extern void *vec_gc_o_reserve_exact (void *, int, size_t, size_t
				     MEM_STAT_DECL);
extern void ggc_free (void *);
#define vec_gc_free(V) ggc_free (V)
extern void *vec_heap_p_reserve (void *, int MEM_STAT_DECL);
extern void *vec_heap_p_reserve_exact (void *, int MEM_STAT_DECL);
extern void *vec_heap_o_reserve (void *, int, size_t, size_t MEM_STAT_DECL);
extern void *vec_heap_o_reserve_exact (void *, int, size_t, size_t
				       MEM_STAT_DECL);
extern void dump_vec_loc_statistics (void);
#ifdef GATHER_STATISTICS
void vec_heap_free (void *);
#else
#define vec_heap_free(V) free (V)
#endif

#if ENABLE_CHECKING
#define VEC_CHECK_INFO ,__FILE__,__LINE__,__FUNCTION__
#define VEC_CHECK_DECL ,const char *file_,unsigned line_,const char *function_
#define VEC_CHECK_PASS ,file_,line_,function_

#define VEC_ASSERT(EXPR,OP,T,A) \
  (void)((EXPR) ? 0 : (VEC_ASSERT_FAIL(OP,VEC(T,A)), 0))

extern void vec_assert_fail (const char *, const char * VEC_CHECK_DECL)
     ATTRIBUTE_NORETURN;
#define VEC_ASSERT_FAIL(OP,VEC) vec_assert_fail (OP,#VEC VEC_CHECK_PASS)
#else
#define VEC_CHECK_INFO
#define VEC_CHECK_DECL
#define VEC_CHECK_PASS
#define VEC_ASSERT(EXPR,OP,T,A) (void)(EXPR)
#endif

/* Note: gengtype has hardwired knowledge of the expansions of the
   VEC, DEF_VEC_*, and DEF_VEC_ALLOC_* macros.  If you change the
   expansions of these macros you may need to change gengtype too.  */

#define VEC(T,A) VEC_##T##_##A
#define VEC_OP(T,A,OP) VEC_##T##_##A##_##OP

/* Base of vector type, not user visible.  */
#define VEC_T(T,B)							  \
typedef struct VEC(T,B) 				 		  \
{									  \
  unsigned num;								  \
  unsigned alloc;							  \
  T vec[1];								  \
} VEC(T,B)

#define VEC_T_GTY(T,B)							  \
typedef struct GTY(()) VEC(T,B)				 		  \
{									  \
  unsigned num;								  \
  unsigned alloc;							  \
  T GTY ((length ("%h.num"))) vec[1];					  \
} VEC(T,B)

/* Derived vector type, user visible.  */
#define VEC_TA_GTY(T,B,A,GTY)						  \
typedef struct GTY VEC(T,A)						  \
{									  \
  VEC(T,B) base;							  \
} VEC(T,A)

#define VEC_TA(T,B,A)							  \
typedef struct VEC(T,A)							  \
{									  \
  VEC(T,B) base;							  \
} VEC(T,A)

/* Convert to base type.  */
#define VEC_BASE(P)  ((P) ? &(P)->base : 0)

/* Vector of integer-like object.  */
#define DEF_VEC_I(T)							  \
static inline void VEC_OP (T,must_be,integral_type) (void) 		  \
{									  \
  (void)~(T)0;								  \
}									  \
									  \
VEC_T(T,base);								  \
VEC_TA(T,base,none);							  \
DEF_VEC_FUNC_P(T)							  \
struct vec_swallow_trailing_semi
#define DEF_VEC_ALLOC_I(T,A)						  \
VEC_TA(T,base,A);							  \
DEF_VEC_ALLOC_FUNC_I(T,A)						  \
DEF_VEC_NONALLOC_FUNCS_I(T,A)						  \
struct vec_swallow_trailing_semi

/* Vector of pointer to object.  */
#define DEF_VEC_P(T) 							  \
static inline void VEC_OP (T,must_be,pointer_type) (void) 		  \
{									  \
  (void)((T)1 == (void *)1);						  \
}									  \
									  \
VEC_T_GTY(T,base);							  \
VEC_TA(T,base,none);							  \
DEF_VEC_FUNC_P(T)							  \
struct vec_swallow_trailing_semi
#define DEF_VEC_ALLOC_P(T,A)						  \
VEC_TA(T,base,A);							  \
DEF_VEC_ALLOC_FUNC_P(T,A)						  \
DEF_VEC_NONALLOC_FUNCS_P(T,A)						  \
struct vec_swallow_trailing_semi

#define DEF_VEC_FUNC_P(T)						  \
static inline unsigned VEC_OP (T,base,length) (const VEC(T,base) *vec_)   \
{									  \
  return vec_ ? vec_->num : 0;						  \
}									  \
									  \
static inline T VEC_OP (T,base,last)					  \
     (const VEC(T,base) *vec_ VEC_CHECK_DECL)				  \
{									  \
  VEC_ASSERT (vec_ && vec_->num, "last", T, base);			  \
  									  \
  return vec_->vec[vec_->num - 1];					  \
}									  \
									  \
static inline T VEC_OP (T,base,index)					  \
     (const VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL)		  \
{									  \
  VEC_ASSERT (vec_ && ix_ < vec_->num, "index", T, base);		  \
  									  \
  return vec_->vec[ix_];						  \
}									  \
									  \
static inline int VEC_OP (T,base,iterate)			  	  \
     (const VEC(T,base) *vec_, unsigned ix_, T *ptr)			  \
{									  \
  if (vec_ && ix_ < vec_->num)						  \
    {									  \
      *ptr = vec_->vec[ix_];						  \
      return 1;								  \
    }									  \
  else									  \
    {									  \
      *ptr = (T) 0;							  \
      return 0;								  \
    }									  \
}									  \
									  \
static inline size_t VEC_OP (T,base,embedded_size)			  \
     (int alloc_)							  \
{									  \
  return offsetof (VEC(T,base),vec) + alloc_ * sizeof(T);		  \
}									  \
									  \
static inline void VEC_OP (T,base,embedded_init)			  \
     (VEC(T,base) *vec_, int alloc_)					  \
{									  \
  vec_->num = 0;							  \
  vec_->alloc = alloc_;							  \
}									  \
									  \
static inline int VEC_OP (T,base,space)	       				  \
     (VEC(T,base) *vec_, int alloc_ VEC_CHECK_DECL)			  \
{									  \
  VEC_ASSERT (alloc_ >= 0, "space", T, base);				  \
  return vec_ ? vec_->alloc - vec_->num >= (unsigned)alloc_ : !alloc_;	  \
}									  \
									  \
static inline T *VEC_OP (T,base,quick_push)				  \
     (VEC(T,base) *vec_, T obj_ VEC_CHECK_DECL)				  \
{									  \
  T *slot_;								  \
  									  \
  VEC_ASSERT (vec_->num < vec_->alloc, "push", T, base);		  \
  slot_ = &vec_->vec[vec_->num++];					  \
  *slot_ = obj_;							  \
  									  \
  return slot_;								  \
}									  \
									  \
static inline T VEC_OP (T,base,pop) (VEC(T,base) *vec_ VEC_CHECK_DECL)	  \
{									  \
  T obj_;								  \
									  \
  VEC_ASSERT (vec_->num, "pop", T, base);				  \
  obj_ = vec_->vec[--vec_->num];					  \
									  \
  return obj_;								  \
}									  \
									  \
static inline void VEC_OP (T,base,truncate)				  \
     (VEC(T,base) *vec_, unsigned size_ VEC_CHECK_DECL)			  \
{									  \
  VEC_ASSERT (vec_ ? vec_->num >= size_ : !size_, "truncate", T, base);	  \
  if (vec_)								  \
    vec_->num = size_;							  \
}									  \
									  \
static inline T VEC_OP (T,base,replace)		  	     		  \
     (VEC(T,base) *vec_, unsigned ix_, T obj_ VEC_CHECK_DECL)		  \
{									  \
  T old_obj_;								  \
									  \
  VEC_ASSERT (ix_ < vec_->num, "replace", T, base);			  \
  old_obj_ = vec_->vec[ix_];						  \
  vec_->vec[ix_] = obj_;						  \
									  \
  return old_obj_;							  \
}									  \
									  \
static inline T *VEC_OP (T,base,quick_insert)				  \
     (VEC(T,base) *vec_, unsigned ix_, T obj_ VEC_CHECK_DECL)		  \
{									  \
  T *slot_;								  \
									  \
  VEC_ASSERT (vec_->num < vec_->alloc, "insert", T, base);		  \
  VEC_ASSERT (ix_ <= vec_->num, "insert", T, base);			  \
  slot_ = &vec_->vec[ix_];						  \
  memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (T));		  \
  *slot_ = obj_;							  \
  									  \
  return slot_;								  \
}									  \
									  \
static inline T VEC_OP (T,base,ordered_remove)				  \
     (VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL)			  \
{									  \
  T *slot_;								  \
  T obj_;								  \
									  \
  VEC_ASSERT (ix_ < vec_->num, "remove", T, base);			  \
  slot_ = &vec_->vec[ix_];						  \
  obj_ = *slot_;							  \
  memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (T));     	  \
									  \
  return obj_;								  \
}									  \
									  \
static inline T VEC_OP (T,base,unordered_remove)			  \
     (VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL)			  \
{									  \
  T *slot_;								  \
  T obj_;								  \
									  \
  VEC_ASSERT (ix_ < vec_->num, "remove", T, base);			  \
  slot_ = &vec_->vec[ix_];						  \
  obj_ = *slot_;							  \
  *slot_ = vec_->vec[--vec_->num];					  \
									  \
  return obj_;								  \
}									  \
									  \
static inline void VEC_OP (T,base,block_remove)				  \
     (VEC(T,base) *vec_, unsigned ix_, unsigned len_ VEC_CHECK_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  VEC_ASSERT (ix_ + len_ <= vec_->num, "block_remove", T, base);	  \
  slot_ = &vec_->vec[ix_];						  \
  vec_->num -= len_;							  \
  memmove (slot_, slot_ + len_, (vec_->num - ix_) * sizeof (T));	  \
}									  \
									  \
static inline T *VEC_OP (T,base,address)				  \
     (VEC(T,base) *vec_)						  \
{									  \
  return vec_ ? vec_->vec : 0;						  \
}									  \
									  \
static inline unsigned VEC_OP (T,base,lower_bound)			  \
     (VEC(T,base) *vec_, const T obj_,					  \
      bool (*lessthan_)(const T, const T) VEC_CHECK_DECL)		  \
{									  \
   unsigned int len_ = VEC_OP (T,base, length) (vec_);			  \
   unsigned int half_, middle_;						  \
   unsigned int first_ = 0;						  \
   while (len_ > 0)							  \
     {									  \
        T middle_elem_;							  \
        half_ = len_ >> 1;						  \
        middle_ = first_;						  \
        middle_ += half_;						  \
        middle_elem_ = VEC_OP (T,base,index) (vec_, middle_ VEC_CHECK_PASS); \
        if (lessthan_ (middle_elem_, obj_))				  \
          {								  \
             first_ = middle_;						  \
             ++first_;							  \
             len_ = len_ - half_ - 1;					  \
          }								  \
        else								  \
          len_ = half_;							  \
     }									  \
   return first_;							  \
}

#define DEF_VEC_ALLOC_FUNC_P(T,A)					  \
static inline VEC(T,A) *VEC_OP (T,A,alloc)				  \
     (int alloc_ MEM_STAT_DECL)						  \
{									  \
  return (VEC(T,A) *) vec_##A##_p_reserve_exact (NULL, alloc_		  \
						 PASS_MEM_STAT);	  \
}


#define DEF_VEC_NONALLOC_FUNCS_P(T,A)					  \
static inline void VEC_OP (T,A,free)					  \
     (VEC(T,A) **vec_)							  \
{									  \
  if (*vec_)								  \
    vec_##A##_free (*vec_);						  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline VEC(T,A) *VEC_OP (T,A,copy) (VEC(T,base) *vec_ MEM_STAT_DECL) \
{									  \
  size_t len_ = vec_ ? vec_->num : 0;					  \
  VEC (T,A) *new_vec_ = NULL;						  \
									  \
  if (len_)								  \
    {									  \
      new_vec_ = (VEC (T,A) *)(vec_##A##_p_reserve_exact		  \
			       (NULL, len_ PASS_MEM_STAT));		  \
									  \
      new_vec_->base.num = len_;					  \
      memcpy (new_vec_->base.vec, vec_->vec, sizeof (T) * len_);	  \
    }									  \
  return new_vec_;							  \
}									  \
									  \
static inline int VEC_OP (T,A,reserve)	       				  \
     (VEC(T,A) **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int extend = !VEC_OP (T,base,space) (VEC_BASE(*vec_), alloc_		  \
				       VEC_CHECK_PASS);			  \
		  							  \
  if (extend)	  							  \
    *vec_ = (VEC(T,A) *) vec_##A##_p_reserve (*vec_, alloc_ PASS_MEM_STAT); \
		  							  \
  return extend;							  \
}									  \
									  \
static inline int VEC_OP (T,A,reserve_exact)  				  \
     (VEC(T,A) **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int extend = !VEC_OP (T,base,space) (VEC_BASE(*vec_), alloc_		  \
				       VEC_CHECK_PASS);			  \
		  							  \
  if (extend)	  							  \
    *vec_ = (VEC(T,A) *) vec_##A##_p_reserve_exact (*vec_, alloc_	  \
						    PASS_MEM_STAT);	  \
		  							  \
  return extend;							  \
}									  \
									  \
static inline void VEC_OP (T,A,safe_grow)				  \
     (VEC(T,A) **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  VEC_ASSERT (size_ >= 0						  \
	      && VEC_OP(T,base,length) VEC_BASE(*vec_) <= (unsigned)size_, \
						 "grow", T, A);		  \
  VEC_OP (T,A,reserve_exact) (vec_,					  \
			      size_ - (int)(*vec_ ? VEC_BASE(*vec_)->num : 0) \
			      VEC_CHECK_PASS PASS_MEM_STAT);		  \
  VEC_BASE (*vec_)->num = size_;					  \
}									  \
									  \
static inline void VEC_OP (T,A,safe_grow_cleared)			  \
     (VEC(T,A) **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int oldsize = VEC_OP(T,base,length) VEC_BASE(*vec_);			  \
  VEC_OP (T,A,safe_grow) (vec_, size_ VEC_CHECK_PASS PASS_MEM_STAT);	  \
  memset (&(VEC_OP (T,base,address) VEC_BASE(*vec_))[oldsize], 0,	  \
	  sizeof (T) * (size_ - oldsize));				  \
}									  \
									  \
static inline T *VEC_OP (T,A,safe_push)					  \
     (VEC(T,A) **vec_, T obj_ VEC_CHECK_DECL MEM_STAT_DECL)       	  \
{									  \
  VEC_OP (T,A,reserve) (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);		  \
									  \
  return VEC_OP (T,base,quick_push) (VEC_BASE(*vec_), obj_ VEC_CHECK_PASS); \
}									  \
									  \
static inline T *VEC_OP (T,A,safe_insert)		     	  	  \
     (VEC(T,A) **vec_, unsigned ix_, T obj_ VEC_CHECK_DECL MEM_STAT_DECL)  \
{									  \
  VEC_OP (T,A,reserve) (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);		  \
									  \
  return VEC_OP (T,base,quick_insert) (VEC_BASE(*vec_), ix_, obj_	  \
 				       VEC_CHECK_PASS);			  \
}

/* Vector of object.  */
#define DEF_VEC_O(T)							  \
VEC_T_GTY(T,base);							  \
VEC_TA(T,base,none);						  \
DEF_VEC_FUNC_O(T)							  \
struct vec_swallow_trailing_semi
#define DEF_VEC_ALLOC_O(T,A)						  \
VEC_TA(T,base,A);							  \
DEF_VEC_ALLOC_FUNC_O(T,A)						  \
DEF_VEC_NONALLOC_FUNCS_O(T,A)						  \
struct vec_swallow_trailing_semi

#define DEF_VEC_FUNC_O(T)						  \
static inline unsigned VEC_OP (T,base,length) (const VEC(T,base) *vec_)	  \
{									  \
  return vec_ ? vec_->num : 0;						  \
}									  \
									  \
static inline T *VEC_OP (T,base,last) (VEC(T,base) *vec_ VEC_CHECK_DECL)  \
{									  \
  VEC_ASSERT (vec_ && vec_->num, "last", T, base);			  \
  									  \
  return &vec_->vec[vec_->num - 1];					  \
}									  \
									  \
static inline T *VEC_OP (T,base,index)					  \
     (VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL)			  \
{									  \
  VEC_ASSERT (vec_ && ix_ < vec_->num, "index", T, base);		  \
  									  \
  return &vec_->vec[ix_];						  \
}									  \
									  \
static inline int VEC_OP (T,base,iterate)			     	  \
     (VEC(T,base) *vec_, unsigned ix_, T **ptr)				  \
{									  \
  if (vec_ && ix_ < vec_->num)						  \
    {									  \
      *ptr = &vec_->vec[ix_];						  \
      return 1;								  \
    }									  \
  else									  \
    {									  \
      *ptr = 0;								  \
      return 0;								  \
    }									  \
}									  \
									  \
static inline size_t VEC_OP (T,base,embedded_size)			  \
     (int alloc_)							  \
{									  \
  return offsetof (VEC(T,base),vec) + alloc_ * sizeof(T);		  \
}									  \
									  \
static inline void VEC_OP (T,base,embedded_init)			  \
     (VEC(T,base) *vec_, int alloc_)					  \
{									  \
  vec_->num = 0;							  \
  vec_->alloc = alloc_;							  \
}									  \
									  \
static inline int VEC_OP (T,base,space)	       				  \
     (VEC(T,base) *vec_, int alloc_ VEC_CHECK_DECL)			  \
{									  \
  VEC_ASSERT (alloc_ >= 0, "space", T, base);				  \
  return vec_ ? vec_->alloc - vec_->num >= (unsigned)alloc_ : !alloc_;	  \
}									  \
									  \
static inline T *VEC_OP (T,base,quick_push)				  \
     (VEC(T,base) *vec_, const T *obj_ VEC_CHECK_DECL)			  \
{									  \
  T *slot_;								  \
  									  \
  VEC_ASSERT (vec_->num < vec_->alloc, "push", T, base);		  \
  slot_ = &vec_->vec[vec_->num++];					  \
  if (obj_)								  \
    *slot_ = *obj_;							  \
  									  \
  return slot_;								  \
}									  \
									  \
static inline void VEC_OP (T,base,pop) (VEC(T,base) *vec_ VEC_CHECK_DECL) \
{									  \
  VEC_ASSERT (vec_->num, "pop", T, base);				  \
  --vec_->num;								  \
}									  \
									  \
static inline void VEC_OP (T,base,truncate)				  \
     (VEC(T,base) *vec_, unsigned size_ VEC_CHECK_DECL)			  \
{									  \
  VEC_ASSERT (vec_ ? vec_->num >= size_ : !size_, "truncate", T, base);	  \
  if (vec_)								  \
    vec_->num = size_;							  \
}									  \
									  \
static inline T *VEC_OP (T,base,replace)				  \
     (VEC(T,base) *vec_, unsigned ix_, const T *obj_ VEC_CHECK_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  VEC_ASSERT (ix_ < vec_->num, "replace", T, base);			  \
  slot_ = &vec_->vec[ix_];						  \
  if (obj_)								  \
    *slot_ = *obj_;							  \
									  \
  return slot_;								  \
}									  \
									  \
static inline T *VEC_OP (T,base,quick_insert)				  \
     (VEC(T,base) *vec_, unsigned ix_, const T *obj_ VEC_CHECK_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  VEC_ASSERT (vec_->num < vec_->alloc, "insert", T, base);		  \
  VEC_ASSERT (ix_ <= vec_->num, "insert", T, base);			  \
  slot_ = &vec_->vec[ix_];						  \
  memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (T));		  \
  if (obj_)								  \
    *slot_ = *obj_;							  \
  									  \
  return slot_;								  \
}									  \
									  \
static inline void VEC_OP (T,base,ordered_remove)			  \
     (VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL)			  \
{									  \
  T *slot_;								  \
									  \
  VEC_ASSERT (ix_ < vec_->num, "remove", T, base);			  \
  slot_ = &vec_->vec[ix_];						  \
  memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (T));		  \
}									  \
									  \
static inline void VEC_OP (T,base,unordered_remove)			  \
     (VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL)			  \
{									  \
  VEC_ASSERT (ix_ < vec_->num, "remove", T, base);			  \
  vec_->vec[ix_] = vec_->vec[--vec_->num];				  \
}									  \
									  \
static inline void VEC_OP (T,base,block_remove)				  \
     (VEC(T,base) *vec_, unsigned ix_, unsigned len_ VEC_CHECK_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  VEC_ASSERT (ix_ + len_ <= vec_->num, "block_remove", T, base);	  \
  slot_ = &vec_->vec[ix_];						  \
  vec_->num -= len_;							  \
  memmove (slot_, slot_ + len_, (vec_->num - ix_) * sizeof (T));	  \
}									  \
									  \
static inline T *VEC_OP (T,base,address)				  \
     (VEC(T,base) *vec_)						  \
{									  \
  return vec_ ? vec_->vec : 0;						  \
}									  \
									  \
static inline unsigned VEC_OP (T,base,lower_bound)			  \
     (VEC(T,base) *vec_, const T *obj_,					  \
      bool (*lessthan_)(const T *, const T *) VEC_CHECK_DECL)		  \
{									  \
   unsigned int len_ = VEC_OP (T, base, length) (vec_);			  \
   unsigned int half_, middle_;						  \
   unsigned int first_ = 0;						  \
   while (len_ > 0)							  \
     {									  \
        T *middle_elem_;						  \
        half_ = len_ >> 1;						  \
        middle_ = first_;						  \
        middle_ += half_;						  \
        middle_elem_ = VEC_OP (T,base,index) (vec_, middle_ VEC_CHECK_PASS); \
        if (lessthan_ (middle_elem_, obj_))				  \
          {								  \
             first_ = middle_;						  \
             ++first_;							  \
             len_ = len_ - half_ - 1;					  \
          }								  \
        else								  \
          len_ = half_;							  \
     }									  \
   return first_;							  \
}

#define DEF_VEC_ALLOC_FUNC_O(T,A)					  \
static inline VEC(T,A) *VEC_OP (T,A,alloc)      			  \
     (int alloc_ MEM_STAT_DECL)						  \
{									  \
  return (VEC(T,A) *) vec_##A##_o_reserve_exact (NULL, alloc_,		  \
						 offsetof (VEC(T,A),base.vec), \
						 sizeof (T)		  \
						 PASS_MEM_STAT);	  \
}

#define DEF_VEC_NONALLOC_FUNCS_O(T,A)					  \
static inline VEC(T,A) *VEC_OP (T,A,copy) (VEC(T,base) *vec_ MEM_STAT_DECL) \
{									  \
  size_t len_ = vec_ ? vec_->num : 0;					  \
  VEC (T,A) *new_vec_ = NULL;						  \
									  \
  if (len_)								  \
    {									  \
      new_vec_ = (VEC (T,A) *)(vec_##A##_o_reserve_exact		  \
			       (NULL, len_,				  \
				offsetof (VEC(T,A),base.vec), sizeof (T)  \
				PASS_MEM_STAT));			  \
									  \
      new_vec_->base.num = len_;					  \
      memcpy (new_vec_->base.vec, vec_->vec, sizeof (T) * len_);	  \
    }									  \
  return new_vec_;							  \
}									  \
									  \
static inline void VEC_OP (T,A,free)					  \
     (VEC(T,A) **vec_)							  \
{									  \
  if (*vec_)								  \
    vec_##A##_free (*vec_);						  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline int VEC_OP (T,A,reserve)	   	    			  \
     (VEC(T,A) **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int extend = !VEC_OP (T,base,space) (VEC_BASE(*vec_), alloc_		  \
				       VEC_CHECK_PASS);			  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T,A) *) vec_##A##_o_reserve (*vec_, alloc_,		  \
			   		      offsetof (VEC(T,A),base.vec),\
 					      sizeof (T)		  \
			   		      PASS_MEM_STAT);		  \
									  \
  return extend;							  \
}									  \
									  \
static inline int VEC_OP (T,A,reserve_exact)   	    			  \
     (VEC(T,A) **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int extend = !VEC_OP (T,base,space) (VEC_BASE(*vec_), alloc_		  \
				       VEC_CHECK_PASS);			  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T,A) *) vec_##A##_o_reserve_exact			  \
			 (*vec_, alloc_,				  \
			  offsetof (VEC(T,A),base.vec),			  \
			  sizeof (T) PASS_MEM_STAT);			  \
									  \
  return extend;							  \
}									  \
									  \
static inline void VEC_OP (T,A,safe_grow)				  \
     (VEC(T,A) **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  VEC_ASSERT (size_ >= 0						  \
	      && VEC_OP(T,base,length) VEC_BASE(*vec_) <= (unsigned)size_, \
						 "grow", T, A);		  \
  VEC_OP (T,A,reserve_exact) (vec_,					  \
			      size_ - (int)(*vec_ ? VEC_BASE(*vec_)->num : 0) \
			      VEC_CHECK_PASS PASS_MEM_STAT);		  \
  VEC_BASE (*vec_)->num = size_;					  \
}									  \
									  \
static inline void VEC_OP (T,A,safe_grow_cleared)			  \
     (VEC(T,A) **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int oldsize = VEC_OP(T,base,length) VEC_BASE(*vec_);			  \
  VEC_OP (T,A,safe_grow) (vec_, size_ VEC_CHECK_PASS PASS_MEM_STAT);	  \
  memset (&(VEC_OP (T,base,address) VEC_BASE(*vec_))[oldsize], 0,	  \
	  sizeof (T) * (size_ - oldsize));				  \
}									  \
									  \
static inline T *VEC_OP (T,A,safe_push)					  \
     (VEC(T,A) **vec_, const T *obj_ VEC_CHECK_DECL MEM_STAT_DECL)	  \
{									  \
  VEC_OP (T,A,reserve) (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);		  \
									  \
  return VEC_OP (T,base,quick_push) (VEC_BASE(*vec_), obj_ VEC_CHECK_PASS);  \
}									  \
									  \
static inline T *VEC_OP (T,A,safe_insert)		     	  	  \
     (VEC(T,A) **vec_, unsigned ix_, const T *obj_			  \
 		VEC_CHECK_DECL MEM_STAT_DECL)				  \
{									  \
  VEC_OP (T,A,reserve) (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);		  \
									  \
  return VEC_OP (T,base,quick_insert) (VEC_BASE(*vec_), ix_, obj_	  \
				       VEC_CHECK_PASS);			  \
}

#define DEF_VEC_ALLOC_FUNC_I(T,A)					  \
static inline VEC(T,A) *VEC_OP (T,A,alloc)      			  \
     (int alloc_ MEM_STAT_DECL)						  \
{									  \
  return (VEC(T,A) *) vec_##A##_o_reserve_exact				  \
		      (NULL, alloc_, offsetof (VEC(T,A),base.vec),	  \
		       sizeof (T) PASS_MEM_STAT);			  \
}

#define DEF_VEC_NONALLOC_FUNCS_I(T,A)					  \
static inline VEC(T,A) *VEC_OP (T,A,copy) (VEC(T,base) *vec_ MEM_STAT_DECL) \
{									  \
  size_t len_ = vec_ ? vec_->num : 0;					  \
  VEC (T,A) *new_vec_ = NULL;						  \
									  \
  if (len_)								  \
    {									  \
      new_vec_ = (VEC (T,A) *)(vec_##A##_o_reserve_exact		  \
			       (NULL, len_,				  \
				offsetof (VEC(T,A),base.vec), sizeof (T)  \
				PASS_MEM_STAT));			  \
									  \
      new_vec_->base.num = len_;					  \
      memcpy (new_vec_->base.vec, vec_->vec, sizeof (T) * len_);	  \
    }									  \
  return new_vec_;							  \
}									  \
									  \
static inline void VEC_OP (T,A,free)					  \
     (VEC(T,A) **vec_)							  \
{									  \
  if (*vec_)								  \
    vec_##A##_free (*vec_);						  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline int VEC_OP (T,A,reserve)	   	    			  \
     (VEC(T,A) **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int extend = !VEC_OP (T,base,space) (VEC_BASE(*vec_), alloc_		  \
				       VEC_CHECK_PASS);			  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T,A) *) vec_##A##_o_reserve (*vec_, alloc_,		  \
			   		      offsetof (VEC(T,A),base.vec),\
 					      sizeof (T)		  \
			   		      PASS_MEM_STAT);		  \
									  \
  return extend;							  \
}									  \
									  \
static inline int VEC_OP (T,A,reserve_exact)   	    			  \
     (VEC(T,A) **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int extend = !VEC_OP (T,base,space) (VEC_BASE(*vec_), alloc_		  \
				       VEC_CHECK_PASS);			  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T,A) *) vec_##A##_o_reserve_exact			  \
			 (*vec_, alloc_, offsetof (VEC(T,A),base.vec),	  \
			  sizeof (T) PASS_MEM_STAT);			  \
									  \
  return extend;							  \
}									  \
									  \
static inline void VEC_OP (T,A,safe_grow)				  \
     (VEC(T,A) **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  VEC_ASSERT (size_ >= 0						  \
	      && VEC_OP(T,base,length) VEC_BASE(*vec_) <= (unsigned)size_, \
						 "grow", T, A);		  \
  VEC_OP (T,A,reserve_exact) (vec_,					  \
			      size_ - (int)(*vec_ ? VEC_BASE(*vec_)->num : 0) \
			      VEC_CHECK_PASS PASS_MEM_STAT);		  \
  VEC_BASE (*vec_)->num = size_;					  \
}									  \
									  \
static inline void VEC_OP (T,A,safe_grow_cleared)			  \
     (VEC(T,A) **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)		  \
{									  \
  int oldsize = VEC_OP(T,base,length) VEC_BASE(*vec_);			  \
  VEC_OP (T,A,safe_grow) (vec_, size_ VEC_CHECK_PASS PASS_MEM_STAT);	  \
  memset (&(VEC_OP (T,base,address) VEC_BASE(*vec_))[oldsize], 0,	  \
	  sizeof (T) * (size_ - oldsize));				  \
}									  \
									  \
static inline T *VEC_OP (T,A,safe_push)					  \
     (VEC(T,A) **vec_, const T obj_ VEC_CHECK_DECL MEM_STAT_DECL)	  \
{									  \
  VEC_OP (T,A,reserve) (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);		  \
									  \
  return VEC_OP (T,base,quick_push) (VEC_BASE(*vec_), obj_ VEC_CHECK_PASS);  \
}									  \
									  \
static inline T *VEC_OP (T,A,safe_insert)		     	  	  \
     (VEC(T,A) **vec_, unsigned ix_, const T obj_			  \
 		VEC_CHECK_DECL MEM_STAT_DECL)				  \
{									  \
  VEC_OP (T,A,reserve) (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);		  \
									  \
  return VEC_OP (T,base,quick_insert) (VEC_BASE(*vec_), ix_, obj_	  \
				       VEC_CHECK_PASS);			  \
}

/* We support a vector which starts out with space on the stack and
   switches to heap space when forced to reallocate.  This works a
   little differently.  Instead of DEF_VEC_ALLOC_P(TYPE, heap|gc), use
   DEF_VEC_ALLOC_P_STACK(TYPE).  This uses alloca to get the initial
   space; because alloca can not be usefully called in an inline
   function, and because a macro can not define a macro, you must then
   write a #define for each type:

   #define VEC_{TYPE}_stack_alloc(alloc)                          \
     VEC_stack_alloc({TYPE}, alloc)

   This is really a hack and perhaps can be made better.  Note that
   this macro will wind up evaluating the ALLOC parameter twice.

   Only the initial allocation will be made using alloca, so pass a
   reasonable estimate that doesn't use too much stack space; don't
   pass zero.  Don't return a VEC(TYPE,stack) vector from the function
   which allocated it.  */

extern void *vec_stack_p_reserve (void *, int MEM_STAT_DECL);
extern void *vec_stack_p_reserve_exact (void *, int MEM_STAT_DECL);
extern void *vec_stack_p_reserve_exact_1 (int, void *);
extern void *vec_stack_o_reserve (void *, int, size_t, size_t MEM_STAT_DECL);
extern void *vec_stack_o_reserve_exact (void *, int, size_t, size_t
					 MEM_STAT_DECL);
extern void vec_stack_free (void *);

#ifdef GATHER_STATISTICS
#define VEC_stack_alloc(T,alloc,name,line,function)			  \
  (VEC_OP (T,stack,alloc1)						  \
   (alloc, XALLOCAVAR (VEC(T,stack), VEC_embedded_size (T, alloc))))
#else
#define VEC_stack_alloc(T,alloc)					  \
  (VEC_OP (T,stack,alloc1)						  \
   (alloc, XALLOCAVAR (VEC(T,stack), VEC_embedded_size (T, alloc))))
#endif

#define DEF_VEC_ALLOC_P_STACK(T)					  \
VEC_TA(T,base,stack);							  \
DEF_VEC_ALLOC_FUNC_P_STACK(T)						  \
DEF_VEC_NONALLOC_FUNCS_P(T,stack)					  \
struct vec_swallow_trailing_semi

#define DEF_VEC_ALLOC_FUNC_P_STACK(T)					  \
static inline VEC(T,stack) *VEC_OP (T,stack,alloc1)			  \
     (int alloc_, VEC(T,stack)* space)					  \
{									  \
  return (VEC(T,stack) *) vec_stack_p_reserve_exact_1 (alloc_, space);	  \
}

#define DEF_VEC_ALLOC_O_STACK(T)					  \
VEC_TA(T,base,stack);							  \
DEF_VEC_ALLOC_FUNC_O_STACK(T)						  \
DEF_VEC_NONALLOC_FUNCS_O(T,stack)					  \
struct vec_swallow_trailing_semi

#define DEF_VEC_ALLOC_FUNC_O_STACK(T)					  \
static inline VEC(T,stack) *VEC_OP (T,stack,alloc1)			  \
     (int alloc_, VEC(T,stack)* space)					  \
{									  \
  return (VEC(T,stack) *) vec_stack_p_reserve_exact_1 (alloc_, space);	  \
}

#define DEF_VEC_ALLOC_I_STACK(T)					  \
VEC_TA(T,base,stack);							  \
DEF_VEC_ALLOC_FUNC_I_STACK(T)						  \
DEF_VEC_NONALLOC_FUNCS_I(T,stack)					  \
struct vec_swallow_trailing_semi

#define DEF_VEC_ALLOC_FUNC_I_STACK(T)					  \
static inline VEC(T,stack) *VEC_OP (T,stack,alloc1)			  \
     (int alloc_, VEC(T,stack)* space)					  \
{									  \
  return (VEC(T,stack) *) vec_stack_p_reserve_exact_1 (alloc_, space);   \
}

#endif /* GCC_VEC_H */
