/* Vector API for GDB.
   Copyright (C) 2004-2016 Free Software Foundation, Inc.
   Contributed by Nathan Sidwell <nathan@codesourcery.com>

   This file is part of GDB.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */

#if !defined (GDB_VEC_H)
#define GDB_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.

   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 a
   negative number for reservation.  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.

   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.
   Variables of vector type are declared using a VEC(TYPEDEF) macro.
   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.

   An example of their use would be,

   DEF_VEC_P(tree);   // non-managed tree vector.

   struct my_struct {
     VEC(tree) *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, 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.
   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,length)(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,last)(V VEC_ASSERT_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,index)(V,I VEC_ASSERT_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,iterate)(V,I,&(P)))

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

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

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

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

   Free a vector and set it to NULL.  */

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

/* A cleanup function for a vector.
   void VEC_T_cleanup(void *);
   
   Clean up a vector.  */

#define VEC_cleanup(T)	(VEC_OP(T,cleanup))

/* 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,embedded_size)(N))
#define VEC_embedded_init(T,O,N) (VEC_OP(T,embedded_init)(VEC_BASE(O),N))

/* Copy a vector.
   VEC(T,A) *VEC_T_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,V) (VEC_OP(T,copy)(V))

/* Merge two vectors.
   VEC(T,A) *VEC_T_merge(VEC(T) *, VEC(T) *);

   Copy the live elements of both vectors into a new vector.  The new
   and old vectors need not be allocated by the same mechanism.  */
#define VEC_merge(T,V1,V2) (VEC_OP(T,merge)(V1, V2))

/* 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,space)(V,R VEC_ASSERT_INFO))

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

   Ensure that V has at least abs(RESERVE) slots available.  The
   signedness of RESERVE determines the reallocation behavior.  A
   negative value will not create additional headroom beyond that
   requested.  A positive value will create additional headroom.  Note
   this can cause V to be reallocated.  Returns nonzero iff
   reallocation actually occurred.  */

#define VEC_reserve(T,V,R) (VEC_OP(T,reserve)(&(V),R VEC_ASSERT_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,quick_push)(V,O VEC_ASSERT_INFO))

/* Push object with reallocation
   T *VEC_T_safe_push (VEC(T,A) *&v, T obj); // Integer
   T *VEC_T_safe_push (VEC(T,A) *&v, T obj); // Pointer
   T *VEC_T_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,V,O) (VEC_OP(T,safe_push)(&(V),O VEC_ASSERT_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,pop)(V VEC_ASSERT_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,truncate)(V,I VEC_ASSERT_INFO))

/* Grow to a specific length.
   void VEC_T_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,V,I)		\
	(VEC_OP(T,safe_grow)(&(V),I VEC_ASSERT_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,replace)(V,I,O VEC_ASSERT_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,quick_insert)(V,I,O VEC_ASSERT_INFO))

/* Insert object with reallocation
   T *VEC_T_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Integer
   T *VEC_T_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Pointer
   T *VEC_T_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,V,I,O)	\
	(VEC_OP(T,safe_insert)(&(V),I,O VEC_ASSERT_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,ordered_remove)(V,I VEC_ASSERT_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,unordered_remove)(V,I VEC_ASSERT_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(N) operation due to memmove.  */

#define VEC_block_remove(T,V,I,L)	\
	(VEC_OP(T,block_remove)(V,I,L VEC_ASSERT_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,address)(V))

/* Find the first index in the vector not less than the object.
   unsigned VEC_T_lower_bound (VEC(T) *v, const T val,
                               int (*lessthan) (const T, const T)); // Integer
   unsigned VEC_T_lower_bound (VEC(T) *v, const T val,
                               int (*lessthan) (const T, const T)); // Pointer
   unsigned VEC_T_lower_bound (VEC(T) *v, const T *val,
                               int (*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,lower_bound)(V,O,LT VEC_ASSERT_INFO))

/* Reallocate an array of elements with prefix.  */
extern void *vec_p_reserve (void *, int);
extern void *vec_o_reserve (void *, int, size_t, size_t);
#define vec_free_(V) xfree (V)

