This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [cxx-conversion] Convert vec.[ch] to C++ [1/3] (issue6233044)


On Thu, May 24, 2012 at 1:16 AM, Richard Guenther
<richard.guenther@gmail.com> wrote:
> On Wed, May 23, 2012 at 9:48 PM, Diego Novillo <dnovillo@google.com> wrote:
>>
>> This series of 3 patches re-implement vec.[ch] in C++.
>>
>> The main goal of this first step is to minimize changes to client
>> code. ÂI tried very hard to maintain the existing API. ÂThis means
>> that vectors are still simple structures accessed via the existing
>> VEC_* functions.
>>
>> The major change introduced here is the removal of all the macro-based
>> type creation in vec.h:
>>
>> 1- Given a type T and an allocation strategy A, VEC(T,A) used to
>> Â expand into the C type 'struct VEC_T_A'. ÂThe family of accessor
>> Â functions for VEC_T_A were created via macro expansion and token
>> Â pasting.
>>
>> Â After this patch, VEC(T,A) expands to 'vec_t<T>':
>>
>> Â Â Â Â Â Âtemplate<typename T>
>> Â Â Â Â Â Âstruct GTY(()) vec_t
>> Â Â Â Â Â Â{
>> Â Â Â Â Â Â Âvec_prefix prefix;
>> Â Â Â Â Â Â ÂT GTY((length ("%h.prefix.num"))) vec[1];
>> Â Â Â Â Â Â};
>>
>> Â The family of accessor functions for vec_t<T> are free functions
>> Â templated on <T> or <T,A> depending on whether the function needs
>> Â to perform allocation operations.
>>
>> 2- All the DEF_VEC_[IOP] and DEF_VEC_ALLOC_[IOP] macros expand to the
>> Â nil expansion 'struct vec_swallow_trailing_semi'. ÂThis represents
>> Â the bulk of the removal in vec.h.
>>
>> 3- I removed one indirection from the existing VEC structures. ÂBefore
>> Â this patch, the visible structure created by VEC_T_A had a single
>> Â element 'base', which, in turn, was the structure holding 'prefix'
>> Â and 'vec'. ÂThe new vec_t<T> has 'prefix' and 'vec' in it. ÂThis
>> Â may change in the second iteration of this patch.
>
> I believe this was because of aliasing - you may dig in the svn history
> to find out what we miscompiled when not doing this and whether it is
> still necessary or not.

Yes it was done for aliasing reasons (I did this change).  In fact it
is still necessary and it was only reproduciable with LTO and -O3.

Thanks,
Andrew Pinski