#define VEC_ASSERT_INFO ,__FILE__,__LINE__
#define VEC_ASSERT_DECL ,const char *file_,unsigned line_
#define VEC_ASSERT_PASS ,file_,line_
#define vec_assert(expr, op) \
  ((void)((expr) ? 0 : (gdb_assert_fail (op, file_, line_, \
					 FUNCTION_NAME), 0)))

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

#define VEC_T(T)							  \
typedef struct VEC(T)							  \
{									  \
  unsigned num;								  \
  unsigned alloc;							  \
  T vec[1];								  \
} VEC(T)

/* 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);								  \
DEF_VEC_FUNC_P(T)							  \
DEF_VEC_ALLOC_FUNC_I(T)							  \
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(T);								  \
DEF_VEC_FUNC_P(T)							  \
DEF_VEC_ALLOC_FUNC_P(T)							  \
struct vec_swallow_trailing_semi

/* Vector of object.  */
#define DEF_VEC_O(T)							  \
VEC_T(T);								  \
DEF_VEC_FUNC_O(T)							  \
DEF_VEC_ALLOC_FUNC_O(T)							  \
struct vec_swallow_trailing_semi

/* Avoid offsetof (or its usual C implementation) as it triggers
   -Winvalid-offsetof warnings with enum_flags types with G++ <= 4.4,
   even though those types are memcpyable.  This requires allocating a
   dummy local VEC in all routines that use this, but that has the
   advantage that it only works if T is default constructible, which
   is exactly a check we want, to keep C compatibility.  */
#define vec_offset(T, VPTR) ((size_t) ((char *) &(VPTR)->vec - (char *) VPTR))

#define DEF_VEC_ALLOC_FUNC_I(T)						  \
static inline VEC(T) *VEC_OP (T,alloc)					  \
     (int alloc_)							  \
{									  \
  VEC(T) dummy;							  	  \
									  \
  /* We must request exact size allocation, hence the negation.  */	  \
  return (VEC(T) *) vec_o_reserve (NULL, -alloc_,			  \
                                   vec_offset (T, &dummy), sizeof (T));	  \
}									  \
									  \
static inline VEC(T) *VEC_OP (T,copy) (VEC(T) *vec_)			  \
{									  \
  size_t len_ = vec_ ? vec_->num : 0;					  \
  VEC (T) *new_vec_ = NULL;						  \
									  \
  if (len_)								  \
    {									  \
      VEC(T) dummy;							  \
									  \
      /* We must request exact size allocation, hence the negation.  */	  \
      new_vec_ = (VEC (T) *)						  \
	vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T));	\
									  \
      new_vec_->num = len_;						  \
      memcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_);		  \
    }									  \
  return new_vec_;							  \
}									  \
									  \
static inline VEC(T) *VEC_OP (T,merge) (VEC(T) *vec1_, VEC(T) *vec2_)	  \
{									  \
  if (vec1_ && vec2_)							  \
    {									  \
      VEC(T) dummy;							  \
      size_t len_ = vec1_->num + vec2_->num;				  \
      VEC (T) *new_vec_ = NULL;						  \
									  \
      /* We must request exact size allocation, hence the negation.  */	  \
      new_vec_ = (VEC (T) *)						  \
	vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T));	  \
									  \
      new_vec_->num = len_;						  \
      memcpy (new_vec_->vec, vec1_->vec, sizeof (T) * vec1_->num);	  \
      memcpy (new_vec_->vec + vec1_->num, vec2_->vec,			  \
	      sizeof (T) * vec2_->num);					  \
									  \
      return new_vec_;							  \
    }									  \
  else									  \
    return VEC_copy (T, vec1_ ? vec1_ : vec2_);				  \
}									  \
									  \
static inline void VEC_OP (T,free)					  \
     (VEC(T) **vec_)							  \
{									  \
  if (*vec_)								  \
    vec_free_ (*vec_);							  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline void VEC_OP (T,cleanup)					  \
     (void *arg_)							  \
{									  \
  VEC(T) **vec_ = (VEC(T) **) arg_;					  \
  if (*vec_)								  \
    vec_free_ (*vec_);							  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline int VEC_OP (T,reserve)					  \
     (VEC(T) **vec_, int alloc_ VEC_ASSERT_DECL)			  \
{									  \
  VEC(T) dummy;								  \
  int extend = !VEC_OP (T,space)					  \
	(*vec_, alloc_ < 0 ? -alloc_ : alloc_ VEC_ASSERT_PASS);		  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T) *) vec_o_reserve (*vec_, alloc_,			  \
				      vec_offset (T, &dummy), sizeof (T)); \
									  \
  return extend;							  \
}									  \
									  \
static inline void VEC_OP (T,safe_grow)					  \
     (VEC(T) **vec_, int size_ VEC_ASSERT_DECL)				  \
{									  \
  vec_assert (size_ >= 0 && VEC_OP(T,length) (*vec_) <= (unsigned)size_,  \
	"safe_grow");							  \
  VEC_OP (T,reserve) (vec_, (int)(*vec_ ? (*vec_)->num : 0) - size_	  \
			VEC_ASSERT_PASS);				  \
  (*vec_)->num = size_;							  \
}									  \
									  \
static inline T *VEC_OP (T,safe_push)					  \
     (VEC(T) **vec_, const T obj_ VEC_ASSERT_DECL)			  \
{									  \
  VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS);				  \
									  \
  return VEC_OP (T,quick_push) (*vec_, obj_ VEC_ASSERT_PASS);		  \
}									  \
									  \
static inline T *VEC_OP (T,safe_insert)					  \
     (VEC(T) **vec_, unsigned ix_, const T obj_ VEC_ASSERT_DECL)	  \
{									  \
  VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS);				  \
									  \
  return VEC_OP (T,quick_insert) (*vec_, ix_, obj_ VEC_ASSERT_PASS);	  \
}

#define DEF_VEC_FUNC_P(T)						  \
static inline unsigned VEC_OP (T,length) (const VEC(T) *vec_)		  \
{									  \
  return vec_ ? vec_->num : 0;						  \
}									  \
									  \
static inline T VEC_OP (T,last)						  \
	(const VEC(T) *vec_ VEC_ASSERT_DECL)				  \
{									  \
  vec_assert (vec_ && vec_->num, "last");				  \
									  \
  return vec_->vec[vec_->num - 1];					  \
}									  \
									  \
static inline T VEC_OP (T,index)					  \
     (const VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL)			  \
{									  \
  vec_assert (vec_ && ix_ < vec_->num, "index");			  \
									  \
  return vec_->vec[ix_];						  \
}									  \
									  \
static inline int VEC_OP (T,iterate)					  \
     (const VEC(T) *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,embedded_size)				  \
     (int alloc_)							  \
{									  \
  VEC(T) dummy;								  \
									  \
  return vec_offset (T, &dummy) + alloc_ * sizeof(T);			  \
}									  \
									  \
static inline void VEC_OP (T,embedded_init)				  \
     (VEC(T) *vec_, int alloc_)						  \
{									  \
  vec_->num = 0;							  \
  vec_->alloc = alloc_;							  \
}									  \
									  \
static inline int VEC_OP (T,space)					  \
     (VEC(T) *vec_, int alloc_ VEC_ASSERT_DECL)				  \
{									  \
  vec_assert (alloc_ >= 0, "space");					  \
  return vec_ ? vec_->alloc - vec_->num >= (unsigned)alloc_ : !alloc_;	  \
}									  \
									  \
static inline T *VEC_OP (T,quick_push)					  \
     (VEC(T) *vec_, T obj_ VEC_ASSERT_DECL)				  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (vec_->num < vec_->alloc, "quick_push");			  \
  slot_ = &vec_->vec[vec_->num++];					  \
  *slot_ = obj_;							  \
									  \
  return slot_;								  \
}									  \
									  \
static inline T VEC_OP (T,pop) (VEC(T) *vec_ VEC_ASSERT_DECL)		  \
{									  \
  T obj_;								  \
									  \
  vec_assert (vec_->num, "pop");					  \
  obj_ = vec_->vec[--vec_->num];					  \
									  \
  return obj_;								  \
}									  \
									  \