>
>> Some client code changes were needed:
>>
>> 1- The allocation names 'heap', 'stack' and 'gc' are not embedded in
>> Â the type name anymore. ÂThey are enum values used as a template
>> Â argument for functions like VEC_alloc() and VEC_free(). ÂSince they
>> Â are now separate identifiers, some existing code that declared
>> Â variables with the names 'heap' and 'stack' had to change.
>>
>> Â I did not change these enum values to better names because that
>> Â would have meant changing a lot more client code. ÂI will change
>> Â this in a future patch.
>
> Yeah. ÂCan we have
>
> template <...>
> struct vec {
> Â enum { gc, heap, stack };
> ...
> }
>
> and use vec<T, vec::stack> instead? ÂNot sure if this or something similar
> is valid C++.
>
>> 2- VEC_index and VEC_last now return a reference to the element. ÂThe
>> Â existing APIs implemented two versions of these functions. ÂOne
>> Â returning the element itself (used for vec_t<T *>). ÂAnother returning
>> Â a pointer to the element (used for vec_t<T>).
>>
>> Â This is impossible to represent in C++ directly, as functions
>> Â cannot be overloaded by their return value. ÂInstead, I made them
>> Â return a reference to the element. ÂThis means that vectors storing
>> Â pointers (T *) do not need to change, but vectors of objects (T) do
>> Â need to change.
>>
>> Â We have fewer vec_t<T> than vec_t<T *>, so this was the smaller change
>> Â (which still meant changing a few hundred call sites).
>
> We still can have const overloads when taking a const vec though?
>
>> 3- The family of VEC_*push and VEC_*replace functions have overloads
>> Â for handling 'T' and 'const T *' objects. ÂThe former is used for
>> Â vec_t<T>, the latter for vec_t<T*>. ÂThis means, however, than when
>> Â pushing the special value 0 on a vec_t<T*>, the compiler will not
>> Â know which overload we meant, as 0 matches both. ÂIn these cases
>> Â (not very many), a static cast is all we need to help it.
>>
>> Â I'm not terribly content with this one. ÂI'll try to have a better
>> Â approach in the second iteration (which will liberally change all
>> Â client code).
>
> I wonder whether explicitely specifying the template type is better? ÂThus,
> VEC_safe_push<T *, gc>(0) instead of automatically deducing the template
> argument?
>
>> 4- I extended gengtype to understand templated types. ÂThese changes
>> Â are not as ugly as I thought they would be. ÂGengtype has some
>> Â hardwired knowledge of VEC_*, which I renamed to vec_t. ÂI'm not
>> Â even sure why gengtype needs to care about vec_t in this way, but I
>> Â was looking for minimal changes, so I just did it.
>>
>> Â The other change is more generic. ÂIt allows gengtype to deal with
>> Â templated types. ÂThere is a new function (filter_type_name) that
>> Â recognizes C++ special characters '<', '>' and ':'. ÂIt turns them
>> Â into '_'. ÂThis way, gengtype can generate a valid identifier for
>> Â the pre-processor. ÂIt only does this in contexts where it needs a
>> Â pre-processor identifier. ÂFor everything else, it emits the type
>> Â directly. ÂSo, the functions emitted in gt-*.h files have proper
>> Â template type references.
>
> Well, that part is of course what needs to change. ÂI don't think we want
> gengtype to work like this for templates as this does not scale.
>
>>
>> Properties of this patch:
>>
>> The performance and memory numbers I collected here were done by
>> bootstrapping the branch before and after my patch with all
>> languages enabled (including Ada and Go).
>>
>> I collected time and memory reports by forcing the switches
>> -ftime-report and -fmem-report to be on by default, and to emit
>> their output to a separate file (otherwise the bootstrap fails
>> when some configure checks get confused by the extraneous stderr
>> output). ÂThis produced 2.9Gb of output over 12,944 timings
>> files.
>>
>> 1- There is much less code in vec.[ch] (21% fewer lines).
>> Â Functions are no longer replicated 2 or 3 times.
>>
>> 2- Debugging VEC_* routines is simpler. ÂFailures in GDB go to
>> Â the specific VEC_* function instance, instead of the DEF_VEC_*
>> Â macro.
>>
>> 3- The new implementation is faster. ÂIndividual compiles are
>> Â generally 2.0 to 2.5% faster (wall time). ÂThis translates into
>> Â a bootstrap speedup of 1-2% (wall time reduction of about a minute
>> Â on my desktop).
>>
>> Â The reason for this speedup is that various VEC_ routines now
>> Â return a reference to the element, which means that for vec_t<T>
>> Â there is one less memory indirection to perform.
>>
>> 4- Minimal changes to binary code size. ÂThe *1 binaries are about
>> Â 0.07% bigger.
>>
>> 5- Reduced memory consumption by 4% on average (as measured by -fmem-report).
>> Â I averaged the 'Total Allocated:' field from -fmem-report from
>> Â all the compile
>>
>> Â There are fewer macros expanded (-23%) and fewer
>> Â trees generated (the numbers below are averages over the
>> Â 12,944 compilations):
>>
>>            ÂBefore     ÂAfter      (%)
>>    Âdecls      Â9,491      9,240     Â- 2.6%
>>    Âtypes      Â2,958      2,827     Â- 4.4%
>>    Âblocks       525       460     Â-12.4%
>>    Âstmts      Â1,123      1,043     Â- 7.1%
>>    Ârefs       4,369      3,926     Â-10.1%
>>    Âexprs      15,236     Â14,283     Â- 6.2%
>>    Âconstants    Â1,888      1,871     Â- 0.9%
>>    Âidentifiers   Â7,285      7,197     Â- 1.2%
>>    Âvecs       1,786      1,786       Â0%
>>    Âbinfos       113       109     Â- 3.5%
>>    Âssa names    Â2,240      2,240       Â0%
>>    Âconstructors    245       245       Â0%
>>    Ârandom kinds  Â13,338     Â12,849     Â- 3.7%
>> Â Â Â Âlang_decl kinds Â2,816 Â Â Â Â Â 2,640 Â Â Â Â Â- 6.2%
>>    Âlang_type kinds  Â110       106     Â- 3.6%
>>    Âomp clauses     Â0        0       Â0%
>>
>>
>>
>> Next step:
>>
>> Before I consider moving this patch over to trunk, I would like to
>> generate a second patch that will:
>>
>> 1- Move all the free functions VEC_* into vec_t<T>. ÂThis will
>> Â simplify the call sites quite a bit. ÂMainly, it will remove the
>> Â unnecessary arguments T and A that are now always specified in
>> Â every call.
>>
>> 2- Change VEC_index into operator[].
>>
>> 3- Change VEC_replace(...) to assignments using operator[].
>
> I think these should not be done for now - they merely add syntactic
> sugar, no?
>
>> One thing these changes will do, however, is lose the VEC_CHECK_*
>> expansions that add the __FILE__, __LINE__ and __FUNCTION__ arguments
>> to the VEC_*() functions.
>>
>> To deal with this loss, we could unwind the call stack a few levels on
>> ICEs. ÂIn fact, I think this could be a good thing to add to ICEs in
>> general. ÂShowing some functions up the stack seems more useful than
>> just showing a single point.
>>
>> OK for cxx-conversion branch?
>
> Where's the gengtype/GC bits?
>
> Richard.
>
>>
>>
>> 2012-05-22 Â Diego Novillo Â<dnovillo@google.com>
>>
>> Â Â Â ÂRe-implement VEC in C++.
>>
>> Â Â Â Â* vec.c (vec_heap_free): Convert into a template function.
>> Â Â Â Â(vec_gc_o_reserve_1): Make extern.
>> Â Â Â Â(vec_gc_p_reserve): Remove.
>> Â Â Â Â(vec_gc_p_reserve_exact): Remove.
>> Â Â Â Â(vec_gc_o_reserve): Remove.
>> Â Â Â Â(vec_gc_o_reserve_exact): Remove.
>> Â Â Â Â(vec_heap_o_reserve_1): Make extern.
>> Â Â Â Â(vec_heap_p_reserve): Remove.
>> Â Â Â Â(vec_heap_p_reserve_exact): Remove.
>> Â Â Â Â(vec_heap_o_reserve): Remove.
>> Â Â Â Â(vec_heap_o_reserve_exact): Remove.
>> Â Â Â Â(vec_stack_p_reserve): Remove.
>> Â Â Â Â(vec_stack_p_reserve_exact): Remove.
>> Â Â Â Â* vec.h (VEC_CHECK_INFO, VEC_CHECK_DECL, VEC_CHECK_PASS,
>> Â Â Â ÂVEC_ASSERT, VEC_ASSERT_FAIL, vec_assert_fail): Move earlier
>> Â Â Â Âin the file.
>> Â Â Â Â(VEC): Define to vec_t<T>.
>> Â Â Â Â(vec_allocation_t): Define.
>> Â Â Â Â(struct vec_prefix): Move earlier in the file.
>> Â Â Â Â(vec_t<T>): New template.
>> Â Â Â Â(DEF_VEC_I, DEF_VECL_ALLOC_I, DEF_VEC_P, DEF_VEC_ALLOC_P,
>> Â Â Â ÂDEF_VEC_O, DEF_VEC_ALLOC_P, DEF_VEC_O, DEF_VEC_ALLOC_O,
>> Â Â Â ÂDEF_VEC_ALLOC_P_STACK, DEF_VEC_ALLOC_O_STACK,
>> Â Â Â ÂDEF_VEC_ALLOC_I_STACK): Expand to 'struct vec_swallow_trailing_semi'.
>> Â Â Â Â(vec_stack_p_reserve): Remove.
>> Â Â Â Â(vec_stack_p_reserve_exact): Remove.
>> Â Â Â Â(vec_stack_p_reserve_exact_1): Remove.
>> Â Â Â Â(vec_stack_o_reserve): Remove.
>> Â Â Â Â(vec_stack_o_reserve_exact): Remove.
>> Â Â Â Â(vec_stack_free): Re-write as a template function.
>> Â Â Â Â(vec_reserve): New template function.
>> Â Â Â Â(vec_reserve_exact): New template function.
>> Â Â Â Â(vec_heap_free): New template function if GATHER_STATISTICS is
>> Â Â Â Âdefined. ÂOtherwise, macro that expands to free().
>> Â Â Â Â(VEC_length_1): New template function.
>> Â Â Â Â(VEC_length): Call it.
>> Â Â Â Â(VEC_empty_1): New template function.
>> Â Â Â Â(VEC_empty): Call it.
>> Â Â Â Â(VEC_address_1): New template function.
>> Â Â Â Â(VEC_address): Call it.
>> Â Â Â Â(VEC_last_1): New template function.
>> Â Â Â Â(VEC_last): Call it. ÂChange return type to T&.
>> Â Â Â ÂChange all users that used VEC_Os.
>> Â Â Â Â(VEC_index_1): New template function.
>> Â Â Â Â(VEC_index): Call it. ÂReturn a T& instead of a T*.
>> Â Â Â ÂUpdate all callers that were using VEC_O before.
>> Â Â Â Â(VEC_iterate_1): New template function.
>> Â Â Â Â(VEC_iterate): Call it.
>> Â Â Â Â(VEC_embedded_size_1): New template function.
>> Â Â Â Â(VEC_embedded_size): Call it.
>> Â Â Â Â(VEC_embedded_init_1): New template function.
>> Â Â Â Â(VEC_embedded_init): Call it.
>> Â Â Â Â(VEC_alloc_1): New template function.
>> Â Â Â Â(VEC_alloc): Call it. ÂIf A is 'stack', call XALLOCAVAR to
>> Â Â Â Âdo the allocation.
>> Â Â Â Â(VEC_free_1): New template function.
>> Â Â Â Â(VEC_free): Call it.
>> Â Â Â Â(VEC_copy_1): New template function.
>> Â Â Â Â(VEC_copy): Call it.
>> Â Â Â Â(VEC_space_1): New template function
>> Â Â Â Â(VEC_space): Call it.
>> Â Â Â Â(VEC_reserve_1): New template function.
>> Â Â Â Â(VEC_reserve): Call it.
>> Â Â Â Â(VEC_reserve_exact_1): New template function.
>> Â Â Â Â(VEC_reserve_exact): Call it.
>> Â Â Â Â(VEC_splice_1): New template function.
>> Â Â Â Â(VEC_splice): Call it.
>> Â Â Â Â(VEC_safe_splice_1): New template function.
>> Â Â Â Â(VEC_safe_splice): Call it.
>> Â Â Â Â(VEC_quick_push_1): New template function. ÂCreate two overloads, one
>> Â Â Â Âaccepting T, the other accepting T *. ÂUpdate all callers
>> Â Â Â Âwhere T and T * are ambiguous.
>> Â Â Â Â(VEC_quick_push): Call it.
>> Â Â Â Â(VEC_safe_push_1): New template function. Create two overloads, one
>> Â Â Â Âaccepting T, the other accepting T *. ÂUpdate all callers
>> Â Â Â Âwhere T and T * are ambiguous.
>> Â Â Â Â(VEC_safe_push): Call it.
>> Â Â Â Â(VEC_pop_1): New template function.
>> Â Â Â Â(VEC_pop): Call it.
>> Â Â Â Â(VEC_truncate_1): New template function.
>> Â Â Â Â(VEC_truncate): Call it.
>> Â Â Â Â(VEC_safe_grow_1): New template function.
>> Â Â Â Â(VEC_safe_grow): Call it.
>> Â Â Â Â(VEC_safe_grow_cleared_1): New template function.
>> Â Â Â Â(VEC_safe_grow_cleared): Call it.
>> Â Â Â Â(VEC_replace_1): New template function.
>> Â Â Â Â(VEC_replace): Call it. ÂAlways accept T instead of T*.
>> Â Â Â ÂUpdate all callers that used VEC_Os.
>> Â Â Â Â(VEC_quick_insert_1): New template function.
>> Â Â Â Â(VEC_quick_insert): Call it.
>> Â Â Â Â(VEC_safe_insert_1): New template function.
>> Â Â Â Â(VEC_safe_insert): Call it.
>> Â Â Â Â(VEC_ordered_remove_1): New template function.
>> Â Â Â Â(VEC_ordered_remove): Call it.
>> Â Â Â Â(VEC_unordered_remove_1): New template function.
>> Â Â Â Â(VEC_unordered_remove): Call it.
>> Â Â Â Â(VEC_block_remove_1): New template function.
>> Â Â Â Â(VEC_block_remove): Call it.
>> Â Â Â Â(VEC_lower_bound_1): New template function.
>> Â Â Â Â(VEC_lower_bound): Call it.
>> Â Â Â Â(VEC_OP): Remove.
>> Â Â Â Â(DEF_VEC_FUNC_P): Remove.
>> Â Â Â Â(DEF_VEC_ALLOC_FUNC_P): Remove.
>> Â Â Â Â(DEF_VEC_NONALLOC_FUNCS_P): Remove.
>> Â Â Â Â(DEF_VEC_FUNC_O): Remove.
>> Â Â Â Â(DEF_VEC_ALLOC_FUNC_O): Remove.
>> Â Â Â Â(DEF_VEC_NONALLOC_FUNCS_O): Remove.
>> Â Â Â Â(DEF_VEC_ALLOC_FUNC_I): Remove.
>> Â Â Â Â(DEF_VEC_NONALLOC_FUNCS_I): Remove.
>> Â Â Â Â(DEF_VEC_ALLOC_FUNC_P_STACK): Remove.
>> Â Â Â Â(DEF_VEC_ALLOC_FUNC_O_STACK): Remove.
>> Â Â Â Â(DEF_VEC_ALLOC_FUNC_I_STACK): Remove.
>> Â Â Â Â(vec_reserve_exact): New template function.
>>
>> diff --git a/gcc/vec.c b/gcc/vec.c
>> index 783a3cf..ba81e35 100644
>> --- a/gcc/vec.c
>> +++ b/gcc/vec.c
>> @@ -1,7 +1,8 @@
>> Â/* Vector API for GNU compiler.
>> - Â Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010
>> + Â Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2012
>> Â ÂFree Software Foundation, Inc.
>> Â ÂContributed by Nathan Sidwell <nathan@codesourcery.com>
>> + Â Re-implemented in C++ by Diego Novillo <dnovillo@google.com>
>>
>> ÂThis file is part of GCC.
>>
>> @@ -215,7 +216,7 @@ calculate_allocation (const struct vec_prefix *pfx, int reserve, bool exact)
>> Â Âtrailing array is at VEC_OFFSET offset and consists of ELT_SIZE
>> Â Âsized elements. Â*/
>>
>> -static void *
>> +void *
>> Âvec_gc_o_reserve_1 (void *vec, int reserve, size_t vec_offset, size_t elt_size,
>> Â Â Â Â Â Â Â Â Â Âbool exact MEM_STAT_DECL)
>> Â{
>> @@ -248,61 +249,10 @@ vec_gc_o_reserve_1 (void *vec, int reserve, size_t vec_offset, size_t elt_size,
>> Â return vec;
>> Â}
>>
>> -/* Ensure there are at least RESERVE free slots in VEC, growing
>> - Â exponentially. ÂIf RESERVE < 0 grow exactly, else grow
>> - Â exponentially. ÂAs a special case, if VEC is NULL, and RESERVE is
>> - Â 0, no vector will be created. */
>> -
>> -void *
>> -vec_gc_p_reserve (void *vec, int reserve MEM_STAT_DECL)
>> -{
>> - Âreturn vec_gc_o_reserve_1 (vec, reserve,
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (struct vec_prefix),
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (void *), false
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>> -
>> -/* Ensure there are at least RESERVE free slots in VEC, growing
>> - Â exactly. ÂIf RESERVE < 0 grow exactly, else grow exponentially. ÂAs
>> - Â a special case, if VEC is NULL, and RESERVE is 0, no vector will be
>> - Â created. */
>> -
>> -void *
>> -vec_gc_p_reserve_exact (void *vec, int reserve MEM_STAT_DECL)
>> -{
>> - Âreturn vec_gc_o_reserve_1 (vec, reserve,
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (struct vec_prefix),
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (void *), true
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>> -
>> -/* As for vec_gc_p_reserve, but for object vectors. ÂThe vector's
>> - Â trailing array is at VEC_OFFSET offset and consists of ELT_SIZE
>> - Â sized elements. Â*/
>> -
>> -void *
>> -vec_gc_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size
>> - Â Â Â Â Â Â Â Â MEM_STAT_DECL)
>> -{
>> - Âreturn vec_gc_o_reserve_1 (vec, reserve, vec_offset, elt_size, false
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>> -
>> -/* As for vec_gc_p_reserve_exact, but for object vectors. ÂThe
>> - Â vector's trailing array is at VEC_OFFSET offset and consists of
>> - Â ELT_SIZE sized elements. Â*/
>> -
>> -void *
>> -vec_gc_o_reserve_exact (void *vec, int reserve, size_t vec_offset,
>> - Â Â Â Â Â Â Â Â Â Â Â size_t elt_size MEM_STAT_DECL)
>> -{
>> - Âreturn vec_gc_o_reserve_1 (vec, reserve, vec_offset, elt_size, true
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>>
>> Â/* As for vec_gc_o_reserve_1, but for heap allocated vectors. Â*/
>>
>> -static void *
>> +void *
>> Âvec_heap_o_reserve_1 (void *vec, int reserve, size_t vec_offset,
>> Â Â Â Â Â Â Â Â Â Â Âsize_t elt_size, bool exact MEM_STAT_DECL)
>> Â{
>> @@ -334,47 +284,6 @@ vec_heap_o_reserve_1 (void *vec, int reserve, size_t vec_offset,
>> Â return vec;
>> Â}
>>
>> -/* As for vec_gc_p_reserve, but for heap allocated vectors. Â*/
>> -
>> -void *
>> -vec_heap_p_reserve (void *vec, int reserve MEM_STAT_DECL)
>> -{
>> - Âreturn vec_heap_o_reserve_1 (vec, reserve,
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (struct vec_prefix),
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (void *), false
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>> -
>> -/* As for vec_gc_p_reserve_exact, but for heap allocated vectors. Â*/
>> -
>> -void *
>> -vec_heap_p_reserve_exact (void *vec, int reserve MEM_STAT_DECL)
>> -{
>> - Âreturn vec_heap_o_reserve_1 (vec, reserve,
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (struct vec_prefix),
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (void *), true
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>> -
>> -/* As for vec_gc_o_reserve, but for heap allocated vectors. Â*/
>> -
>> -void *
>> -vec_heap_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size
>> - Â Â Â Â Â Â Â Â Â MEM_STAT_DECL)
>> -{
>> - Âreturn vec_heap_o_reserve_1 (vec, reserve, vec_offset, elt_size, false
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>> -
>> -/* As for vec_gc_o_reserve_exact, but for heap allocated vectors. Â*/
>> -
>> -void *
>> -vec_heap_o_reserve_exact (void *vec, int reserve, size_t vec_offset,
>> - Â Â Â Â Â Â Â Â Â Â Â Â size_t elt_size MEM_STAT_DECL)
>> -{
>> - Âreturn vec_heap_o_reserve_1 (vec, reserve, vec_offset, elt_size, true
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> -}
>>
>> Â/* Stack vectors are a little different. ÂVEC_alloc turns into a call
>> Â Âto vec_stack_p_reserve_exact1 and passes in space allocated via a
>> @@ -456,28 +365,6 @@ vec_stack_o_reserve_1 (void *vec, int reserve, size_t vec_offset,
>> Â/* Grow a vector allocated on the stack. Â*/
>>
>> Âvoid *
>> -vec_stack_p_reserve (void *vec, int reserve MEM_STAT_DECL)
>> -{
>> - Âreturn vec_stack_o_reserve_1 (vec, reserve,
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (struct vec_prefix),
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (void *), false
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PASS_MEM_STAT);
>> -}
>> -
>> -/* Exact version of vec_stack_p_reserve. Â*/
>> -
>> -void *
>> -vec_stack_p_reserve_exact (void *vec, int reserve MEM_STAT_DECL)
>> -{
>> - Âreturn vec_stack_o_reserve_1 (vec, reserve,
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (struct vec_prefix),
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (void *), true
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PASS_MEM_STAT);
>> -}
>> -
>> -/* Like vec_stack_p_reserve, but for objects. Â*/
>> -
>> -void *
>> Âvec_stack_o_reserve (void *vec, int reserve, size_t vec_offset,
>> Â Â Â Â Â Â Â Â Â Â size_t elt_size MEM_STAT_DECL)
>> Â{
>> @@ -485,7 +372,7 @@ vec_stack_o_reserve (void *vec, int reserve, size_t vec_offset,
>> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> Â}
>>
>> -/* Like vec_stack_p_reserve_exact, but for objects. Â*/
>> +/* Exact version of vec_stack_o_reserve. Â*/
>>
>> Âvoid *
>> Âvec_stack_o_reserve_exact (void *vec, int reserve, size_t vec_offset,
>> diff --git a/gcc/vec.h b/gcc/vec.h
>> index d477958..cc7e819 100644
>> --- a/gcc/vec.h
>> +++ b/gcc/vec.h
>> @@ -1,7 +1,8 @@
>> Â/* Vector API for GNU compiler.
>> - Â Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010
>> + Â Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012
>> Â ÂFree Software Foundation, Inc.
>> Â ÂContributed by Nathan Sidwell <nathan@codesourcery.com>
>> + Â Re-implemented in C++ by Diego Novillo <dnovillo@google.com>
>>
>> ÂThis file is part of GCC.
>>
>> @@ -133,6 +134,86 @@ along with GCC; see the file COPYING3. ÂIf not see
>>
>> Â*/
>>
>> +#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
>> +
>> +#define VEC(T,A) vec_t<T>
>> +
>> +enum vec_allocation_t { heap, gc, stack };
>> +
>> +struct GTY(()) vec_prefix
>> +{
>> + Âunsigned num;
>> + Âunsigned alloc;
>> +};
>> +
>> +/* Vector type, user visible. Â*/
>> +template<typename T>
>> +struct GTY(()) vec_t
>> +{
>> + Âvec_prefix prefix;
>> + ÂT GTY((length ("%h.prefix.num"))) vec[1];
>> +};
>> +
>> +/* FIXME cxx-conversion. ÂRemove these definitions and update all
>> + Â calling sites. Â*/
>> +/* Vector of integer-like object. Â*/
>> +#define DEF_VEC_I(T) Â Â Â Â Â Â Â Â Â struct vec_swallow_trailing_semi
>> +#define DEF_VEC_ALLOC_I(T,A) Â Â Â Â Â struct vec_swallow_trailing_semi
>> +
>> +/* Vector of pointer to object. Â*/
>> +#define DEF_VEC_P(T) Â Â Â Â Â Â Â Â Â struct vec_swallow_trailing_semi
>> +#define DEF_VEC_ALLOC_P(T,A) Â Â Â Â Â struct vec_swallow_trailing_semi
>> +
>> +/* Vector of object. Â*/
>> +#define DEF_VEC_O(T) Â Â Â Â Â Â Â Â Â struct vec_swallow_trailing_semi
>> +#define DEF_VEC_ALLOC_O(T,A) Â Â Â Â Â struct vec_swallow_trailing_semi
>> +
>> +/* Vectors on the stack. Â*/
>> +#define DEF_VEC_ALLOC_P_STACK(T) Â Â Â struct vec_swallow_trailing_semi
>> +#define DEF_VEC_ALLOC_O_STACK(T) Â Â Â struct vec_swallow_trailing_semi
>> +#define DEF_VEC_ALLOC_I_STACK(T) Â Â Â struct vec_swallow_trailing_semi
>> +
>> +
>> +/* Support functions for stack vectors. Â*/
>> +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 *);
>> +
>> +/* Reallocate an array of elements with prefix. Â*/
>> +template<typename T, enum vec_allocation_t A>
>> +extern vec_t<T> *vec_reserve (vec_t<T> *, int MEM_STAT_DECL);
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +extern vec_t<T> *vec_reserve_exact (vec_t<T> *, int MEM_STAT_DECL);
>> +
>> +extern void dump_vec_loc_statistics (void);
>> +extern void ggc_free (void *);
>> +#ifdef GATHER_STATISTICS
>> +void vec_heap_free (void *);
>> +#else
>> +/* Avoid problems with frontends that #define free(x). Â*/
>> +#define vec_heap_free(V) (free) (V)
>> +#endif
>> +
>> +
>> Â/* 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,
>> @@ -147,7 +228,14 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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)))
>> +#define VEC_length(T,V) Â Â Â Â(VEC_length_1<T> (V))
>> +
>> +template<typename T>
>> +static inline unsigned
>> +VEC_length_1 (const vec_t<T> *vec_)
>> +{
>> + Âreturn vec_ ? vec_->prefix.num : 0;
>> +}
>>
>>
>> Â/* Check if vector is empty
>> @@ -155,7 +243,30 @@ along with GCC; see the file COPYING3. ÂIf not see
>>
>> Â ÂReturn nonzero if V is an empty vector (or V is NULL), zero otherwise. Â*/
>>
>> -#define VEC_empty(T,V) (VEC_length (T,V) == 0)
>> +#define VEC_empty(T,V) (VEC_empty_1<T> (V))
>> +
>> +template<typename T>
>> +static inline bool
>> +VEC_empty_1 (const vec_t<T> *vec_)
>> +{
>> + Âreturn VEC_length (T, vec_) == 0;
>> +}
>> +
>> +
>> +/* 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_address_1<T> (V))
>> +
>> +template<typename T>
>> +static inline T *
>> +VEC_address_1 (vec_t<T> *vec_)
>> +{
>> + Âreturn vec_ ? vec_->vec : 0;
>> +}
>>
>>
>> Â/* Get the final element of the vector.
>> @@ -165,16 +276,42 @@ along with GCC; see the file COPYING3. ÂIf not see
>>
>> Â Â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))
>> +#define VEC_last(T,V) Â(VEC_last_1<T> (V VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline T&
>> +VEC_last_1 (vec_t<T> *vec_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (vec_ && vec_->prefix.num, "last", T, base);
>> + Âreturn vec_->vec[vec_->prefix.num - 1];
>> +}
>> +
>>
>> Â/* 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. Â*/
>> + Â Return the IX'th element. ÂIX must be in the domain of V. Â*/
>> +
>> +#define VEC_index(T,V,I) (VEC_index_1<T> (V, I VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline T&
>> +VEC_index_1 (vec_t<T> *vec_, unsigned ix_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (vec_ && ix_ < vec_->prefix.num, "index", T, base);
>> + Âreturn vec_->vec[ix_];
>> +}
>> +
>> +template<typename T>
>> +static inline const T&
>> +VEC_index_1 (const vec_t<T> *vec_, unsigned ix_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (vec_ && ix_ < vec_->prefix.num, "index", T, base);
>> + Âreturn vec_->vec[ix_];
>> +}
>>
>> -#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
>> @@ -188,7 +325,39 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â Â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)))
>> +#define VEC_iterate(T,V,I,P) Â (VEC_iterate_1<T> (V, I, &(P)))
>> +
>> +template<typename T>
>> +static inline bool
>> +VEC_iterate_1 (const vec_t<T> *vec_, unsigned ix_, T *ptr)
>> +{
>> + Âif (vec_ && ix_ < vec_->prefix.num)
>> + Â Â{
>> + Â Â Â*ptr = vec_->vec[ix_];
>> + Â Â Âreturn true;
>> + Â Â}
>> + Âelse
>> + Â Â{
>> + Â Â Â*ptr = 0;
>> + Â Â Âreturn false;
>> + Â Â}
>> +}
>> +
>> +template<typename T>
>> +static inline bool
>> +VEC_iterate_1 (vec_t<T> *vec_, unsigned ix_, T **ptr)
>> +{
>> + Âif (vec_ && ix_ < vec_->prefix.num)
>> + Â Â{
>> + Â Â Â*ptr = &vec_->vec[ix_];
>> + Â Â Âreturn true;
>> + Â Â}
>> + Âelse
>> + Â Â{
>> + Â Â Â*ptr = 0;
>> + Â Â Âreturn false;
>> + Â Â}
>> +}
>>
>> Â/* Convenience macro for forward iteration. Â*/
>>
>> @@ -207,31 +376,99 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â Â ÂVEC_iterate (T, (V), (I), (P)); Â \
>> Â Â Â Â(I)--)
>>
>> +
>> +/* 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_embedded_size_1<T> (N))
>> +
>> +template<typename T>
>> +static inline size_t
>> +VEC_embedded_size_1 (int alloc_)
>> +{
>> + Âreturn offsetof (vec_t<T>, vec) + alloc_ * sizeof (T);
>> +}
>> +
>> +#define VEC_embedded_init(T,O,N) (VEC_embedded_init_1<T> (O, N))
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_embedded_init_1 (vec_t<T> *vec_, int alloc_)
>> +{
>> + Âvec_->prefix.num = 0;
>> + Âvec_->prefix.alloc = alloc_;
>> +}
>> +
>> +
>> Â/* 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. Â*/
>> + Â is zero, NO vector is created.
>> +
>> + Â 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. ÂIn the case of stack vectors, VEC_alloc will
>> + Â expand to a call to VEC_alloc_1 that calls XALLOCAVAR to request the
>> + Â initial allocation. ÂThis uses alloca to get the initial space.
>> + Â Since alloca can not be usefully called in an inline function,
>> + Â VEC_alloc must always be a macro.
>> +
>> + Â 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. Â*/
>> +
>> +#define VEC_alloc(T,A,N) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> + Â((A == stack) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> + Â Â? VEC_alloc_1 (N, Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> + Â Â Â Â Â Â Â Â ÂXALLOCAVAR (vec_t<T>, Â Â Â Â Â Â Â Â Â Â Â Â\
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂVEC_embedded_size_1<T> (N))) Â Â \
>> + Â Â: VEC_alloc_1<T, A> (N MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline vec_t<T> *
>> +VEC_alloc_1 (int alloc_ MEM_STAT_DECL)
>> +{
>> + Âreturn vec_reserve_exact<T, A> (NULL, alloc_ PASS_MEM_STAT);
>> +}
>> +
>> +template<typename T>
>> +static inline vec_t<T> *
>> +VEC_alloc_1 (int alloc_, vec_t<T> *space)
>> +{
>> + Âreturn (vec_t<T> *) vec_stack_p_reserve_exact_1 (alloc_, space);
>> +}
>>
>> -#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).
>> +#define VEC_free(T,A,V) Â Â Â Â Â Â Â Â(VEC_free_1<T, A> (&V))
>>
>> - Â 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. Â*/
>> +template<typename T, enum vec_allocation_t A>
>> +static inline void
>> +VEC_free_1 (vec_t<T> **vec_)
>> +{
>> + Âif (*vec_)
>> + Â Â{
>> + Â Â Âif (A == heap)
>> + Â Â Â vec_heap_free (*vec_);
>> + Â Â Âelse if (A == gc)
>> + Â Â Â ggc_free (*vec_);
>> + Â Â Âelse if (A == stack)
>> + Â Â Â vec_stack_free (*vec_);
>> + Â Â}
>> + Â*vec_ = NULL;
>> +}
>>
>> -#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) *);
>> @@ -239,7 +476,24 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> +#define VEC_copy(T,A,V) (VEC_copy_1<T, A> (V MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline vec_t<T> *
>> +VEC_copy_1 (vec_t<T> *vec_ MEM_STAT_DECL)
>> +{
>> + Âsize_t len_ = vec_ ? vec_->prefix.num : 0;
>> + Âvec_t<T> *new_vec_ = NULL;
>> +
>> + Âif (len_)
>> + Â Â{
>> + Â Â Ânew_vec_ = vec_reserve_exact<T, A> (NULL, len_ PASS_MEM_STAT);
>> + Â Â Ânew_vec_->prefix.num = len_;
>> + Â Â Âmemcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_);
>> + Â Â}
>> + Âreturn new_vec_;
>> +}
>> +
>>
>> Â/* Determine if a vector has additional capacity.
>>
>> @@ -251,8 +505,18 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> +#define VEC_space(T,V,R) Â Â Â (VEC_space_1<T> (V, R VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline int
>> +VEC_space_1 (vec_t<T> *vec_, int alloc_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (alloc_ >= 0, "space", T, base);
>> + Âreturn vec_
>> + Â Â Â Â? vec_->prefix.alloc - vec_->prefix.num >= (unsigned)alloc_
>> + Â Â Â Â: !alloc_;
>> +}
>> +
>>
>> Â/* Reserve space.
>> Â Âint VEC_T_A_reserve(VEC(T,A) *&v, int reserve);
>> @@ -263,7 +527,20 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Âoccurred. Â*/
>>
>> Â#define VEC_reserve(T,A,V,R) Â \
>> - Â Â Â (VEC_OP(T,A,reserve)(&(V),R VEC_CHECK_INFO MEM_STAT_INFO))
>> + Â Â Â (VEC_reserve_1<T, A> (&(V), (int)(R) VEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline int
>> +VEC_reserve_1 (vec_t<T> **vec_, int alloc_ ÂVEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + Âint extend = !VEC_space_1 (*vec_, alloc_ VEC_CHECK_PASS);
>> +
>> + Âif (extend)
>> + Â Â*vec_ = vec_reserve<T, A> (*vec_, alloc_ PASS_MEM_STAT);
>> +
>> + Âreturn extend;
>> +}
>> +
>>
>> Â/* Reserve space exactly.
>> Â Âint VEC_T_A_reserve_exact(VEC(T,A) *&v, int reserve);
>> @@ -274,7 +551,20 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Âoccurred. Â*/
>>
>> Â#define VEC_reserve_exact(T,A,V,R) Â Â \
>> - Â Â Â (VEC_OP(T,A,reserve_exact)(&(V),R VEC_CHECK_INFO MEM_STAT_INFO))
>> + Â Â Â (VEC_reserve_exact_1<T, A> (&(V), R VEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline int
>> +VEC_reserve_exact_1 (vec_t<T> **vec_, int alloc_ VEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + Âint extend = !VEC_space_1 (*vec_, alloc_ VEC_CHECK_PASS);
>> +
>> + Âif (extend)
>> + Â Â*vec_ = vec_reserve_exact<T, A> (*vec_, alloc_ PASS_MEM_STAT);
>> +
>> + Âreturn extend;
>> +}
>> +
>>
>> Â/* Copy elements with no reallocation
>> Â Âvoid VEC_T_splice (VEC(T) *dst, VEC(T) *src); // Integer
>> @@ -286,8 +576,23 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Âoften will be. ÂDST is assumed to have sufficient headroom
>> Â Âavailable. Â*/
>>
>> -#define VEC_splice(T,DST,SRC) Â Â Â Â Â Â Â Â Â\
>> - Â(VEC_OP(T,base,splice)(VEC_BASE(DST), VEC_BASE(SRC) VEC_CHECK_INFO))
>> +#define VEC_splice(T,DST,SRC) Â(VEC_splice_1<T> (DST, SRC VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_splice_1 (vec_t<T> *dst_, vec_t<T> *src_ VEC_CHECK_DECL)
>> +{
>> + Âif (src_)
>> + Â Â{
>> + Â Â Âunsigned len_ = src_->prefix.num;
>> + Â Â ÂVEC_ASSERT (dst_->prefix.num + len_ <= dst_->prefix.alloc, "splice",
>> + Â Â Â Â Â Â Â Â T, base);
>> +
>> + Â Â Âmemcpy (&dst_->vec[dst_->prefix.num], &src_->vec[0], len_ * sizeof (T));
>> + Â Â Âdst_->prefix.num += len_;
>> + Â Â}
>> +}
>> +
>>
>> Â/* Copy elements with reallocation
>> Â Âvoid VEC_T_safe_splice (VEC(T,A) *&dst, VEC(T) *src); // Integer
>> @@ -300,7 +605,21 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Âreallocated if needed. Â*/
>>
>> Â#define VEC_safe_splice(T,A,DST,SRC) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â(VEC_OP(T,A,safe_splice)(&(DST), VEC_BASE(SRC) VEC_CHECK_INFO MEM_STAT_INFO))
>> + Â Â Â (VEC_safe_splice_1<T, A> (&(DST), SRC VEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline void
>> +VEC_safe_splice_1 (vec_t<T> **dst_, vec_t<T> *src_ VEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + Âif (src_)
>> + Â Â{
>> + Â Â ÂVEC_reserve_exact_1<T, A> (dst_, src_->prefix.num
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂVEC_CHECK_PASS MEM_STAT_INFO);
>> +
>> + Â Â ÂVEC_splice_1 (*dst_, src_ VEC_CHECK_PASS);
>> + Â Â}
>> +}
>> +
>>
>> Â/* Push object with no reallocation
>> Â ÂT *VEC_T_quick_push (VEC(T) *v, T obj); // Integer
>> @@ -312,8 +631,31 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> +#define VEC_quick_push(T,V,O) Â(VEC_quick_push_1<T> (V, O VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline T &
>> +VEC_quick_push_1 (vec_t<T> *vec_, T obj_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (vec_->prefix.num < vec_->prefix.alloc, "push", T, base);
>> + Âvec_->vec[vec_->prefix.num] = obj_;
>> + ÂT &val_ = vec_->vec[vec_->prefix.num];
>> + Âvec_->prefix.num++;
>> + Âreturn val_;
>> +}
>> +
>> +template<typename T>
>> +static inline T *
>> +VEC_quick_push_1 (vec_t<T> *vec_, const T *ptr_ VEC_CHECK_DECL)
>> +{
>> + ÂT *slot_;
>> + ÂVEC_ASSERT (vec_->prefix.num < vec_->prefix.alloc, "push", T, base);
>> + Âslot_ = &vec_->vec[vec_->prefix.num++];
>> + Âif (ptr_)
>> + Â Â*slot_ = *ptr_;
>> + Âreturn slot_;
>> +}
>> +
>>
>> Â/* Push object with reallocation
>> Â ÂT *VEC_T_A_safe_push (VEC(T,A) *&v, T obj); // Integer
>> @@ -325,7 +667,24 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> + Â Â Â (VEC_safe_push_1<T, A> (&(V), O VEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline T &
>> +VEC_safe_push_1 (vec_t<T> **vec_, T obj_ VEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + ÂVEC_reserve_1<T, A> (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);
>> + Âreturn VEC_quick_push_1 (*vec_, obj_ VEC_CHECK_PASS);
>> +}
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline T *
>> +VEC_safe_push_1 (vec_t<T> **vec_, const T *ptr_ VEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + ÂVEC_reserve_1<T, A> (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);
>> + Âreturn VEC_quick_push_1 (*vec_, ptr_ VEC_CHECK_PASS);
>> +}
>> +
>>
>> Â/* Pop element off end
>> Â ÂT VEC_T_pop (VEC(T) *v); Â Â Â Â Â Â// Integer
>> @@ -335,7 +694,16 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> +#define VEC_pop(T,V) Â (VEC_pop_1<T> (V VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline T&
>> +VEC_pop_1 (vec_t<T> *vec_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (vec_->prefix.num, "pop", T, base);
>> + Âreturn vec_->vec[--vec_->prefix.num];
>> +}
>> +
>>
>> Â/* Truncate to specific length
>> Â Âvoid VEC_T_truncate (VEC(T) *v, unsigned len);
>> @@ -343,8 +711,18 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> +#define VEC_truncate(T,V,I) Â Â\
>> + Â Â Â (VEC_truncate_1<T> (V, (unsigned)(I) VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_truncate_1 (vec_t<T> *vec_, unsigned size_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (vec_ ? vec_->prefix.num >= size_ : !size_, "truncate", T, base);
>> + Âif (vec_)
>> + Â Âvec_->prefix.num = size_;
>> +}
>> +
>>
>> Â/* Grow to a specific length.
>> Â Âvoid VEC_T_A_safe_grow (VEC(T,A) *&v, int len);
>> @@ -354,7 +732,20 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Âuninitialized. Â*/
>>
>> Â#define VEC_safe_grow(T,A,V,I) Â Â Â Â \
>> - Â Â Â (VEC_OP(T,A,safe_grow)(&(V),I VEC_CHECK_INFO MEM_STAT_INFO))
>> + Â Â Â (VEC_safe_grow_1<T, A> (&(V), (int)(I) VEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline void
>> +VEC_safe_grow_1 (vec_t<T> **vec_, int size_ VEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + ÂVEC_ASSERT (size_ >= 0 && VEC_length (T, *vec_) <= (unsigned)size_,
>> + Â Â Â Â Â Â "grow", T, A);
>> + ÂVEC_reserve_exact_1<T, A> (vec_,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Âsize_ - (int)(*vec_ ? (*vec_)->prefix.num : 0)
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â ÂVEC_CHECK_PASS PASS_MEM_STAT);
>> + Â(*vec_)->prefix.num = size_;
>> +}
>> +
>>
>> Â/* Grow to a specific length.
>> Â Âvoid VEC_T_A_safe_grow_cleared (VEC(T,A) *&v, int len);
>> @@ -363,8 +754,21 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> +#define VEC_safe_grow_cleared(T,A,V,I) Â Â Â Â Â Â Â Â \
>> + Â Â Â (VEC_safe_grow_cleared_1<T,A> (&(V), (int)(I) Â \
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂVEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline void
>> +VEC_safe_grow_cleared_1 (vec_t<T> **vec_, int size_ VEC_CHECK_DECL
>> + Â Â Â Â Â Â Â Â Â Â Â ÂMEM_STAT_DECL)
>> +{
>> + Âint oldsize = VEC_length (T, *vec_);
>> + ÂVEC_safe_grow_1<T, A> (vec_, size_ VEC_CHECK_PASS PASS_MEM_STAT);
>> + Âmemset (&(VEC_address (T, *vec_)[oldsize]), 0,
>> + Â Â Â Â sizeof (T) * (size_ - oldsize));
>> +}
>> +
>>
>> Â/* Replace element
>> Â ÂT VEC_T_replace (VEC(T) *v, unsigned ix, T val); // Integer
>> @@ -378,20 +782,57 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Âperformed. Â*/
>>
>> Â#define VEC_replace(T,V,I,O) Â Â Â Â Â \
>> - Â Â Â (VEC_OP(T,base,replace)(VEC_BASE(V),I,O VEC_CHECK_INFO))
>> + Â Â Â (VEC_replace_1<T> (V, (unsigned)(I), O VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline T&
>> +VEC_replace_1 (vec_t<T> *vec_, unsigned ix_, T obj_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (ix_ < vec_->prefix.num, "replace", T, base);
>> + Âvec_->vec[ix_] = obj_;
>> + Âreturn vec_->vec[ix_];
>> +}
>> +
>>
>> Â/* 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
>> + Â void VEC_T_quick_insert (VEC(T) *v, unsigned ix, T val); // Integer
>> + Â void VEC_T_quick_insert (VEC(T) *v, unsigned ix, T val); // Pointer
>> + Â void 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. Â*/
>> + Â Insert an element, VAL, at the IXth position of V. Â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))
>> + Â Â Â (VEC_quick_insert_1<T> (V,I,O VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_quick_insert_1 (vec_t<T> *vec_, unsigned ix_, T obj_ VEC_CHECK_DECL)
>> +{
>> + ÂT *slot_;
>> +
>> + ÂVEC_ASSERT (vec_->prefix.num < vec_->prefix.alloc, "insert", T, base);
>> + ÂVEC_ASSERT (ix_ <= vec_->prefix.num, "insert", T, base);
>> + Âslot_ = &vec_->vec[ix_];
>> + Âmemmove (slot_ + 1, slot_, (vec_->prefix.num++ - ix_) * sizeof (T));
>> + Â*slot_ = obj_;
>> +}
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_quick_insert_1 (vec_t<T> *vec_, unsigned ix_, const T *ptr_ VEC_CHECK_DECL)
>> +{
>> + ÂT *slot_;
>> +
>> + ÂVEC_ASSERT (vec_->prefix.num < vec_->prefix.alloc, "insert", T, base);
>> + ÂVEC_ASSERT (ix_ <= vec_->prefix.num, "insert", T, base);
>> + Âslot_ = &vec_->vec[ix_];
>> + Âmemmove (slot_ + 1, slot_, (vec_->prefix.num++ - ix_) * sizeof (T));
>> + Âif (ptr_)
>> + Â Â*slot_ = *ptr_;
>> +}
>> +
>>
>> Â/* Insert object with reallocation
>> Â ÂT *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Integer
>> @@ -404,31 +845,70 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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))
>> + Â Â Â (VEC_safe_insert_1<T, A> (&(V),I,O VEC_CHECK_INFO MEM_STAT_INFO))
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline void
>> +VEC_safe_insert_1 (vec_t<T> **vec_, unsigned ix_, T obj_
>> + Â Â Â Â Â Â Â Â ÂVEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + ÂVEC_reserve_1<T, A> (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);
>> + ÂVEC_quick_insert_1 (*vec_, ix_, obj_ VEC_CHECK_PASS);
>> +}
>> +
>> +template<typename T, enum vec_allocation_t A>
>> +static inline void
>> +VEC_safe_insert_1 (vec_t<T> **vec_, unsigned ix_, T *ptr_
>> + Â Â Â Â Â Â Â Â ÂVEC_CHECK_DECL MEM_STAT_DECL)
>> +{
>> + ÂVEC_reserve_1<T, A> (vec_, 1 VEC_CHECK_PASS PASS_MEM_STAT);
>> + ÂVEC_quick_insert_1 (*vec_, ix_, ptr_ VEC_CHECK_PASS);
>> +}
>> +
>> +
>>
>> Â/* 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); // Integer
>> + Â void 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. Â*/
>> + Â remaining elements is preserved. Â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))
>> + Â Â Â (VEC_ordered_remove_1<T> (V,I VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_ordered_remove_1 (vec_t<T> *vec_, unsigned ix_ VEC_CHECK_DECL)
>> +{
>> + ÂT *slot_;
>> + ÂVEC_ASSERT (ix_ < vec_->prefix.num, "remove", T, base);
>> + Âslot_ = &vec_->vec[ix_];
>> + Âmemmove (slot_, slot_ + 1, (--vec_->prefix.num - ix_) * sizeof (T));
>> +}
>> +
>>
>> Â/* 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); // Integer
>> + Â void 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. Â*/
>> + Â Remove an element from the IXth position of V. ÂOrdering of
>> + Â remaining elements is destroyed. Â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))
>> + Â Â Â (VEC_unordered_remove_1<T> (V,I VEC_CHECK_INFO))
>> +
>> +template<typename T>
>> +static inline void
>> +VEC_unordered_remove_1 (vec_t<T> *vec_, unsigned ix_ VEC_CHECK_DECL)
>> +{
>> + ÂVEC_ASSERT (ix_ < vec_->prefix.num, "remove", T, base);
>> + Âvec_->vec[ix_] = vec_->vec[--vec_->prefix.num];
>> +}
>> +
>>
>> Â/* Remove a block of elements
>> Â Âvoid VEC_T_block_remove (VEC(T) *v, unsigned ix, unsigned len);
>> @@ -437,22 +917,27 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â ÂThis is an O(N) operation due to memmove. Â*/
>>
>> Â#define VEC_block_remove(T,V,I,L) Â Â Â\
>> - Â Â Â (VEC_OP(T,base,block_remove)(VEC_BASE(V),I,L VEC_CHECK_INFO))
>> + Â Â Â (VEC_block_remove_1<T> (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. Â*/
>> +template<typename T>
>> +static inline void
>> +VEC_block_remove_1 (vec_t<T> *vec_, unsigned ix_, unsigned len_ VEC_CHECK_DECL)
>> +{
>> + ÂT *slot_;
>> + ÂVEC_ASSERT (ix_ + len_ <= vec_->prefix.num, "block_remove", T, base);
>> + Âslot_ = &vec_->vec[ix_];
>> + Âvec_->prefix.num -= len_;
>> + Âmemmove (slot_, slot_ + len_, (vec_->prefix.num - ix_) * sizeof (T));
>> +}
>>
>> -#define VEC_address(T,V) Â Â Â Â Â Â Â (VEC_OP(T,base,address)(VEC_BASE(V)))
>>
>> Â/* Conveniently sort the contents of the vector with qsort.
>> Â Âvoid VEC_qsort (VEC(T) *v, int (*cmp_func)(const void *, const void *)) Â*/
>>
>> -#define VEC_qsort(T,V,CMP) qsort(VEC_address (T,V), VEC_length(T,V), Â \
>> +#define VEC_qsort(T,V,CMP) qsort(VEC_address (T, V), VEC_length (T, V), Â Â Â Â\
>> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (T), CMP)
>>
>> +
>> Â/* 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
>> @@ -465,944 +950,140 @@ along with GCC; see the file COPYING3. ÂIf not see
>> Â Â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
>> -/* Avoid problems with frontends that #define free(x). Â*/
>> -#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_lower_bound(T,V,O,LT) Â Â Â\
>> + Â Â Â Â(VEC_lower_bound_1<T> (V, O, LT VEC_CHECK_INFO))
>>
>> -#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. Â*/
>> -
>> -typedef struct GTY(()) vec_prefix
>> +template<typename T>
>> +static inline unsigned
>> +VEC_lower_bound_1 (vec_t<T> *vec_, T obj_,
>> + Â Â Â Â Â Â Â Â Âbool (*lessthan_)(T, T) VEC_CHECK_DECL)
>> Â{
>> - Âunsigned num;
>> - Âunsigned alloc;
>> -} vec_prefix;
>> -
>> -#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) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âstruct vec_prefix prefix; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂT vec[1]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} VEC(T,B)
>> -
>> -#define VEC_T_GTY(T,B) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -typedef struct GTY(()) VEC(T,B) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âstruct vec_prefix prefix; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂT GTY ((length ("%h.prefix.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. Â*/
>> -#if GCC_VERSION >= 4000
>> -#define VEC_BASE(P) \
>> - Â((offsetof (__typeof (*P), base) == 0 || (P)) ? &(P)->base : 0)
>> -#else
>> -#define VEC_BASE(P) Â((P) ? &(P)->base : 0)
>> -#endif
>> -
>> -/* 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_->prefix.num : 0; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline T VEC_OP (T,base,last) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (const VEC(T,base) *vec_ VEC_CHECK_DECL) Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂVEC_ASSERT (vec_ && vec_->prefix.num, "last", T, base); Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âreturn vec_->vec[vec_->prefix.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_->prefix.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_->prefix.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_->prefix.num = 0; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âvec_->prefix.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_->prefix.alloc - vec_->prefix.num >= (unsigned)alloc_ : !alloc_; Â Â \
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline void VEC_OP(T,base,splice) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (VEC(T,base) *dst_, VEC(T,base) *src_ VEC_CHECK_DECL) Â Â Â Â Â Â Â \
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âif (src_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Âunsigned len_ = src_->prefix.num; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â ÂVEC_ASSERT (dst_->prefix.num + len_ <= dst_->prefix.alloc, "splice", T, base); Â Â \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â Âmemcpy (&dst_->vec[dst_->prefix.num], &src_->vec[0], len_ * sizeof (T)); Â \
>> - Â Â Âdst_->prefix.num += len_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline T *VEC_OP (T,base,quick_push) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â (VEC(T,base) *vec_, T obj_ VEC_CHECK_DECL) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂT *slot_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - ÂVEC_ASSERT (vec_->prefix.num < vec_->prefix.alloc, "push", T, base); Â Â Â Â Â \
>> - Âslot_ = &vec_->vec[vec_->prefix.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_->prefix.num, "pop", T, base); Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âobj_ = vec_->vec[--vec_->prefix.num]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âreturn obj_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline void VEC_OP (T,base,truncate) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â (VEC(T,base) *vec_, unsigned size_ VEC_CHECK_DECL) Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂVEC_ASSERT (vec_ ? vec_->prefix.num >= size_ : !size_, "truncate", T, base); Â \
>> - Âif (vec_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Âvec_->prefix.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_->prefix.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_->prefix.num < vec_->prefix.alloc, "insert", T, base); Â Â Â Â Â Â Â Â \
>> - ÂVEC_ASSERT (ix_ <= vec_->prefix.num, "insert", T, base); Â Â Â Â Â Â Â Â Â Â Â \
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âmemmove (slot_ + 1, slot_, (vec_->prefix.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_->prefix.num, "remove", T, base); Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âobj_ = *slot_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âmemmove (slot_, slot_ + 1, (--vec_->prefix.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_->prefix.num, "remove", T, base); Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âobj_ = *slot_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â*slot_ = vec_->vec[--vec_->prefix.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_->prefix.num, "block_remove", T, base); Â Â Â Â Â\
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âvec_->prefix.num -= len_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âmemmove (slot_, slot_ + len_, (vec_->prefix.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); Â Â Â Â Â\
>> + Âunsigned int len_ = VEC_length (T, 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_index_1 (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_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_->prefix.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.prefix.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_)->prefix.num : 0) \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS PASS_MEM_STAT); Â Â Â Â Â Â Â\
>> - ÂVEC_BASE (*vec_)->prefix.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 void VEC_OP(T,A,safe_splice) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (VEC(T,A) **dst_, VEC(T,base) *src_ VEC_CHECK_DECL MEM_STAT_DECL) Â \
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âif (src_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -   ÂVEC_OP (T,A,reserve_exact) (dst_, src_->prefix.num             \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS MEM_STAT_INFO); Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â ÂVEC_OP (T,base,splice) (VEC_BASE (*dst_), src_ Â Â Â Â Â Â Â Â Â Â \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS); Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -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_->prefix.num : 0; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline T *VEC_OP (T,base,last) (VEC(T,base) *vec_ VEC_CHECK_DECL) Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂVEC_ASSERT (vec_ && vec_->prefix.num, "last", T, base); Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âreturn &vec_->vec[vec_->prefix.num - 1]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline T *VEC_OP (T,base,index) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (VEC(T,base) *vec_, unsigned ix_ VEC_CHECK_DECL) Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂVEC_ASSERT (vec_ && ix_ < vec_->prefix.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_->prefix.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_->prefix.num = 0; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âvec_->prefix.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_->prefix.alloc - vec_->prefix.num >= (unsigned)alloc_ : !alloc_; Â Â \
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline void VEC_OP(T,base,splice) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (VEC(T,base) *dst_, VEC(T,base) *src_ VEC_CHECK_DECL) Â Â Â Â Â Â Â \
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âif (src_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Âunsigned len_ = src_->prefix.num; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â ÂVEC_ASSERT (dst_->prefix.num + len_ <= dst_->prefix.alloc, "splice", T, base); Â Â \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â Âmemcpy (&dst_->vec[dst_->prefix.num], &src_->vec[0], len_ * sizeof (T)); Â \
>> - Â Â Âdst_->prefix.num += len_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline T *VEC_OP (T,base,quick_push) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â (VEC(T,base) *vec_, const T *obj_ VEC_CHECK_DECL) Â Â Â Â Â Â Â Â Â \
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂT *slot_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - ÂVEC_ASSERT (vec_->prefix.num < vec_->prefix.alloc, "push", T, base); Â Â Â Â Â \
>> - Âslot_ = &vec_->vec[vec_->prefix.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_->prefix.num, "pop", T, base); Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â--vec_->prefix.num; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -static inline void VEC_OP (T,base,truncate) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â (VEC(T,base) *vec_, unsigned size_ VEC_CHECK_DECL) Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - ÂVEC_ASSERT (vec_ ? vec_->prefix.num >= size_ : !size_, "truncate", T, base); Â \
>> - Âif (vec_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Âvec_->prefix.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_->prefix.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_->prefix.num < vec_->prefix.alloc, "insert", T, base); Â Â Â Â Â Â Â Â \
>> - ÂVEC_ASSERT (ix_ <= vec_->prefix.num, "insert", T, base); Â Â Â Â Â Â Â Â Â Â Â \
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âmemmove (slot_ + 1, slot_, (vec_->prefix.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_->prefix.num, "remove", T, base); Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âmemmove (slot_, slot_ + 1, (--vec_->prefix.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_->prefix.num, "remove", T, base); Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âvec_->vec[ix_] = vec_->vec[--vec_->prefix.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_->prefix.num, "block_remove", T, base); Â Â Â Â Â\
>> - Âslot_ = &vec_->vec[ix_]; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Âvec_->prefix.num -= len_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âmemmove (slot_, slot_ + len_, (vec_->prefix.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_; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> +template<typename T>
>> +static inline unsigned
>> +VEC_lower_bound_1 (vec_t<T> *vec_, const T *ptr_,
>> + Â Â Â Â Â Â Â Â Âbool (*lessthan_)(const T*, const T*) VEC_CHECK_DECL)
>> +{
>> + Âunsigned int len_ = VEC_length (T, 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_index_1 (vec_, middle_ VEC_CHECK_PASS);
>> + Â Â Âif (lessthan_ (middle_elem_, ptr_))
>> + Â Â Â {
>> + Â Â Â Â 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_->prefix.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.prefix.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_)->prefix.num : 0) \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS PASS_MEM_STAT); Â Â Â Â Â Â Â\
>> - ÂVEC_BASE (*vec_)->prefix.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 void VEC_OP(T,A,safe_splice) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (VEC(T,A) **dst_, VEC(T,base) *src_ VEC_CHECK_DECL MEM_STAT_DECL) Â \
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âif (src_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -   ÂVEC_OP (T,A,reserve_exact) (dst_, src_->prefix.num             \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS MEM_STAT_INFO); Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â ÂVEC_OP (T,base,splice) (VEC_BASE (*dst_), src_ Â Â Â Â Â Â Â Â Â Â \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS); Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -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); Â Â Â Â Â Â Â Â Â \
>> -}
>> +void *vec_heap_o_reserve_1 (void *, int, size_t, size_t, bool MEM_STAT_DECL);
>> +void *vec_gc_o_reserve_1 (void *, int, size_t, size_t, bool MEM_STAT_DECL);
>>
>> -#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); Â Â Â Â Â Â Â Â Â Â Â Â \
>> -}
>> +/* Ensure there are at least RESERVE free slots in VEC_, growing
>> + Â exponentially. ÂIf RESERVE < 0 grow exactly, else grow
>> + Â exponentially. ÂAs a special case, if VEC_ is NULL, and RESERVE is
>> + Â 0, no vector will be created. */
>>
>> -#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_->prefix.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.prefix.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_)->prefix.num : 0) \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS PASS_MEM_STAT); Â Â Â Â Â Â Â\
>> - ÂVEC_BASE (*vec_)->prefix.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 void VEC_OP(T,A,safe_splice) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â (VEC(T,A) **dst_, VEC(T,base) *src_ VEC_CHECK_DECL MEM_STAT_DECL) Â \
>> -{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Âif (src_) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â{ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -   ÂVEC_OP (T,A,reserve_exact) (dst_, src_->prefix.num             \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS MEM_STAT_INFO); Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> - Â Â ÂVEC_OP (T,base,splice) (VEC_BASE (*dst_), src_ Â Â Â Â Â Â Â Â Â Â \
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â VEC_CHECK_PASS); Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> -} Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
>> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \
>> -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); Â Â Â Â Â Â Â Â Â \
>> +template<typename T, enum vec_allocation_t A>
>> +vec_t<T> *
>> +vec_reserve (vec_t<T> *vec_, int reserve MEM_STAT_DECL)
>> +{
>> + Âif (A == gc)
>> + Â Âreturn (vec_t<T> *) vec_gc_o_reserve_1 (vec_, reserve,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â offsetof (vec_t<T>, vec),
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (T), false
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PASS_MEM_STAT);
>> + Âelse if (A == heap)
>> + Â Âreturn (vec_t<T> *) vec_heap_o_reserve_1 (vec_, reserve,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â offsetof (vec_t<T>, vec),
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (T), false
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PASS_MEM_STAT);
>> + Âelse
>> + Â Â{
>> + Â Â Â/* Only allow stack vectors when re-growing them. ÂThe initial
>> + Â Â Â Âallocation of stack vectors must be done with the
>> + Â Â Â ÂVEC_stack_alloc macro, because it uses alloca() for the
>> + Â Â Â Âallocation. Â*/
>> + Â Â Âif (vec_ == NULL)
>> + Â Â Â {
>> + Â Â Â Â fprintf (stderr, "Stack vectors must be initially allocated "
>> + Â Â Â Â Â Â Â Â Â"with VEC_stack_alloc.\n");
>> + Â Â Â Â gcc_unreachable ();
>> + Â Â Â }
>> + Â Â Âreturn (vec_t<T> *) vec_stack_o_reserve (vec_, reserve,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âoffsetof (vec_t<T>, vec),
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (T) PASS_MEM_STAT);
>> + Â Â}
>> Â}
>>
>> -/* 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.
>> +/* Ensure there are at least RESERVE free slots in VEC_, growing
>> + Â exactly. ÂIf RESERVE < 0 grow exactly, else grow exponentially. ÂAs
>> + Â a special case, if VEC_ is NULL, and RESERVE is 0, no vector will be
>> + Â created. */
>>
>> - Â 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); Â \
>> +template<typename T, enum vec_allocation_t A>
>> +vec_t<T> *
>> +vec_reserve_exact (vec_t<T> *vec_, int reserve MEM_STAT_DECL)
>> +{
>> + Âif (A == gc)
>> + Â Âreturn (vec_t<T> *) vec_gc_o_reserve_1 (vec_, reserve,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (struct vec_prefix),
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (T), true
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PASS_MEM_STAT);
>> + Âelse if (A == heap)
>> + Â Âreturn (vec_t<T> *) vec_heap_o_reserve_1 (vec_, reserve,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (struct vec_prefix),
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof (T), true
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PASS_MEM_STAT);
>> + Âelse if (A == stack)
>> + Â Â{
>> + Â Â Â/* Only allow stack vectors when re-growing them. ÂThe initial
>> + Â Â Â Âallocation of stack vectors must be done with VEC_alloc,
>> + Â Â Â Âbecause it uses alloca() for the allocation. Â*/
>> + Â Â Âif (vec_ == NULL)
>> + Â Â Â {
>> + Â Â Â Â fprintf (stderr, "Stack vectors must be initially allocated "
>> + Â Â Â Â Â Â Â Â Â"with VEC_stack_alloc.\n");
>> + Â Â Â Â gcc_unreachable ();
>> + Â Â Â }
>> + Â Â Âreturn (vec_t<T> *) vec_stack_o_reserve_exact (vec_, reserve,
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (struct vec_prefix),
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âsizeof (T)
>> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPASS_MEM_STAT);
>> + Â Â}
>> Â}
>>
>> Â#endif /* GCC_VEC_H */
>>
>> --
>> This patch is available for review at http://codereview.appspot.com/6233044

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]