static inline void VEC_OP (T,truncate)					  \
     (VEC(T) *vec_, unsigned size_ VEC_ASSERT_DECL)			  \
{									  \
  vec_assert (vec_ ? vec_->num >= size_ : !size_, "truncate");		  \
  if (vec_)								  \
    vec_->num = size_;							  \
}									  \
									  \
static inline T VEC_OP (T,replace)					  \
     (VEC(T) *vec_, unsigned ix_, T obj_ VEC_ASSERT_DECL)		  \
{									  \
  T old_obj_;								  \
									  \
  vec_assert (ix_ < vec_->num, "replace");				  \
  old_obj_ = vec_->vec[ix_];						  \
  vec_->vec[ix_] = obj_;						  \
									  \
  return old_obj_;							  \
}									  \
									  \
static inline T *VEC_OP (T,quick_insert)				  \
     (VEC(T) *vec_, unsigned ix_, T obj_ VEC_ASSERT_DECL)		  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (vec_->num < vec_->alloc && ix_ <= vec_->num, "quick_insert"); \
  slot_ = &vec_->vec[ix_];						  \
  memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (T));		  \
  *slot_ = obj_;							  \
									  \
  return slot_;								  \
}									  \
									  \
static inline T VEC_OP (T,ordered_remove)				  \
     (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL)			  \
{									  \
  T *slot_;								  \
  T obj_;								  \
									  \
  vec_assert (ix_ < vec_->num, "ordered_remove");			  \
  slot_ = &vec_->vec[ix_];						  \
  obj_ = *slot_;							  \
  memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (T));		  \
									  \
  return obj_;								  \
}									  \
									  \
static inline T VEC_OP (T,unordered_remove)				  \
     (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL)			  \
{									  \
  T *slot_;								  \
  T obj_;								  \
									  \
  vec_assert (ix_ < vec_->num, "unordered_remove");			  \
  slot_ = &vec_->vec[ix_];						  \
  obj_ = *slot_;							  \
  *slot_ = vec_->vec[--vec_->num];					  \
									  \
  return obj_;								  \
}									  \
									  \
static inline void VEC_OP (T,block_remove)				  \
     (VEC(T) *vec_, unsigned ix_, unsigned len_ VEC_ASSERT_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (ix_ + len_ <= vec_->num, "block_remove");			  \
  slot_ = &vec_->vec[ix_];						  \
  vec_->num -= len_;							  \
  memmove (slot_, slot_ + len_, (vec_->num - ix_) * sizeof (T));	  \
}									  \
									  \
static inline T *VEC_OP (T,address)					  \
     (VEC(T) *vec_)							  \
{									  \
  return vec_ ? vec_->vec : 0;						  \
}									  \
									  \
static inline unsigned VEC_OP (T,lower_bound)				  \
     (VEC(T) *vec_, const T obj_,					  \
      int (*lessthan_)(const T, const T) VEC_ASSERT_DECL)		  \
{									  \
   unsigned int len_ = VEC_OP (T, 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,index) (vec_, middle_ VEC_ASSERT_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)						  \
static inline VEC(T) *VEC_OP (T,alloc)					  \
     (int alloc_)							  \
{									  \
  /* We must request exact size allocation, hence the negation.  */	  \
  return (VEC(T) *) vec_p_reserve (NULL, -alloc_);			  \
}									  \
									  \
static inline void VEC_OP (T,free)					  \
     (VEC(T) **vec_)							  \
{									  \
  if (*vec_)								  \
    vec_free_ (*vec_);							  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline void VEC_OP (T,cleanup)					  \
     (void *arg_)							  \
{									  \
  VEC(T) **vec_ = (VEC(T) **) arg_;					  \
  if (*vec_)								  \
    vec_free_ (*vec_);							  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline VEC(T) *VEC_OP (T,copy) (VEC(T) *vec_)			  \
{									  \
  size_t len_ = vec_ ? vec_->num : 0;					  \
  VEC (T) *new_vec_ = NULL;						  \
									  \
  if (len_)								  \
    {									  \
      /* We must request exact size allocation, hence the negation.  */	  \
      new_vec_ = (VEC (T) *)(vec_p_reserve (NULL, -len_));		  \
									  \
      new_vec_->num = len_;						  \
      memcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_);		  \
    }									  \
  return new_vec_;							  \
}									  \
									  \
static inline VEC(T) *VEC_OP (T,merge) (VEC(T) *vec1_, VEC(T) *vec2_)	  \
{									  \
  if (vec1_ && vec2_)							  \
    {									  \
      size_t len_ = vec1_->num + vec2_->num;				  \
      VEC (T) *new_vec_ = NULL;						  \
									  \
      /* We must request exact size allocation, hence the negation.  */	  \
      new_vec_ = (VEC (T) *)(vec_p_reserve (NULL, -len_));		  \
									  \
      new_vec_->num = len_;						  \
      memcpy (new_vec_->vec, vec1_->vec, sizeof (T) * vec1_->num);	  \
      memcpy (new_vec_->vec + vec1_->num, vec2_->vec,			  \
	      sizeof (T) * vec2_->num);					  \
									  \
      return new_vec_;							  \
    }									  \
  else									  \
    return VEC_copy (T, vec1_ ? vec1_ : vec2_);				  \
}									  \
									  \
static inline int VEC_OP (T,reserve)					  \
     (VEC(T) **vec_, int alloc_ VEC_ASSERT_DECL)			  \
{									  \
  int extend = !VEC_OP (T,space)					  \
	(*vec_, alloc_ < 0 ? -alloc_ : alloc_ VEC_ASSERT_PASS);		  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T) *) vec_p_reserve (*vec_, alloc_);			  \
									  \
  return extend;							  \
}									  \
									  \
static inline void VEC_OP (T,safe_grow)					  \
     (VEC(T) **vec_, int size_ VEC_ASSERT_DECL)				  \
{									  \
  vec_assert (size_ >= 0 && VEC_OP(T,length) (*vec_) <= (unsigned)size_,  \
	"safe_grow");							  \
  VEC_OP (T,reserve)							  \
	(vec_, (int)(*vec_ ? (*vec_)->num : 0) - size_ VEC_ASSERT_PASS);  \
  (*vec_)->num = size_;							  \
}									  \
									  \
static inline T *VEC_OP (T,safe_push)					  \
     (VEC(T) **vec_, T obj_ VEC_ASSERT_DECL)				  \
{									  \
  VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS);				  \
									  \
  return VEC_OP (T,quick_push) (*vec_, obj_ VEC_ASSERT_PASS);		  \
}									  \
									  \
static inline T *VEC_OP (T,safe_insert)					  \
     (VEC(T) **vec_, unsigned ix_, T obj_ VEC_ASSERT_DECL)		  \
{									  \
  VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS);				  \
									  \
  return VEC_OP (T,quick_insert) (*vec_, ix_, obj_ VEC_ASSERT_PASS);	  \
}

#define DEF_VEC_FUNC_O(T)						  \
static inline unsigned VEC_OP (T,length) (const VEC(T) *vec_)		  \
{									  \
  return vec_ ? vec_->num : 0;						  \
}									  \
									  \
static inline T *VEC_OP (T,last) (VEC(T) *vec_ VEC_ASSERT_DECL)		  \
{									  \
  vec_assert (vec_ && vec_->num, "last");				  \
									  \
  return &vec_->vec[vec_->num - 1];					  \
}									  \
									  \
static inline T *VEC_OP (T,index)					  \
     (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL)			  \
{									  \
  vec_assert (vec_ && ix_ < vec_->num, "index");			  \
									  \
  return &vec_->vec[ix_];						  \
}									  \
									  \
static inline int VEC_OP (T,iterate)					  \
     (VEC(T) *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,embedded_size)				  \
     (int alloc_)							  \
{									  \
  VEC(T) dummy;								  \
									  \
  return vec_offset (T, &dummy) + alloc_ * sizeof(T);			  \
}									  \
									  \
static inline void VEC_OP (T,embedded_init)				  \
     (VEC(T) *vec_, int alloc_)						  \
{									  \
  vec_->num = 0;							  \
  vec_->alloc = alloc_;							  \
}									  \
									  \
static inline int VEC_OP (T,space)					  \
     (VEC(T) *vec_, int alloc_ VEC_ASSERT_DECL)				  \
{									  \
  vec_assert (alloc_ >= 0, "space");					  \
  return vec_ ? vec_->alloc - vec_->num >= (unsigned)alloc_ : !alloc_;	  \
}									  \
									  \
static inline T *VEC_OP (T,quick_push)					  \
     (VEC(T) *vec_, const T *obj_ VEC_ASSERT_DECL)			  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (vec_->num < vec_->alloc, "quick_push");			  \
  slot_ = &vec_->vec[vec_->num++];					  \
  if (obj_)								  \
    *slot_ = *obj_;							  \
									  \
  return slot_;								  \
}									  \
									  \
static inline void VEC_OP (T,pop) (VEC(T) *vec_ VEC_ASSERT_DECL)	  \
{									  \
  vec_assert (vec_->num, "pop");					  \
  --vec_->num;								  \
}									  \
									  \
static inline void VEC_OP (T,truncate)					  \
     (VEC(T) *vec_, unsigned size_ VEC_ASSERT_DECL)			  \
{									  \
  vec_assert (vec_ ? vec_->num >= size_ : !size_, "truncate");		  \
  if (vec_)								  \
    vec_->num = size_;							  \
}									  \
									  \
static inline T *VEC_OP (T,replace)					  \
     (VEC(T) *vec_, unsigned ix_, const T *obj_ VEC_ASSERT_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (ix_ < vec_->num, "replace");				  \
  slot_ = &vec_->vec[ix_];						  \
  if (obj_)								  \
    *slot_ = *obj_;							  \
									  \
  return slot_;								  \
}									  \
									  \
static inline T *VEC_OP (T,quick_insert)				  \
     (VEC(T) *vec_, unsigned ix_, const T *obj_ VEC_ASSERT_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (vec_->num < vec_->alloc && ix_ <= vec_->num, "quick_insert"); \
  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,ordered_remove)				  \
     (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL)			  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (ix_ < vec_->num, "ordered_remove");			  \
  slot_ = &vec_->vec[ix_];						  \
  memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (T));		  \
}									  \
									  \
static inline void VEC_OP (T,unordered_remove)				  \
     (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL)			  \
{									  \
  vec_assert (ix_ < vec_->num, "unordered_remove");			  \
  vec_->vec[ix_] = vec_->vec[--vec_->num];				  \
}									  \
									  \
static inline void VEC_OP (T,block_remove)				  \
     (VEC(T) *vec_, unsigned ix_, unsigned len_ VEC_ASSERT_DECL)	  \
{									  \
  T *slot_;								  \
									  \
  vec_assert (ix_ + len_ <= vec_->num, "block_remove");			  \
  slot_ = &vec_->vec[ix_];						  \
  vec_->num -= len_;							  \
  memmove (slot_, slot_ + len_, (vec_->num - ix_) * sizeof (T));	  \
}									  \
									  \
static inline T *VEC_OP (T,address)					  \
     (VEC(T) *vec_)							  \
{									  \
  return vec_ ? vec_->vec : 0;						  \
}									  \
									  \
static inline unsigned VEC_OP (T,lower_bound)				  \
     (VEC(T) *vec_, const T *obj_,					  \
      int (*lessthan_)(const T *, const T *) VEC_ASSERT_DECL)		  \
{									  \
   unsigned int len_ = VEC_OP (T, 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,index) (vec_, middle_ VEC_ASSERT_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)						  \
static inline VEC(T) *VEC_OP (T,alloc)					  \
     (int alloc_)							  \
{									  \
  VEC(T) dummy;								  \
									  \
  /* We must request exact size allocation, hence the negation.  */	  \
  return (VEC(T) *) vec_o_reserve (NULL, -alloc_,			  \
                                   vec_offset (T, &dummy), sizeof (T));	  \
}									  \
									  \
static inline VEC(T) *VEC_OP (T,copy) (VEC(T) *vec_)			  \
{									  \
  size_t len_ = vec_ ? vec_->num : 0;					  \
  VEC (T) *new_vec_ = NULL;						  \
									  \
  if (len_)								  \
    {									  \
      VEC(T) dummy;							  \
									  \
      /* We must request exact size allocation, hence the negation.  */	  \
      new_vec_ = (VEC (T) *)						  \
	vec_o_reserve  (NULL, -len_, vec_offset (T, &dummy), sizeof (T)); \
									  \
      new_vec_->num = len_;						  \
      memcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_);		  \
    }									  \
  return new_vec_;							  \
}									  \
									  \
static inline VEC(T) *VEC_OP (T,merge) (VEC(T) *vec1_, VEC(T) *vec2_)	  \
{									  \
  if (vec1_ && vec2_)							  \
    {									  \
      VEC(T) dummy;							  \
      size_t len_ = vec1_->num + vec2_->num;				  \
      VEC (T) *new_vec_ = NULL;						  \
									  \
      /* We must request exact size allocation, hence the negation.  */	  \
      new_vec_ = (VEC (T) *)						  \
	vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T));  \
									  \
      new_vec_->num = len_;						  \
      memcpy (new_vec_->vec, vec1_->vec, sizeof (T) * vec1_->num);	  \
      memcpy (new_vec_->vec + vec1_->num, vec2_->vec,			  \
	      sizeof (T) * vec2_->num);					  \
									  \
      return new_vec_;							  \
    }									  \
  else									  \
    return VEC_copy (T, vec1_ ? vec1_ : vec2_);				  \
}									  \
									  \
static inline void VEC_OP (T,free)					  \
     (VEC(T) **vec_)							  \
{									  \
  if (*vec_)								  \
    vec_free_ (*vec_);							  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline void VEC_OP (T,cleanup)					  \
     (void *arg_)							  \
{									  \
  VEC(T) **vec_ = (VEC(T) **) arg_;					  \
  if (*vec_)								  \
    vec_free_ (*vec_);							  \
  *vec_ = NULL;								  \
}									  \
									  \
static inline int VEC_OP (T,reserve)					  \
     (VEC(T) **vec_, int alloc_ VEC_ASSERT_DECL)			  \
{									  \
  VEC(T) dummy;								  \
  int extend = !VEC_OP (T,space) (*vec_, alloc_ < 0 ? -alloc_ : alloc_	  \
				  VEC_ASSERT_PASS);			  \
									  \
  if (extend)								  \
    *vec_ = (VEC(T) *)							  \
      vec_o_reserve (*vec_, alloc_, vec_offset (T, &dummy), sizeof (T));  \
									  \
  return extend;							  \
}									  \
									  \
static inline void VEC_OP (T,safe_grow)					  \
     (VEC(T) **vec_, int size_ VEC_ASSERT_DECL)				  \
{									  \
  vec_assert (size_ >= 0 && VEC_OP(T,length) (*vec_) <= (unsigned)size_,  \
	"safe_grow");							  \
  VEC_OP (T,reserve)							  \
	(vec_, (int)(*vec_ ? (*vec_)->num : 0) - size_ VEC_ASSERT_PASS);  \
  (*vec_)->num = size_;							  \
}									  \
									  \
static inline T *VEC_OP (T,safe_push)					  \
     (VEC(T) **vec_, const T *obj_ VEC_ASSERT_DECL)			  \
{									  \
  VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS);				  \
									  \
  return VEC_OP (T,quick_push) (*vec_, obj_ VEC_ASSERT_PASS);		  \
}									  \
									  \
static inline T *VEC_OP (T,safe_insert)					  \
     (VEC(T) **vec_, unsigned ix_, const T *obj_ VEC_ASSERT_DECL)	  \
{									  \
  VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS);				  \
									  \
  return VEC_OP (T,quick_insert) (*vec_, ix_, obj_ VEC_ASSERT_PASS);	  \
}

#endif /* GDB_VEC_H */
